如何跨多个数据库更新触发器?

时间:2017-03-08 15:14:44

标签: sql triggers

我有一个查询,我可以从sys.databases中选择我想要更新的触发器的数据库。从那里我可以创建一个游标。但是当我进入光标以使用设置为@DatabaseExecuteName的动态数据库名称MyDatabaseName.dbo更新我的触发器时,我收到错误''CREATE/ALTER TRIGGER' does not allow specifying the database name as a prefix to the object name.'因为我在光标中我无法执行USE MyDatabaseName ... GO,CURSOR中不允许使用GO语句。我已尝试使用:setvar DatabaseName "MyDatabaseName"的SQLCMD MODE USE [$(DatabaseName)];来尝试设置use数据库。我觉得我很亲密,但我的力量不是SQL查询。我可以在我缺少的东西上使用一些帮助。

1 个答案:

答案 0 :(得分:1)

您可以嵌套EXEC来电,以便您可以使用USE,然后执行进一步的声明,而您不需要使用GO来分隔批次。这是一个演示该技术的完整脚本:

create database DB1
go
create database DB2
go
use DB2
go
create table T1 (ID int not null)
go
create table T2 (ID int not null)
go
use DB1
go
exec('use DB2; exec(''create trigger T_T on T1 after insert as
                      insert into T2(ID) select i.ID from inserted i'')');
select DB_NAME()
insert into DB2..T1(ID) values (1),(2);
select * from DB2..T2

然后显示此连接仍在DB1数据库中,但在T1数据库中的DB2表上成功创建了触发器。

你必须注意的是让你的报价逃脱正确。