当 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()
去做...
所以我们使用的软件基本上是通过从数据库中删除 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()
去做...