将触发器从一个数据库复制到另一个

Posted

技术标签:

【中文标题】将触发器从一个数据库复制到另一个【英文标题】:Copy trigger from one database to another 【发布时间】:2009-11-27 08:53:40 【问题描述】:

是否可以在 MS SQL Server 2005 中执行的脚本中数据库?

我被要求为我的项目正在使用的触发器编写一个测试脚本。我们的测试结构是创建一个只包含被测对象的空数据库,然后在该数据库上执行一个脚本,该脚本创建测试所需的所有其他对象,填充它们,运行所需的任何测试,将结果与预期结果进行比较,然后丢弃除被测对象之外的所有内容。

我不能只创建一个除了触发器之外的空数据库,因为触发器依赖于几个表。我的测试脚本当前在创建所有必需的表后运行 CREATE TRIGGER,但这不会执行,因为不允许测试脚本包含被测对象。

建议的是,我不是运行 CREATE TRIGGER,而是以某种方式将脚本中该点的触发器从实时数据库复制到测试数据库。我有一个快速的谷歌,还没有找到一种方法来做到这一点。因此我的问题 - 这是否可能,如果可以,我该怎么做?

【问题讨论】:

【参考方案1】:

您可以使用sp_helptext (triggername)阅读触发器的文本

或者您可以将文本选择到变量中并执行:

declare @sql varchar(8000)


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

EXEC @sql

【讨论】:

谢谢,太好了。通过一些 USE 和 EXEC (@sql),这正是我想要的。【参考方案2】:

我有一个将一堆表复制到测试数据库的存储过程。为了减少可能更改错误数据库的错误,我想避免使用USE,而是明确指定每个语句从哪个数据库复制触发器。

在this answer的帮助下,我想出了这个解决方案:

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;

【讨论】:

以上是关于将触发器从一个数据库复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

调用触发器时将行从一个表复制到另一个表

将值从一个 DataGridView 复制到另一个

如何在 SQL Server 中将索引从一个表复制到另一个表

oracle中如何将数据从一个表复制到另一个表(仅复制其中某些字段)

触发器将同一行复制到另一个表中

如何将数据从一个 BigTable 表复制到另一个 BigTable 表