Pergunta

Eu uso o MS SQL 2008 e eu quero criar um gatilho em um banco de dados que é criado dinâmico.

Criando o banco de dados é chamado de dentro de um procedimento armazenado de um outro banco de dados e funciona perfeitamente, mas quando eu quero adicionar um gatilho ou um procedimento armazenado, a execução falha.

Se eu tentar executar o SQL dynamiy com um

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

eu recebo:

sintaxe errada perto 'GO'

E se eu remover o 'uso ...' o gatilho será criado no banco de dados errado.

Existe um truque para evitar os meus problemas?

Thx

Foi útil?

Solução

"GO" não é uma linguagem T-SQL. É uma palavra-chave interpretado por ferramentas de cliente como SSMS como um separador de lote (que significa "texto enviar ao servidor").

Agora, CREATE TRIGGER deve ser a primeira instrução no lote de modo a "dbname USE" não pode ser usado.

Se você mencionar "dbnname USE" antes da EXEC, então pode-se no banco de dados padrão para a conexão. Você teria de teste (eu não posso agora, sorry)

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

Ou você terá que usar sqlcmd ou osql para se conectar e executar o código: isso permite-lhe definir o contexto db na conexão. Não dentro T-SQL embora.

Ou você pode tentar ALTER LOGIN xxx por DEFAULT_DATABASE = dbname 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]
')

Outras dicas

Você pode mudar o banco de dados antes de chamar exec, e voltar logo em seguida:

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

Ou criar um servidor vinculado ao banco de dados direito, com RPC enalbed, e:

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

Ou criar um usuário diferente que tenha o catálogo padrão no banco de dados onde você gostaria de criar o gatilho e:

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

Para criar uma referência única existência validação e, em seguida, modificar com 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top