【问题标题】:SqlCommand cannot drop triggersSqlCommand 不能删除触发器
【发布时间】:2015-08-06 17:52:51
【问题描述】:

我正在 .Net 中创建需要更改数据库以设置测试场景的测试方法。我们使用 SqlCommands 发送查询以更改数据库,此连接字符串是受信任的连接字符串。所有 DROPS 和 ALTER 查询对于表、列、约束等都可以正常工作。但是当我尝试 DROP 触发器时,出现以下错误。

SQL EXCEPTION: 'Cannot drop the trigger 'dbo.TRIG_Application_Insert', because it does not exist or you do not have permission.'

查询是DROP TRIGGER [dbo].[TRIG_Application_Insert],它之所以有效,是因为它已经在 SQL Management Studio 中直接测试过,并且在通过sqlcmd 工具调用的将触发器添加到数据库的脚本中使用。

这可能是权限问题,还是使用 .Net SqlCommand 时查询需要不同?

我尝试为 sa 用户和具有高权限的 db 用户使用标准安全连接字符串,但仍然遇到相同的错误。

【问题讨论】:

  • 不,您不需要其他声明。您确定在连接字符串上设置了 Initial_Catalog 吗?如果不是,您的命令没有针对正确的数据库运行。
  • 当您运行脚本添加触发器时,您是进入 SQL Management Studio 并查看创建的触发器还是在回滚的事务中?
  • @shf301 我的连接字符串是 Data Source=(local)\SQLEXPRESS2012;Initial Catalog=master;Integrated Security=True
  • @JeffO 每个测试都会重新生成数据库以在每个测试上都有一个干净的实例,然后修改这个实例;在将它们写入 .Net 代码之前,我直接在 SQL Management Studio 上(在一个干净的数据库实例中)尝试我的查询。在 Management Studio 中,查询工作得很好,它们确实按预期删除了触发器
  • 在 SQL Management Studio 上运行 DROP TRIGGER 可以正常工作,因为为新查询选择了所需的数据库。在查询窗口的右下方显示正在运行针对查询的数据库。

标签: c# .net sql-server sqlcommand


【解决方案1】:

由于您的 Initial Catalog 是 master 您的命令正在针对 master 数据库运行。您的触发器不在您的命令失败的数据库中。您需要将初始目录设置为要连接到我们在命令中指定数据库的数据库。因此,如果您的数据库是 MyDatabase,请使用:

Data Source=(local)\SQLEXPRESS2012;Initial Catalog=MyDatabase;Integrated Security=True 

或者

DROP TRIGGER [MyDatabase].[dbo].[TRIG_Application_Insert]

【讨论】:

  • 为删除触发器指定数据库会引发异常:SQL EXCEPTION: ''DROP TRIGGER' 不允许将数据库名称指定为对象名称的前缀。'
  • 将初始目录设置为 MyDatabase(在我的例子中对应的名称)解决了这个问题。虽然我认为如果尝试使用相同的连接字符串来更改不同的数据库(我碰巧在其他一些测试中这样做),这可能会产生麻烦,但这可以解决。
【解决方案2】:

看起来您可能打错了数据库,因为您说您使用的是具有更高权限的帐户。我建议在您的脚本中添加一个 USE 以使其命中正确的 Db。无论如何,这是很好的做法。

USE <database name>
DROP TRIGGER [dbo].[TRIG_Application_Insert]

【讨论】:

  • 这是一个更简单的解决方案,至少在我的具体情况下。我仍然需要使用我的初始目录或数据库作为我的其余代码的主目录,并且它不需要对我的代码进行大量更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多