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?