当 table 在另一个数据库中重新创建时 Insert/Update 数据到 table

Insert/Update data to table when table recreated in another database

所以我们使用的软件基本上是通过从数据库中删除 table(如果存在)然后用相同的名称重新创建它然后将数据插入其中来创建报告。

我正在尝试在软件数据库中创建一个触发器,它会在重新创建数据时从 table 移动数据并将其附加到另一个数据库中的另一个 table。

示例:数据库 A 有报告。table1 每次从软件 运行 重新创建报告。我想将数据从 report.table1 重新创建到数据库 B 时移动到 dbo.table2

到目前为止我有这个触发器,但由于它只与那个 table 相关,所以每次我想到它都会被删除:

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

有什么办法可以实现吗?如果我遗漏了问题的任何部分,请告诉我,我可以提供更多详细信息。

好吧,Alex 的评论是正确的 - 您可以为 table 创建一个 DDL trigger,它会被删除并重新创建。

这里的技巧是这个 DDL 触发器应该使用 dynamic1 SQL 来创建你已经写过的 DML 触发器(顺便说一句,我建议你做一些如果您要编写 DML 触发器,请研究 inserted and deleted tables

然后,每当创建 table 时,您的 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它不是真正的动态但是因为你不能直接在另一个create trigger里面执行一个create trigger,你必须使用exec() 去做...