根据有关批次的文档,您不能将多个CREATE TRIGGER
语句放在同一个批次中:
CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能与批处理中的其他语句组合。CREATE 语句必须启动批处理。该批次后面的所有其他语句将被解释为第一个 CREATE 语句定义的一部分。
GO
之所以有效,是因为它是 SSMS、sqlcmd 和 SQL Server 开发工具识别的批处理分隔符,它永远不会发送到服务器。该工具使用它来批量拆分文本并将它们一一发送到服务器。事务跨批次工作(毕竟是同一个连接),因此可以回滚某些 DDL 语句。
我假设你想从 Node.js 创建并执行一个数据库创建脚本。
一种解决方案是采用与 SQL Server 工具相同的方法:生成单独的批次并针对数据库逐一执行它们。
另一种选择是创建带有GO
分隔符的单个 SQL 脚本,并使用 SQL Server 的命令行工具执行它。这更易于维护,因为您可以保存脚本并对其进行版本控制、检测更改等。
第三种选择是使用 SQL Server 的开发工具来为您的数据库建模。数据库项目支持版本控制和验证。主要优点是 SSDT 可以生成脚本来更新目标数据库,类似于 Redgate 的工具。SSDT 相当聪明,可以识别在工具本身内部执行的重命名等,并使用例如sp_rename
而不是删除一列并创建新列。
另一个优点是 SSDT 生成一个dacpac
,本质上是一个编译模型,可用于比较目标数据库并生成更新脚本。
这使得连续数据库部署变得更加容易。它由AppVeyor、TFS支持。TeamCity和任何可以运行sqlpackage工具的工具/服务。
缺点是 SSDT 仅适用于 SQL Server 数据库。