Pregunta

¿Es posible, en un script ejecutado en MS SQL Server 2005, copiar un disparador de una base de datos a otra?

Se me ha pedido que escriba una secuencia de comandos de prueba para un desencadenante que está usando mi proyecto. Nuestra estructura de prueba consiste en crear una base de datos vacía que contenga solo el objeto bajo prueba, luego ejecutar un script en esa base de datos que crea todos los demás objetos necesarios para la prueba, los llena, ejecuta las pruebas necesarias, compara los resultados con los resultados esperados. y luego deja caer todo excepto el objeto bajo prueba.

No puedo crear una base de datos que esté vacía, excepto por el disparador, porque el disparador depende de varias tablas. Mi script de prueba actualmente ejecuta CREATE TRIGGER después de crear todas las tablas requeridas, pero esto no funcionará porque no se permite que el script de prueba contenga el objeto bajo prueba.

Lo que se ha sugerido es que, en lugar de ejecutar un CREATE TRIGGER, de alguna manera copio el disparador en ese punto en el script desde la base de datos en vivo a la base de datos de prueba. He tenido un rápido Google y no he encontrado una manera de hacer esto. Por lo tanto, mi pregunta: ¿es esto posible y, de ser así, cómo puedo hacerlo?

¿Fue útil?

Solución

Puede leer el texto del activador con sp_helptext (triggername)

O puede seleccionar el texto en una variable y ejecutar eso:

declare @sql varchar(8000)


select @sql = object_definition(object_id) 
from sys.triggers
where name = 'testtrigger'

EXEC @sql

Otros consejos

Tengo un procedimiento almacenado que copia un grupo de tablas en una base de datos de prueba. Para hacerlo menos propenso a cometer errores que podrían cambiar la base de datos incorrecta, quiero evitar el uso de USE y, en su lugar, especificar explícitamente en cada declaración de qué base de datos se ha copiado el activador.

Con la ayuda de esta respuesta , se me ocurrió esta solución:

DECLARE @sql NVARCHAR(MAX);
EXEC SourceDB.sys.sp_executesql
    N'SELECT @output = (SELECT OBJECT_DEFINITION(OBJECT_ID(''TriggerName'')))',
    N'@output VARCHAR(MAX) OUTPUT',
    @output = @sql OUTPUT;
EXEC DestDB.sys.sp_executesql @sql;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top