Domanda

Io uso MS SQL 2008 e voglio creare un trigger in un database che viene creato dinamica.

Creazione del database viene chiamata all'interno di una stored procedure di un altro database e funziona perfettamente, ma quando voglio aggiungere un trigger o una stored procedure, l'esecuzione non riesce.

Se provo a fare funzionare lo SQL dynamiy con una

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

ottengo:

  

la sintassi errata vicino 'GO'

E se mi tolgo la 'USO ...' il grilletto verrà creato nel database errato.

C'è un trucco per evitare i miei problemi?

Thx

È stato utile?

Soluzione

"GO" non è il linguaggio T-SQL. E 'una parola chiave interpretato da strumenti client come SSMS come un separatore batch (che significa "inviare il testo al server").

Ora, CREATE TRIGGER deve essere la prima istruzione del batch in modo che il "USE dbname" non può utilizzare.

Se si parla di "USO dbnname" prima del EXEC, allora può nel database predefinito per la connessione. Dovreste testare (non posso in questo momento, sorry)

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

In alternativa si dovrà utilizzare sqlcmd o osql per connettersi ed eseguire il codice: questo permette di impostare il contesto db sulla connessione. Non entro T-SQL però.

Oppure si può provare ALTER LOGIN xxx CON DEFAULT_DATABASE = dbname prima EXEC

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

Altri suggerimenti

È possibile cambiare il database prima di chiamare exec, e tornare subito dopo:

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

O creare un server collegato al database di destra, con enalbed RPC, e:

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

O creare un altro utente che ha il catalogo predefinito nel database in cui si desidera creare il grilletto e:

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

Per creare un riferimento esistere solo convalidare e quindi modificare con 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top