2017-03-08 93 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

相關問題