2017-03-08 3 views
0

Ich habe eine Abfrage, dass ich die Datenbanken aus den sys.databases mit den Auslösern auswählen kann, die ich aktualisieren möchte. Von dort kann ich einen Cursor erstellen. Wenn ich jedoch in den Cursor gehe, um meine Trigger mit einem dynamischen Datenbanknamen @DatabaseExecuteName zu aktualisieren, der auf MyDatabaseName.dbo gesetzt ist, erhalte ich den Fehler ''CREATE/ALTER TRIGGER' does not allow specifying the database name as a prefix to the object name.' Da ich in einem Cursor bin, kann ich keine USE MyDatabaseName ... GO ausführen, die GO-Anweisung ist nicht erlaubt im CURSOR. Ich habe versucht SQLCMD MODE :setvar DatabaseName "MyDatabaseName" mit USE [$(DatabaseName)]; zu versuchen, um die Verwendung der Datenbank zu setzen. Ich fühle mich sehr nah, aber meine Stärke ist nicht SQL-Abfragen. Ich könnte etwas Hilfe bei dem verwenden, was mir fehlt.Wie aktualisiere ich Trigger für mehrere Datenbanken?

+0

Sehen Sie sich dynamisches SQL an und verwenden Sie 'USE ' am Anfang. – Jens

+0

Ja, sogar mit dynamischen SQL gibt es mir das gleiche Problem. Eine Select-Anweisung funktioniert, aber der Trigger erlaubt es mir nicht, die 'MyDatabaseName.dbo' vor dem Trigger-Objekt zu bilden. Und der dynamische SQL zeigt, dass ich den korrekten Datenbanknamen verwende. Ich habe sogar meine Abfrage als 'USE [MyDatabaseName]' mit einer ExecSQL-Anweisung in der Abfrage definiert. Immer noch sehe ich den Fehler, der Trigger existiert nicht. Wenn ich in den Cursor gehe, erhalte ich einen Fehler in der Nähe der 'go' Anweisung. – JabberwockyDecompiler

Antwort

1

Sie können EXEC Anrufe verschachteln, so dass Sie eine USE verwenden können und dann eine weitere Anweisung ausführen, und Sie müssen GO nicht verwenden, um die Stapel zu trennen. Dies ist ein komplettes Skript, um die Technik zu demonstrieren:

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 

die dann zeigt, dass diese Verbindung noch in der DB1 Datenbank vorhanden ist, aber der Auslöser wurde erfolgreich in der DB2 Datenbank auf die T1 Tabelle erstellt.

Worauf Sie achten müssen ist, dass Ihre Quote-Escaping korrekt ist.

+0

Das ist es, Danke für das Beispiel. – JabberwockyDecompiler