2017-03-08 89 views
0

我有一个查询,我可以从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查询。我可以使用一些我缺少的帮助。如何更新多个数据库中的触发器?

+0

查看动态SQL并在开始时使用'USE '。 – Jens

+0

即使使用动态SQL,它也给我提出了同样的问题。 select语句可以工作,但触发器不允许我在触发器对象之前形成'MyDatabaseName.dbo'。动态SQL确实表明我使用了正确的数据库名称,甚至在查询中使用ExecSQL语句形成了'USE [MyDatabaseName]'查询。我仍然看到错误,触发器不存在。如果我放置在光标内,我会在'go'语句附近收到错误。 – JabberwockyDecompiler

回答

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数据库,但是触发成功的DB2数据库中的表T1创建。

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

+0

这样做,谢谢你的例子。 – JabberwockyDecompiler

相关问题