É possível criar um procedimento armazenado que crie um gatilho de tabela (DDL) em um banco de dados diferente daquele em que o próprio procedimento armazenado reside. Os bancos de dados estão na mesma instância do servidor. Se sim, então como?
Por exemplo, isso não funciona:
create PROCEDURE [dbo].[CreateTriggrer]
@db varchar(60)
AS
BEGIN
SET NOCOUNT ON;
declare @statement nvarchar(max) = N'CREATE TRIGGER [dbo].[TestTrigger]
ON [$database$].[dbo].[TestTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
PRINT ''test''
END'
set @statement = REPLACE(@statement,'$database$',@db)
EXEC dbo.sp_executesql @statement = @statement
END
Quando chamado assim:
EXEC [dbo].[CreateTriggrer] @db = N'TestDatabase'
Ele retorna este erro:
Msg 2108, Nível 15, Estado 1, Procedimento TestTrigger, Linha 6
Não é possível criar o gatilho em 'TestDatabase.dbo.TestTable' porque o destino não está no banco de dados atual.
O que é justo. Existe uma maneira de conseguir o que eu quero?
Isso não é totalmente intuitivo, mas deve funcionar. Aqui está um exemplo mais simples que você pode testar de forma independente:
Crédito para Erland Sommarskog - você deve ler este artigo se quiser entender mais profundamente como ele funciona .