我想获取新表定义(创建表语句)并在ddl alter table触发器触发时将其保存到txt文件。
我尝试过xp_helptext,这只适用于view或storage proc。我希望有更改表来获得新的创建语句。
我也尝试过使用xp_cmdshell来启动.net。并根据INFORMATION_SCHEMA中的信息对脚本进行硬编码。但是,它被锁定,因为在.net运行期间触发器未关闭。
答案 0 :(得分:2)
你不能这样做。运行ALTER TABLE时,SQL Server不会生成新的CREATE TABLE语句。您将看到DDL触发器中的EVENTDATA()仅包含ALTER命令,而不是整个表定义。您还会注意到,即使原始命令是CREATE TABLE,INFORMATION_SCHEMA和sys.tables之类的目录视图也都不会存储CREATE TABLE生成的副本,因此无法从该路径获取任何内容。
您可以通过运行服务器端跟踪,然后右键单击表并选择Script As>来查看Management Studio执行哪些操作来生成create table脚本。创建至>新查询编辑器窗口。我可以向你保证,这不是一些简单的SELECT create_table FROM sys.something
,而是针对大量DMV的一组元数据查询。您甚至看不到正在组装的CREATE TABLE,因为它是在代码中完成的,而不是从数据库或查询中完成的。
更易于访问:SMO有methods for scripting objects个表格。但是我不认为你应该尝试在触发器内执行此操作 - 糟糕的想法是让ALTER TABLE事务等待你调用某些外部进程,写入文件系统等的能力。这就是我的建议:当一个表的定义发生了变化,在DDL触发器中向队列表中添加一行。在操作系统上有一个PowerShell脚本或C#命令行可执行文件,它使用SMO方法生成给定表名的脚本。安排该脚本每分钟或每5分钟运行一次,并检查队列表中是否有已发生但尚未捕获的新更改。程序根据SMO生成的CREATE TABLE脚本写入文件,然后更新队列表(或删除行),以便只处理一次。