【问题标题】:Create trigger in CREATE DATABASE stored procedure在 CREATE DATABASE 存储过程中创建触发器
【发布时间】:2021-07-13 06:59:34
【问题描述】:

我们有一个为每个客户创建数据库的存储过程。此存储过程在 master 的上下文中运行。数据库名称作为参数传递给存储过程。

我正在尝试修改存储过程以向表中添加触发器。我了解存储过程必须切换到新数据库才能创建触发器,因此在存储过程中附加了以下内容:

SET @str = ('USE ' + QUOTENAME (@db_name) + ' GO
CREATE TRIGGER ...')
EXEC (@str);

我得到了错误

消息 102,第 15 级,状态 1,第 3 行
'GO' 附近的语法不正确。

消息 111,第 15 级,状态 1,第 4 行
'CREATE TRIGGER' 必须是查询批处理中的第一条语句。

现在我假设第二个错误是第一个错误的结果,但如果我能弄清楚如何在存储过程中切换数据库以创建触发器,我会感到震惊。

我们使用的是 SQL Server 2019。如何在创建数据库存储过程中创建触发器?

【问题讨论】:

标签: sql sql-server tsql triggers dynamic-sql


【解决方案1】:

另一种方法是一个接一个地执行语句。

DECLARE @str VARCHAR(MAX)
DECLARE @db_name SYSNAME = 'YourDBName'
SET @str = 'USE ' + QUOTENAME (@db_name)
EXEC (@str)
SET @str = 'CREATE TRIGGER ...' 
exec (@str);

为了完整起见,正如@DaleK 所述,添加the approach mentioned by Aaron Bertnard in the Stackexchange link

DECLARE @str VARCHAR(MAX)
DECLARE @db_name SYSNAME = 'master'
SET @str = 'EXEC '+  @db_name + '..sp_executesql @stmt=N''CREATE PROCEDURE usp_test AS SELECT 1;''' 
exec (@str);

【讨论】:

  • 我试过@Venkataraman R。问题出现在CREATE TRIGGER 必须是批处理中的第一个语句。如果我在CREATE TRIGGER 之前加上GO,那么我丢失了db_name
  • @Vague,是的。如前所述,您必须按顺序执行它们。或者你必须使用@DaleK 提到的sp_Executesql
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多