Вставка / обновление данных в таблицу при воссоздании таблицы в другой базе данных - PullRequest
0 голосов
/ 08 июля 2020

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

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

Пример: база данных A имеет report.table1, который воссоздается каждый раз, когда отчет бежал из софта. Я хотел бы переместить данные из report.table1, когда они воссоздаются в базе данных B, в dbo.table2

, пока у меня есть этот триггер, но, поскольку он относится только к этой таблице, он удаляется каждый раз Я думаю:

CREATE TRIGGER updatetbl2
ON [report].[table1]
AFTER UPDATE,INSERT
AS 
BEGIN
    INSERT INTO databaseB.dbo.table2 
        SELECT *
        FROM [databaseA].[report].[table1]
END;  

Есть ли способ добиться этого? Сообщите мне, если я пропустил какую-либо часть проблемы, и я могу предоставить более подробную информацию.

1 Ответ

2 голосов
/ 09 июля 2020

Что ж, комментарий Алекса правильный - вы можете создать триггер DDL для этой таблицы, которая будет удалена и воссоздана заново.

Уловка здесь в том, что этот триггер DDL должен использовать динамику c 1 SQL для создания триггера DML, который вы уже написали (Кстати, я предлагаю вам провести небольшое исследование таблиц inserted и deleted , если вы ' (вы собираетесь писать триггеры DML).

Затем, всякий раз, когда создается таблица, также будет создаваться ваш триггер DML.

Что-то вроде этого должно помочь вам:

CREATE TRIGGER Report_Table1_CreateTable
ON DATABASE   
FOR CREATE_TABLE
AS   
BEGIN  
    DECLARE @Sql nvarchar(4000) = 
    '
    CREATE TRIGGER updatetbl2
    ON [report].[table1]
    AFTER UPDATE,INSERT
    AS 
    BEGIN
        INSERT INTO databaseB.dbo.table2 
            SELECT *
            FROM [databaseA].[report].[table1]
    END;  
    '
  
    IF EXISTS(
        SELECT 1
        WHERE EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname') = 'table1'
        AND EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','sysname') = 'report'
    )
    EXEC(@Sql)
END;

1 На самом деле это не динамика c, но поскольку вы не можете выполнить create trigger непосредственно внутри другого create trigger, вы должны использовать exec(), чтобы сделать это ...

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