Скопировать триггер из одной базы данных в другую - PullRequest
4 голосов
/ 27 ноября 2009

Возможно ли в сценарии, выполняемом в MS SQL Server 2005, скопировать триггер из одной базы данных в другую?

Меня попросили написать тестовый скрипт для триггера, который использует мой проект. Наша структура тестирования заключается в создании пустой базы данных, содержащей только тестируемый объект, а затем в этой базе данных выполняется сценарий, который создает все другие объекты, необходимые для теста, заполняет их, выполняет все необходимые тесты, сравнивает результаты с ожидаемыми а затем отбрасывает все, кроме тестируемого объекта.

Я не могу просто создать пустую базу данных, кроме триггера, потому что триггер зависит от нескольких таблиц. Мой тестовый скрипт в настоящее время запускает CREATE TRIGGER после того, как все необходимые таблицы созданы, но этого не произойдет, потому что тестовый скрипт не может содержать тестируемый объект.

То, что было предложено, заключается в том, что вместо запуска CREATE TRIGGER я каким-то образом копирую триггер в этой точке сценария из действующей базы данных в тестовую базу данных. У меня был быстрый Google и я не нашел способ сделать это. Таким образом, мой вопрос - возможно ли это, и если да, то как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

Вы можете прочитать текст триггера с помощью sp_helptext (triggername)

Или вы можете выделить текст в переменную и выполнить это:

declare @sql varchar(8000)


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

EXEC @sql
0 голосов
/ 30 мая 2019

У меня есть хранимая процедура, которая копирует несколько таблиц в тестовую базу данных. Чтобы сделать его менее подверженным ошибкам, которые могут потенциально изменить неправильную базу данных, я хочу избегать использования USE и вместо этого явно указывать для каждого оператора, в какую базу данных копируется триггер и из которого.

С помощью этого ответа я придумал это решение:

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;
...