如何更新多个数据库中的触发器?
我有一个查询,我可以从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,GO语句是不允许在CURSOR内部。我尝试使用SQLCMD模式:setvar DatabaseName "MyDatabaseName"
和USE [$(DatabaseName)];
尝试设置使用数据库。我觉得我非常接近,但我的实力不是SQL查询。我可以使用一些我缺少的帮助。如何更新多个数据库中的触发器?
您可以嵌套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
数据库,但是触发成功的DB2
数据库中的表T1
创建。
你必须注意的是让你的报价逃避正确。
这样做,谢谢你的例子。 – JabberwockyDecompiler
查看动态SQL并在开始时使用'USE'。 –
Jens
即使使用动态SQL,它也给我提出了同样的问题。 select语句可以工作,但触发器不允许我在触发器对象之前形成'MyDatabaseName.dbo'。动态SQL确实表明我使用了正确的数据库名称,甚至在查询中使用ExecSQL语句形成了'USE [MyDatabaseName]'查询。我仍然看到错误,触发器不存在。如果我放置在光标内,我会在'go'语句附近收到错误。 – JabberwockyDecompiler