Criar uma dinâmica gatilho
-
05-09-2019 - |
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
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