无法找到触发器存储在sql server 2008中的位置

问题描述 投票:0回答:6

我想删除和修改以前创建的触发器,但我在数据库中找不到它们。它们存在的位置以及如何编辑或删除它们

sql-server triggers
6个回答
98
投票

您可以在表节点下找到触发器:

enter image description here


13
投票

在 SSMS (SQL Server Management Studio) 的

Tables
节点下,每个表都有一个
Triggers
节点。

您可以从那里管理您的触发器。


9
投票

这里有一个更好的方法:

select a.[name] as trgname, b.[name] as [tbname] 
from sys.triggers a join sys.tables b on a.parent_id = b.object_id

请务必针对您认为触发器所在的数据库运行它。


5
投票

您还可以通过查询 SQL Server Management Studio 中的管理视图来查找触发器:

SELECT
    OBJECT_NAME(object_id) 'Table name', *
FROM 
    sys.triggers

这将为您提供所有触发器的列表以及它们在当前数据库中定义的表。然后您可以继续禁用或删除它们。


2
投票

要对之前的答案进行一些扩展,在所有最新版本的 SQL Server 中,您可以右键单击触发器并选择:

Script Trigger as… ALTER To… "New Query Editor Window"

这将打开一个包含触发器详细信息的 SQL 脚本,如果您阅读代码,您会注意到它包含 ALTER 语法:

ALTER TRIGGER [dbo].triggername ...

这意味着您可以编辑 SQL 并按“执行”来更改触发器 - 这将覆盖以前的定义。

如果触发器是使用自动化工具构建的,您可能会在触发器定义中发现您想要删除的重复代码。

在尝试编辑任何内容之前,值得尝试先执行脚本,这会告诉您触发器定义是否有效。如果表或列被重命名,事情可能会不同步。

与完全删除/删除触发器类似,选择:

Script Trigger as… DROP To… "New Query Editor Window"
,然后执行它。


0
投票

可以创建数据库范围的触发器。

下面是我的迁移脚本生成器的 SQL 部分。

创建迁移表来收集所有 ddl 查询:

CREATE TABLE [dbo].[queries](
    [ddl_query] [nvarchar](max) NULL,
    [timestamp] [datetime] NULL,
    [username] [nvarchar](26) NULL,
    [ID] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

创建数据库范围的 DDL 触发器:

CREATE or ALTER TRIGGER migrations_capture_ddl
ON DATABASE -- Specify that the trigger applies to the whole database
FOR DDL_DATABASE_LEVEL_EVENTS -- Specify that the trigger fires for any DDL event at the database level
AS
BEGIN
-- Declare a variable to store the DDL statement
DECLARE @ddl_query NVARCHAR(MAX);
-- Get the DDL statement from the EVENTDATA() function, which returns an XML value with information about the event
SET @ddl_query = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)');
-- Get the event type from the EVENTDATA() function
DECLARE @event_type NVARCHAR(100);
SET @event_type = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)');
-- Declare a variable to store the login name of the current user
DECLARE @login_name NVARCHAR(100);
-- Get the login name from the SYSTEM_USER function
SET @login_name = SYSTEM_USER;
-- Declare a variable to store the system user name of the current user
DECLARE @system_user_name NVARCHAR(100);
-- Get the system user name from the SUSER_NAME() function
SET @system_user_name = SUSER_NAME();
-- Insert the DDL statement, the current time, and both user names into the migrations table only if the event type is not alter index
IF @event_type <> 'ALTER_INDEX' AND @ddl_query NOT LIKE '%UPDATE STATISTICS%'
BEGIN
INSERT INTO migrations (ddl_query, timestamp, username)
VALUES (@ddl_query, GETDATE(), @system_user_name);
END;
END;
© www.soinside.com 2019 - 2024. All rights reserved.