Question

J'utilise MS SQL 2008 et je veux créer un déclencheur dans une base de données est créée dynamique.

Création de la base de données est appelée dans une procédure stockée d'une autre base de données et fonctionne parfaitement, mais quand je veux ajouter un déclencheur ou une procédure stockée, l'exécution échoue.

Si je tente d'exécuter le SQL dynamiy avec un

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

Je reçois:

  

syntaxe incorrecte près de 'GO'

Et si je retire la « USE ... » le déclencheur sera créé dans la base de données erronée.

Y at-il une astuce pour éviter mes problèmes?

Thx

Était-ce utile?

La solution

"GO" est pas le langage T-SQL. Il est un mot-clé interprété par des outils clients comme SSMS comme séparateur de lots (qui signifie « envoyer du texte au serveur »).

Maintenant, CREATE TRIGGER doit être la première instruction du lot si la « USE dbname » ne peut pas utiliser.

Si vous mentionnez « USE dbnname » avant l'EXEC, il peut dans la base de données par défaut pour la connexion. Il faudrait tester (je ne peux pas maintenant, désolé)

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

Ou vous devrez utiliser sqlcmd ou osql pour se connecter et exécuter le code: cela vous permet de définir le contexte db sur la connexion. Pas dans T-SQL bien.

Ou vous pouvez essayer LOGIN xxx ALTER = dbname DEFAULT_DATABASE AvEC avant EXEC

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

Autres conseils

Vous pouvez changer la base de données avant d'appeler exec et revenir juste après:

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

Ou créer un serveur lié à la base de données droite, avec RPC enalbed et:

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

Ou créer un autre utilisateur qui a le catalogue par défaut dans la base de données où vous souhaitez créer le déclencheur et:

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

Pour créer une existence de référence valider puis modifier avec alter.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top