1

我想在 ddl alter table 触发器触发时获取新表定义(创建表语句)并将其保存到 txt 文件中。

我试过 xp_helptext,这只适用于视图或存储过程。我希望有这样的东西来改变表以获得新的创建语句。

我也尝试过使用 xp_cmdshell 来启动 .net。并根据来自 INFORMATION_SCHEMA 的信息对脚本进行硬编码。但是,它被锁定,因为在 .net 运行期间触发器未关闭。

4

1 回答 1

2

你不能这样做。当您运行 ALTER TABLE 时,SQL Server 不会生成新的 CREATE TABLE 语句。您将看到 DDL 触发器中的 EVENTDATA() 仅包含 ALTER 命令,而不是整个表定义。您还会注意到,INFORMATION_SCHEMA 和 sys.tables 之类的目录视图都不会存储 CREATE TABLE 生成的副本,即使原始命令是 CREATE TABLE 也是如此,因此从该路径中没有什么可获取的。

您可以通过运行服务器端跟踪,然后右键单击表并选择 Script As > Create To > New Query Editor Window 来查看 Management Studio 生成创建表脚本的操作。我可以向您保证,这不是一些简单SELECT create_table FROM sys.something的,而是针对大量 DMV 的一组元数据查询。您甚至看不到正在组装 CREATE TABLE,因为它是在代码中完成的,而不是从数据库或查询中完成的。

更易于访问:SMO 具有脚本对象的方法比如桌子。但我认为您不应该尝试从触发器中执行此操作 - 让 ALTER TABLE 事务等待您调用某些外部进程、写入文件系统等的能力是个坏主意。这是我的建议:当表的定义已更改,在 DDL 触发器中向队列表添加一行。在操作系统上有一个 PowerShell 脚本或 C# 命令行可执行文件,它使用 SMO 方法生成给定表名的脚本。安排该脚本每分钟或每 5 分钟运行一次,并检查队列表中是否有任何已发生但您尚未捕获的新更改。程序根据 SMO 生成的 CREATE TABLE 脚本写入文件,然后更新队列表(或删除行),使其只处理一次。

于 2012-06-07T19:49:52.173 回答