2009-05-25 6 views
0

Ich benutze MS SQL 2008 und ich möchte einen Trigger in einer Datenbank erstellen, die dynamisch erstellt wird.Erstellen einer Trigger-Dynamik

Das Erstellen der Datenbank wird innerhalb einer gespeicherten Prozedur einer anderen Datenbank aufgerufen und wird einwandfrei ausgeführt, aber wenn ich einen Trigger oder eine gespeicherte Prozedur hinzufügen möchte, schlägt die Ausführung fehl.

Wenn ich versuche, den dynamiy SQL mit einem

EXEC('USE dbase 
GO 
CREATE TRIGGER [blah] 
GO') 

zu laufen erhalte ich:

Falsche Syntax in der Nähe 'GO'

Und wenn ich die ‚Verwendung zu entfernen. .. 'wird der Trigger in der falschen Datenbank erstellt.

Gibt es einen Trick, um meine Probleme zu vermeiden?

Thx

Antwort

3

"GO" ist nicht T-SQL-Sprache. Es ist ein Schlüsselwort, das von Client-Tools wie SSMS als Stapeltrennzeichen interpretiert wird (das bedeutet "Text an Server senden").

Nun muss CREATE TRIGGER die erste Anweisung im Batch sein, damit der "USE dbname" nicht verwendet werden kann.

Wenn Sie "USE dbnname" vor dem EXEC angeben, wird es möglicherweise in der Standarddatenbank für die Verbindung angezeigt. Sie müssten testen (ich kann jetzt nicht, sorry)

--Might work 
USE dbase 
EXEC ('CREATE TRIGGER [blah] 
') 

Oder Sie sqlcmd oder osql verwenden müssen, um zu verbinden und den Code ausführen: dies ermöglicht es Ihnen, auf der Verbindung der db Kontext zu setzen . Nicht in T-SQL.

Oder Sie können LOGIN xxx ALTER mIT DEFAULT_DATABASE = dbname vor EXEC

ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname 
--Now the EXEC will connect to default db if above approach fails 
EXEC('CREATE TRIGGER [blah] 
') 
+0

Vielen Dank! Dieser hat mir geholfen! –

+0

Oder einfach so: 'EXECUTE dbase.sys.sp_sqlexec 'TRIGGER ERSTELLEN ...''. –

0

Sie versuchen, die Datenbank vor dem Aufruf von exec wechseln können, und wechseln Sie wieder rechts nach:

use newdb 
exec ('CREATE TRIGGER [blah] ...') 
use originaldb 

Oder ein verknüpftes erstellen Server auf die rechte Seite Datenbank, mit RPC enalbed, und:

EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName 

Oder einem anderen Benutzer erstellen th bei den Standardkatalog in der Datenbank, wo Sie den Auslöser erstellen möchten und:

EXECUTE AS LOGIN = 'UserName' 
EXEC ('CREATE TRIGGER [blah] ...') 
REVERT 
0

Um eine Referenz nur die Validierung Existenz und ändern Sie dann mit alter zu erstellen.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MiTrigger]') AND type in (N'TR')) 
    EXEC ('CREATE TRIGGER [MiTrigger] ON [dbo].[MiTabla] FOR DELETE AS SET NOCOUNT ON') 
GO