2013-07-18 4 views
0

Суть моего вопроса заключается в следующем стиле UPDATE заявление в триггере:Confused о триггера SQL Server, что делает UPDATE (странно формат UPDATE заявление)

update ActualTableName 
    set X=Y 
from inserted 

я бы подумал, что это синтаксис error ... таблица «ActualTableName» не появляется в предложении «from».

Итак ... это просто какая-то фанки автоматического псевдонима «Расслабиться» (т.е. он знает «вставить» является псевдонимом для 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 должны содержать псевдоним объекта .

Итак ... может ли кто-либо обеспечить ясность, как то, что происходит?

+0

ли первый UPDATE в вашем вопросе есть какие-то условия? Что следует за «и» в «более сложном представлении UPDATE» 'where'? Или, может быть, вы могли бы объяснить, с каким бизнес-правилом должен срабатывать триггер? Это может пролить свет на то, почему заявления выглядят так, как вы их видите (что может помочь объяснить, как они работают). –

ответ

-1

Я не уверен, что вы знаете о том, что вложенные или удаленные в вышеупомянутые запросы не являются псевдонимами, а специальными таблицами, используемыми SQL-сервером для отслеживания вставки, обновления или удаления данных в триггерах. Здесь больше информации:

http://msdn.microsoft.com/en-us/library/ms191300.aspx

+0

Эти запросы находятся в триггере ... так что да вставлено и удалено (обратите внимание, что правильный размер этих имен важен) являются специальными таблицами. если вы исследуете первый запрос на обновление, его неясно, почему вместо «insert» используется «ActualTableName». Если вы посмотрите на второй, более сложный запрос, мне очень неясно, к чему относится ActualTableName. Поставлен? Удаляется? Настоящий стол? Если реальная таблица связана с вставкой/удалением? Если он вставлен или удален, как он определяет, какой из них? – user505765

+0

Если мы поговорим о запросе, о котором вы упоминали ранее (обновите ActualTableName , установленный X = Y из вставленного), здесь пользователь пытается обновить столбец «X» таблицы «ActualTableName» значением, которое недавно было вставлено в таблица, на которой определяется триггер. – Sonam

 Смежные вопросы

  • Нет связанных вопросов^_^