Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
savad
Member

Откуда:
Сообщений: 11
Форумчане подскажите, пожалуйста, возможен ли вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view. В англицком не селен из BOL понял, что если в INSTEAD OF UPDATE сделать UPDATE этого же view, то UPDATE будет отработан, так как будто нет INSTEAD OF UPDATE. Но у меня вроде ситуация несколько иная, хотя судя по возникающей ошибки тоже (нет INSTEAD OF DELETE).

create table test (id int)
go

create view vw_test as
select cast (t1.id as int) as id
from 
    test t1  join test t2 on t1.id = t2.id    
go 

create trigger tI_test on vw_test
    instead of insert
as
begin
    return
end
go

create trigger tD_test on vw_test
    instead of delete
as
begin
    return
end
go


create trigger tU_test on vw_test
    instead of update
as
begin
    delete from vw_test
    return
end
go

update vw_test set id = id

MSSQL

Server: Msg 4405, Level 16, State 1, Procedure tU_test, Line 8
View or function 'vw_test' is not updatable because the modification affects multiple base tables.
2 дек 05, 19:58    [2137254]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
Glory
Member

Откуда:
Сообщений: 104760
Команда delete from vw_test не будет работать хоть откуда.
Потому что "the modification affects multiple base tables"
Придется явно написать в триггере из какой таблицы что вы хотите удалить
2 дек 05, 20:08    [2137280]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
savad
Member

Откуда:
Сообщений: 11
Glory

Команда delete from vw_test не будет работать хоть откуда.

почему? вот
create table test (id int)
go

create view vw_test as
select cast (t1.id as int) as id
from 
    test t1  join test t2 on t1.id = t2.id    
go 

create trigger tI_test on vw_test
    instead of insert
as
begin
    return
end
go

create trigger tD_test on vw_test
    instead of delete
as
begin
    print '!! delete'
    return
end
go

create trigger tU_test on vw_test
    instead of update
as
begin
    print '!! update'
    delete from vw_test
    return
end
go

delete from vw_test
MSSQL

!! delete

при выполнении инструкции
update vw_test set id = id
ожидал то что сначала отработает триггер INSTEAD OF UPDATE, а затем триггер INSTEAD OF DELETE для vw_test.
2 дек 05, 20:23    [2137313]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
Glory
Member

Откуда:
Сообщений: 104760
при выполнении инструкции
update vw_test set id = id

ожидал то что сначала отработает триггер INSTEAD OF UPDATE, а затем триггер INSTEAD OF DELETE для vw_test.

С чего это ? Не бывает вложенных INSTEAD OF триггеров. Читайте теорию
2 дек 05, 20:26    [2137319]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
savad
Member

Откуда:
Сообщений: 11
Glory
Не бывает вложенных INSTEAD OF триггеров. Читайте теорию

да но в BOL или такой пример, говорится о триггерах одного типа
BOL

If an INSTEAD OF trigger defined on a view executes a statement against the view that would usually fire the INSTEAD OF trigger again, it is not called recursively. Instead, the statement is resolved as modifications against the base tables underlying the view. In this case, the view definition must meet all of the restrictions for an updatable view. For a definition of updatable views, see Modifying Data Through a View. For example, if a DML trigger is defined as an INSTEAD OF UPDATE trigger for a view, and the trigger executes an UPDATE statement referencing the same view, the UPDATE statement executed by the INSTEAD OF trigger does not call the trigger again. The UPDATE executed by the trigger is processed against the view as if the view did not have an INSTEAD OF trigger. The columns changed by the UPDATE must be resolved to a single base table. Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

вызов UPDATE из UDADTE это рекурсия понятно, а вызов DELETE из UPDATE разве это рекурсивный вызов?
2 дек 05, 20:40    [2137358]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
Glory
Member

Откуда:
Сообщений: 104760
вызов UPDATE из UDADTE это рекурсия понятно, а вызов DELETE из UPDATE разве это рекурсивный вызов?
В предложении

If an INSTEAD OF trigger defined on a view executes a statement against the view that would usually fire the INSTEAD OF trigger again, it is not called recursively.

нет никакого упоминания про операцию триггера.
Оно гласит, что при вызове внутри INSTEAD OF триггера команды, обращающейся к тому же представлению, никаких других INSTEAD OF триггеров запущено больше не будет. Все
2 дек 05, 20:49    [2137391]     Ответить | Цитировать Сообщить модератору
 Re: Вызов триггера INSTEAD OF DELETE из INSTEAD OF UPDATE для view  [new]
savad
Member

Откуда:
Сообщений: 11
2 Glory
Спасибо!
2 дек 05, 22:14    [2137628]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить