我想删除和修改以前创建的触发器,但我在数据库中找不到它们。它们存在的位置以及如何编辑或删除它们
您可以在表节点下找到触发器:
在 SSMS (SQL Server Management Studio) 的
Tables
节点下,每个表都有一个 Triggers
节点。
您可以从那里管理您的触发器。
这里有一个更好的方法:
select a.[name] as trgname, b.[name] as [tbname]
from sys.triggers a join sys.tables b on a.parent_id = b.object_id
请务必针对您认为触发器所在的数据库运行它。
您还可以通过查询 SQL Server Management Studio 中的管理视图来查找触发器:
SELECT
OBJECT_NAME(object_id) 'Table name', *
FROM
sys.triggers
这将为您提供所有触发器的列表以及它们在当前数据库中定义的表。然后您可以继续禁用或删除它们。
要对之前的答案进行一些扩展,在所有最新版本的 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"
,然后执行它。
可以创建数据库范围的触发器。
下面是我的迁移脚本生成器的 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;