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

Можно ли создать триггер в базе данных, который вводит ТОЛЬКО строку, которую кто-то редактировал в новой таблице. Скажем, в 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

person AdamGIS    schedule 18.06.2020    source источник
comment
Возможный дубликат триггера stackoverflow.com/questions/12462300/   -  person XraySensei    schedule 18.06.2020
comment
Триггеры сильно зависят от поставщика, поэтому добавьте тег, чтобы указать, используете ли вы mysql, postgresql, sql-server, oracle или db2 - или что-то совсем другое.   -  person marc_s    schedule 18.06.2020
comment
Извини за это. Это SQL Server   -  person AdamGIS    schedule 18.06.2020
comment
Взгляните на Вставленные и удаленные псевдотаблицы.   -  person Dale K    schedule 18.06.2020
comment
В зависимости от вашей версии SQL-сервера вы можете обнаружить, что использование собственных темпоральных таблиц SQL делает именно то, что вы ищете, и многое другое. Проверьте это здесь: docs.microsoft.com/en-us/sql/relational-databases/tables/   -  person Critical Error    schedule 18.06.2020


Ответы (1)


В соответствии с вашим требованием вы можете использовать динамический 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

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

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS 


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

END
GO
person KumarHarsh    schedule 19.06.2020