T-SQL: создать триггер, чтобы копировать новые столбцы из одной таблицы в другую и увеличивать нет - PullRequest
0 голосов
/ 21 мая 2019

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

CREATE TRIGGER AddReTncyTransStatement 
ON [DBAdmin].[dbo].[ReTncyTransStatement]
AFTER UPDATE, INSERT 
AS
BEGIN
    INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
                ([ORG-CODE], [TNCY-SYS-REF], [TRANS-NO], [PROGRESS-RECID])
        SELECT        
            [ORG-CODE],
            [TNCY-SYS-REF],
            [TRANS-NO],
            [ANALYSIS-CODE] ``,
            (SELECT MAX([PROGRESS-RECID]) 
             FROM [DBAdmin].[dbo].[ReTncyTransStatement]) + 1 AS RECID
        FROM            
            [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
END;

1 Ответ

1 голос
/ 21 мая 2019

Я предполагаю, что у вас есть таблица с именем [RE-TNCY-TRANS], которая находится в базе данных [SQLViewsPro2EOD], и другая таблица, которая [ReTncyTransStatement], которая находится в базе данных [DBAdmin].

Я также представляю, что выхотите вставить запись в [ReTncyTransStatement] каждый раз, когда запись вставляется в [RE-TNCY-TRANS].Поэтому для достижения этого вам нужно переписать свой триггер, как показано ниже:

CREATE TRIGGER AddReTncyTransStatement
ON [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
AFTER UPDATE, INSERT
AS
BEGIN
    INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
    (
        [ORG-CODE],
        [TNCY-SYS-REF],
        [TRANS-NO],
        [PROGRESS-RECID]
    )
    SELECT [ORG-CODE],
           [TNCY-SYS-REF],
           [TRANS-NO],
           ISNULL((
               SELECT MAX([PROGRESS-RECID]) FROM [DBAdmin].[dbo].[ReTncyTransStatement]
           ),0) + 1 AS RECID
    FROM Inserted;
END;

Обновление

Почему я использовал функцию ISNULL?

Потому что в первый раз в таблице [DBAdmin].[dbo].[ReTncyTransStatement] нет записи, поэтому MAX([PROGRESS-RECID]) будет NULL.Я использовал ISNULL, чтобы справиться с этой ситуацией.

Почему я использовал inserted?

Согласно документам Microsoft:

Вставленная таблица хранит копии затронутых строк во время операторов INSERT и UPDATE.Во время транзакции вставки или обновления новые строки добавляются как во вставленную таблицу, так и в таблицу триггеров.Строки во вставленной таблице являются копиями новых строк в таблице триггеров.

Подробнее здесь: https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables?view=sql-server-2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...