Запутался в триггере SQL Server, который выполняет UPDATE (странный формат оператора UPDATE)
Суть моего вопроса - следующий стиль оператора UPDATE в триггере:
update ActualTableName
set X=Y
from inserted
Я бы подумал, что это синтаксическая ошибка... таблица "ActualTableName" не появляется в предложении "from".
Итак... это просто какой-то фанкий автоматический псевдоним "unwind" (то есть он знает, что "вставленный" является псевдонимом для ActualTableName? Это кажется маловероятным из-за более позднего запроса (см. Ниже).
Или... есть что-то еще... как запрос расширен до:
update ActualTableName
set X=Y
from ActualTableName
cross join inserted
Это также немного странно с более сложным UPDATE, который ссылается как на вставленные, так и на удаленные таблицы:
update ActualTableName
set [... some assignments ...]
from
inserted
left outer join deleted
on inserted.Id = deleted.Id
and inserted.SomeField > deleted.SomeField
where
inserted.Id <> ActualTableName.Id and
Этот запрос, по-видимому, обновляет записи в ActualTableName, которые не являются частью вставленной таблицы... и это заставляет меня думать, что фактический запрос:
update ActualTableName
set [... some assignments ...]
from
ActualTableName
cross jon inserted
left outer join deleted
on inserted.Id = deleted.Id
and inserted.SomeField > deleted.SomeField
where
inserted.Id <> ActualTableName.Id and
Книги в Интернете немного непрозрачны и говорят об этом:
Если обновляемый объект совпадает с объектом в предложении FROM, и в предложении FROM имеется только одна ссылка на объект, псевдоним объекта может указываться или не указываться. Если обновляемый объект появляется более одного раза в предложении FROM, один и только один, ссылка на объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.
Итак... кто-нибудь может дать ясность, что происходит?
1 ответ
Я не уверен, что вам известно о том факте, что Inserted или Deleted в вышеупомянутых запросах являются не псевдонимами, а специальными таблицами, используемыми сервером SQL для отслеживания вставки, обновления или удаления данных в триггерах. Вот больше информации: