代码之家  ›  专栏  ›  技术社区  ›  TheSoftwareJedi jac

如何让SQLServer2005从DDL触发器异步调用DOS批处理文件?

  •  1
  • TheSoftwareJedi jac  · 技术社区  · 17 年前

    我创建了一个批处理文件来运行SqlMetal并生成Linq2Sql数据类,检查源代码管理触发构建,等等。。。我希望在SQLServer2005中发生DDL更改时运行此脚本。

    通过xp_cmdshell运行批处理文件在触发器之外工作正常,如下所示:

    exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output
    

    但当它作为触发器运行时,它总是在连接到数据库时超时,导致所有DDL失败。这是我的扳机:

    CREATE TRIGGER [Trig_SqlMetal]
    ON DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS 
    AS
    exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output
    

    我想就两点寻求建议:

    1. 让这一切顺利。出于某种原因,它在触发器中时总是失败,而在不在触发器中时不会失败。似乎与安全性无关,因为它在这两种情况下都作为LocalSystem运行。
    1 回复  |  直到 17 年前
        1
  •  3
  •   LeoPasta    17 年前

    您的批处理可能被阻止,因为它试图查询有关正在创建的表的数据,但它们仍被锁定在事务中(触发器是SQL Server为任何DDL/DML语句启动的隐式事务的一部分),该事务将仅在触发器完成后完成。 实际上,正确设置它有点复杂,因此您可能会选择使用池选项。