Pregunta

Yo uso de MS SQL 2008 y quiero crear un disparador en una base de datos creada dinámico.

La creación de la base de datos se llama dentro de un procedimiento almacenado de una base de datos y otra funciona perfectamente, pero cuando quiero añadir un disparador o un procedimiento almacenado, la ejecución falla.

Si trato de ejecutar el SQL dynamiy con un

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

Me sale:

  

sintaxis incorrecta cerca de 'GO'

Y si quito el 'uso ...' el gatillo se creará en la base de datos incorrecta.

¿Hay un truco para evitar mis problemas?

Thx

¿Fue útil?

Solución

"IR" no es el lenguaje T-SQL. Es una palabra clave interpretado por herramientas de cliente como SSMS como un separador de lotes (que significa "enviar mensajes de texto al servidor").

Ahora, CREATE TRIGGER debe ser la primera instrucción del lote por lo que el "nombredb USO" no se puede utilizar.

Si usted menciona "dbnname USO" antes de que el EXEC, entonces puede en la base de datos por defecto para la conexión. Habría que probar (no puedo en este momento, lo siento)

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

O vas a tener que utilizar sqlcmd o osql para conectar y ejecutar el código: esto le permite establecer el contexto db en la conexión. No dentro de T-SQL, sin embargo.

O puede probar ALTER xxx Entrar con DEFAULT_DATABASE = nombredb antes EXEC

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

Otros consejos

Se puede cambiar la base de datos antes de llamar a exec, y volver justo después:

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

O crear un servidor vinculado a la base de datos derecha, con enalbed RPC, y:

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

O crear un usuario diferente que tenga el catálogo predeterminado en la base de datos donde desea crear el gatillo y:

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

Para crear una referencia existencia solo validar y luego modificar 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top