Триггер, обновляющий другую таблицу только измененной строкой - PullRequest
0 голосов
/ 18 июня 2020

Возможно ли создать триггер в базе данных, который вводит ТОЛЬКО строку, которую кто-то редактировал в новой таблице. Скажем, в tbl1 кто-то изменил столбец с названием «имя». Я бы хотел взять отредактированную строку и поместить ее в tbl2. Поэтому я хотел бы взять некоторые другие столбцы из tbl1 только этой отредактированной строки и сохранить их в новой таблице. Я хочу отслеживать, когда было изменено имя, а также дату и время. Возможно ли это даже с триггером? Я понимаю, как настроить таблицу для триггерного события. Но мне трудно понять, как перенести значения из tbl1 в tbl2 без соединения.

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS  
IF UPDATE(name)
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    INSERT INTO tbl2 (ODID,ID2)
    VALUES ();
END
GO

1 Ответ

0 голосов
/ 19 июня 2020

В соответствии с вашими требованиями Вы можете использовать динамический c Sql внутри триггера.

Это просто идея,

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS 


BEGIN
    SET NOCOUNT ON;
    declare @Sql varchar(500)=''
    declare @Col varchar(500)=''

    IF UPDATE(FirstName)
    set @Col=' FirstName '
    IF UPDATE(LastName)
    set @Col=@Col+', LastName '

    set @Sql='INSERT INTO tbl2 (ODID,ID2)
    select '+@Col+' from inserted'

    sp_executesql @Sql

END
GO

Это очень громоздкий подход. Скорее создайте таблицу истории, которая будет репликой tbl1.

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS 


BEGIN
    SET NOCOUNT ON;
    insert into tbl1History
    select * from deleted

END
GO
...