Frage

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

Erstellen der Datenbank innerhalb einer gespeicherten Prozedur von einer anderen Datenbank aufgerufen und läuft perfekt, aber wenn ich einen Trigger oder eine gespeicherte Prozedur hinzufügen möchten, schlägt die Ausführung.

Wenn ich versuche, den dynamiy SQL mit einem auszuführen

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

ich:

  

Falsche Syntax in der Nähe von 'GO'

Und wenn ich das entfernen ‚USE ...‘ der Trigger in der falschen Datenbank erstellt werden.

Gibt es einen Trick, meine Probleme zu vermeiden?

Thx

War es hilfreich?

Lösung

"GO" ist nicht T-SQL-Sprache. Es ist ein Stichwort von Client-Tools wie SSMS als Batch-Separator interpretiert (das bedeutet "Text an den Server senden").

Nun, CREATE TRIGGER muss die erste Anweisung im Batch sein, so dass der "USE DB-Name" nicht verwendet.

Wenn Sie „USE dbnname“ vor dem EXEC erwähnen, dann kann es für die Verbindung in der Standard-Datenbank. Sie müßten testen (ich kann jetzt nicht, sorry)

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

oder Sie sqlcmd oder osql verwenden, um den Code zu verbinden und führen: dies ermöglicht es Ihnen, den db Kontext auf Verbindung zu setzen. Nicht innerhalb von T-SQL though.

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

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

Andere Tipps

Sie können die Datenbank wechseln, bevor exec aufrufen, und wechseln Sie wieder rechts nach:

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

oder einen verknüpften Server auf die rechte Seite Datenbank erstellen, mit RPC enalbed, und:

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

oder einen anderen Benutzer erstellen, die den Standardkatalog in der Datenbank, wo Sie den Auslöser erstellen möchten und:

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

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

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top