Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно написать триггер на обновление для вьюшки?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1403
вьюшка такого вида:
CREATE VIEW [dbo].[VObjHuman]
AS
SELECT        dbo.ObjHuman.ObjectID, dbo.ObjHuman.FirstName, dbo.ObjHuman.MiddleName, dbo.ObjHuman.LastName, dbo.ObjHuman.SexID, dbo.ObjHuman.BirthDay, dbo.ObjHuman.BirthPlace, dbo.ObjHuman.NationalityID, 
                         dbo.ObjHuman.CitizenshipID, dbo.Object.ObjectNameID, dbo.Object.Qualify, dbo.Object.CreateDate, dbo.Object.ModifyDate, dbo.Object.Creator, dbo.Object.Editor
FROM            dbo.Object INNER JOIN
                         dbo.ObjHuman ON dbo.Object.ObjectID = dbo.ObjHuman.ObjectID

и вот делаю такой триггер на обновление:
CREATE TRIGGER [dbo].[updVObjHuman] ON [dbo].[VObjHuman]
instead of update
as 
begin
 set nocount on 
 update ObjHuman
 set ObjHuman.FirstName=Inserted.FirstName, 
     ObjHuman.MiddleName=Inserted.MiddleName, 
	 ObjHuman.LastName=Inserted.LastName, 
	 ObjHuman.SexID=Inserted.SexID, 
	 ObjHuman.BirthDay=Inserted.BirthDay, 
	 ObjHuman.BirthPlace=Inserted.BirthPlace, 
	 ObjHuman.NationalityID=Inserted.NationalityID, 
	 ObjHuman.CitizenshipID=Inserted.CitizenshipID
 from Inserted where ObjHuman.ObjectID = Inserted.ObjectID	  
 update Object
 set Object.Qualify=Inserted.Qualify, 
	 Object.ModifyDate=GetDate(), 
	 Object.Editor=system_user  
 from Inserted where Object.ObjectID = Inserted.ObjectID	   
end

И вот собственно ради двух строк:
Object.ModifyDate=GetDate(),
Object.Editor=system_user
я вынужден был описать все поля ибо никакой другой вариант триггера с такой вьюшкой работать не захотел. Это единственное решение в данном случае или есть более короткая и правильная альтернатива?
19 окт 18, 01:30    [21708353]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Ради двух строк достаточно было повесить after update триггер на ObjHuman с этими двумя строчками и даже не заморачиваться на представление.

Сообщение было отредактировано: 19 окт 18, 01:50
19 окт 18, 01:37    [21708354]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1403
Так ведь не сработает такой тригер при редактировании вьюшки.
19 окт 18, 02:24    [21708357]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1403
Смысл этой вьюшки в том, что она создает единое представление для данных разнесенных по двум таблицам, в одной таблице сами данные, а во второй дополнительная служебная информация, но для такой синхронной работы надо сделать триггер на представление, что я и пытаюсь сделать. Почему-то описание триггера вот в таком виде:
CREATE TRIGGER [dbo].[updVObjHuman] ON [dbo].[VObjHuman]
after update
as 
begin
 set nocount on 
 update VObjHuman
 set VObjHuman.ModifyDate=GetDate(), 
	 VObjHuman.Editor=system_user  
 from Inserted where VObjHuman.ObjectID = Inserted.ObjectID	 
end

дает ошибку:
Msg 8197, Level 16, State 6, Procedure updVObjHuman, Line 2 [Batch Start Line 9]
The object 'dbo.VObjHuman' does not exist or is invalid for this operation.
19 окт 18, 02:47    [21708362]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
aleks222
Member

Откуда:
Сообщений: 847
Страдалецъ
Смысл этой вьюшки в том, что она создает единое представление для данных разнесенных по двум таблицам, в одной таблице сами данные, а во второй дополнительная служебная информация, но для такой синхронной работы надо сделать триггер на представление, что я и пытаюсь сделать. Почему-то описание триггера вот в таком виде:
CREATE TRIGGER [dbo].[updVObjHuman] ON [dbo].[VObjHuman]
after update
as 
begin
 set nocount on 
 update VObjHuman
 set VObjHuman.ModifyDate=GetDate(), 
	 VObjHuman.Editor=system_user  
 from Inserted where VObjHuman.ObjectID = Inserted.ObjectID	 
end

дает ошибку:
Msg 8197, Level 16, State 6, Procedure updVObjHuman, Line 2 [Batch Start Line 9]
The object 'dbo.VObjHuman' does not exist or is invalid for this operation.


Дык, страдалец, нафега ты в триггере саму View обновляешь?
Так не пойдет.
Рекурсия недопустима.
19 окт 18, 05:42    [21708376]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
"Перечислять все поля" надо не "ради двух строк", а чтобы обновление через представление работало. Чтобы сделать аудит, представление не нужно.

Сообщение было отредактировано: 19 окт 18, 10:42
19 окт 18, 10:42    [21708613]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер на обновление для вьюшки?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1403
Хотел попробовать ограничится одним триггером для вьюшки, но видимо придется все-же писать как изначально хотел, для каждой таблицы свой триггер на обновление. Тогда получается все компактно и красиво. Пока все, всем спасибо.
19 окт 18, 11:46    [21708810]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить