SQL Server 中的触发器丢失

Posted

技术标签:

【中文标题】SQL Server 中的触发器丢失【英文标题】:Lost trigger in SQL Server 【发布时间】:2012-08-23 10:13:57 【问题描述】:

丢失了一个触发器。我知道它是活动的,因为当我尝试更改字段时,它会恢复其值,并且从 SQL Server Management Studio 我可以看到,当我执行查询时,正在执行一个额外的查询(触发器)。

我尝试了SELECT * FROM sys.triggers WHERE 1 = 1,但它没有返回任何内容。另外,我知道触发器的名称,但是当我尝试ALTER时,它会返回一个错误,说明

对象“myTrigger”的名称无效。

如果我尝试DROP TRIGGER myTrigger ON DATABASE

无法删除触发器“myTrigger”,因为它不存在,或者用户没有足够的权限。

【问题讨论】:

也许在这里说明很明显,但是 1) 确保您在期望触发器打开的实际数据库上执行 select 语句,并且 2) 验证您使用正确的所有者来查看触发器。 " 或者用户没有足够的权限。"可能会提示您可能无法看到触发器的原因 - 您在数据库中拥有哪些权限? 触发器是 drop 命令所指示的数据库触发器还是不同类型的触发器(例如服务器或表) @Lieven 上帝保佑!!我没有看到当我点击“新查询”时,上面的选择指向其他数据库......多么愚蠢......失去了 2 小时...... 【参考方案1】:

好的,正如 Lieven 所说,我没有查询正确的数据库...这很奇怪,因为查询中定义了数据库

ALTER TRIGGER myTrigger
ON [DB].[dbo].[table]

但 SQL Server Management Studio 的上层选择指向其他数据库...


编辑: 我一直在调查(试图清理我的图像),我在 SQL Server Management Studio 上发现了一个奇怪的行为。 如果您执行如下查询:
UPDATE [DB].[dbo].[table] SET column = 'value' WHERE column2 = 'foo'

它在正确的数据库中执行查询。不管上面的选择指向什么DB。

但是,如果你尝试用触发器做同样的事情,你必须让上面的选择指向正确的数据库,否则你会遇到和我一样的问题。

【讨论】:

欢迎来到“耻辱殿”,别担心,你永远追不上我:)【参考方案2】:

我有一个类似你的细微错误;我做了这样的事情:

CREATE TRIGGER [TrigCustomerInsertDelete] 

ON [mobile].[Customers] 

AFTER INSERT, DELETE   
AS  

    select 'I'  [ACTION],* from inserted
    select 'D'  [ACTION],* from deleted

GO  

后来又尝试更新:

改变触发器 [TrigCustomerInsertDelete]

并得到这个错误:无效的对象名称

问题是我没有在触发器上指定架构(认为它只是 dbo),但表确实有一个架构。因此,在触发器中包含架构后,我发现了错误。

创建触发器 [DBO].[TrigCustomerInsertDelete]

这给了我以下错误:无法创建触发器“DBO.TrigCustomerInsertDelete”,因为它的架构与目标表或视图的架构不同。

我知道这是一篇旧帖子,但希望它能对其他人有所帮助。

【讨论】:

以上是关于SQL Server 中的触发器丢失的主要内容,如果未能解决你的问题,请参考以下文章

而不是SQL Server中的触发器丢失SCOPE_IDENTITY?

登录到 SQL Server 触发器中的表

.Net SqlDataAdapter 和 SQL Server 中的触发器

SQL Server 删除触发器以更新同一表中的多个列

使用参数在sql server中的触发器内执行存储过程

一个触发器会激活 SQL Server 中的另一个触发器吗?