如何使用 TRANSACTION 将 CREATE TRIGGER 放入 TRY-CATCH 块中?
How to put CREATE TRIGGER into TRY-CATCH block with TRANSACTION?
我在 SQL 中不是高级程序员,也许我的问题很愚蠢,但我在 google 中没有找到答案。我们有一些 SQL 结构来实施变更包:
...
BEGIN TRY
BEGIN TRANSACTION;
<User Code Is Here>
...
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
...
如何放置 CREATE TRIGGER 块链而不是 <User Code Is Here>
而没有错误:
-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
目的是创建所有触发器或什么都不创建,如果失败则在 CATCH 代码块中打印消息。
已编辑
错误是:
- 在第一个触发器的
BEGIN
上:SQL80001:'BEGIN' 附近的语法不正确。期待外部。
- 第一次触发后,在
GO
:SQL80001:'GO'. 附近的语法不正确
END TRY
:SQL80001:'TRY' 附近的语法不正确。期待对话。
END CATCH
:SQL80001:'CATCH' 附近的语法不正确。期待对话。
您需要 运行 每个 create table
语句在单独的 scope/batch 中(因为它必须是批处理中的第一个语句)。所以你也必须转义触发器定义中的任何引号:
BEGIN TRY
BEGIN TRANSACTION;
exec sp_executesql N'CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
//An empty string in here has to be '''' to escape the quotes
SET NOCOUNT OFF;
END'
exec sp_executesql N'CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END'
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
事务与批处理和嵌套范围正交,因此事务也涵盖每个 EXEC
内发生的所有 activity。
我在 SQL 中不是高级程序员,也许我的问题很愚蠢,但我在 google 中没有找到答案。我们有一些 SQL 结构来实施变更包:
...
BEGIN TRY
BEGIN TRANSACTION;
<User Code Is Here>
...
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
...
如何放置 CREATE TRIGGER 块链而不是 <User Code Is Here>
而没有错误:
-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
目的是创建所有触发器或什么都不创建,如果失败则在 CATCH 代码块中打印消息。
已编辑
错误是:
- 在第一个触发器的
BEGIN
上:SQL80001:'BEGIN' 附近的语法不正确。期待外部。 - 第一次触发后,在
GO
:SQL80001:'GO'. 附近的语法不正确
END TRY
:SQL80001:'TRY' 附近的语法不正确。期待对话。END CATCH
:SQL80001:'CATCH' 附近的语法不正确。期待对话。
您需要 运行 每个 create table
语句在单独的 scope/batch 中(因为它必须是批处理中的第一个语句)。所以你也必须转义触发器定义中的任何引号:
BEGIN TRY
BEGIN TRANSACTION;
exec sp_executesql N'CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
//An empty string in here has to be '''' to escape the quotes
SET NOCOUNT OFF;
END'
exec sp_executesql N'CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END'
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
事务与批处理和嵌套范围正交,因此事务也涵盖每个 EXEC
内发生的所有 activity。