【发布时间】:2021-06-05 09:52:11
【问题描述】:
我正在使用插入触发器并且工作正常。我正在创建一个插入触发器并在tblHist 表中进行备份。
我有两张桌子:
-
tblUser- 为插入、更新和删除目的创建此表 -
tblHist- 创建此表以存储历史记录
tblUser 表格设计:
tblHist 表格设计:
然后我创建一个插入和更新触发器:
ALTER TRIGGER [dbo].[trgr_tblUser_AFTERINSERT]
ON [dbo].[tblUser]
AFTER INSERT, UPDATE
--,DELETE
AS
BEGIN
DECLARE @userid int, @username varchar(50),
@useraddress varchar(50), @countryname varchar(5),
@statename varchar(50), @cityname varchar(50);
BEGIN
SELECT
@userid = u.userid, @username = u.username,
@useraddress = u.useraddress,
@countryname = u.countryname,
@statename = u.statename, @cityname = u.cityname
FROM tblUser u;
INSERT INTO tblHist (userid, username, useraddress, countryname, statename, cityname)
VALUES (@userid, @username, @useraddress, @countryname, @statename, @cityname);
PRINT 'AFTER INSERT update trigger fired.'
END
END
当我在tblUser 表中插入一条记录时,它会在tblHist 表中插入一条记录 - 这工作正常。
见下文
然后我更新一条记录,然后在 tblHist 表中插入历史记录,工作正常。
但问题是当我在 trgr_tblUser_AFTERINSERT 添加删除记录功能的代码时,删除功能不起作用
当我单独创建删除触发器时,工作正常
见下文
ALTER TRIGGER [dbo].[trgr_tblUser_AFTERDELETE]
ON [dbo].[tblUser]
FOR DELETE
AS
BEGIN
DECLARE @userid int, @username varchar(50),
@useraddress varchar(50), @countryname varchar(5),
@statename varchar(50), @cityname varchar(50);
SELECT
@userid = u.userid, @username = u.username,
@useraddress = u.useraddress, @countryname = u.countryname,
@statename = u.statename, @cityname = u.cityname
FROM deleted u;
INSERT INTO tblHist (userid, username, useraddress, countryname, statename, cityname)
VALUES (@userid, @username, @useraddress, @countryname, @statename, @cityname);
PRINT 'AFTER DELETE trigger fired.'
END
我想在一个触发器中添加插入、更新、删除触发器功能但不起作用。
我正在尝试什么:
exist select 1 --- but not work
我做错了什么地方需要帮助
【问题讨论】:
-
最简单的解决方案:创建 三个 单独的触发器 - 每个操作一次。然后你不需要做很多检查来弄清楚你正在处理什么操作。另外:在 SQL Server 中,触发器将被调用每条语句一次(而不是每行一次) - 所以当您从
Inserted或Deleted伪表中选择时 - 总是 b> 假设这些表中有多行!您当前的SELECT只会从Deleted中拉出一个 行-所有其他行呢?您需要使用 基于集合的 方法 - 而不是“逐行痛苦”的方法... -
正如 marc_s 提到的,触发器是基于 SET 的。如果您有包含行的表并执行 INSERT/UPDATE/DELETE(没有 where 过滤器),则触发器会为所有 100 行触发一次。在触发器中定义单个 @scalarVariables 将无法按您的需要工作。
-
这是一个不错的学习示例:stackoverflow.com/questions/17116334/…
-
有什么特殊原因可以让用户的所有列都为空?
-
您现在已经发现(或至少被告知),您的代码不能“正常工作”。您需要改进测试和验证代码的方式;您的测试非常简单,无法发现这些重大问题。另一个注意事项 - 影响零(无)行的语句也会导致任何关联的触发器执行。
标签: sql-server triggers