我一直在寻找一种记录表中行删除的方法。
试过这个Log record changes in SQL server in an audit table,但这对我没有帮助。
我有一个歌曲列表数据库,日志表中有列:Title / Artist / Year / Position / SentinDate。
有一个包含1999年至2014年歌曲的列表,每年都有2000首歌曲(top2000就是它在荷兰的名字)。
基本上,删除某个年份后,日志表应该是什么样子:
当有人从1999 - 2014年的名单中删除某一年时,我需要一个基本的触发日志方式。
我希望有足够的信息让你理解,如果不是,我会尝试更详细地解释。
答案 0 :(得分:1)
触发器拒绝或接受整个数据修改事务。
在触发器中使用相关子查询可以强制触发器逐个检查已修改的行。
实施例
一个。使用AFTER INSERT触发器
以下示例假定pubs数据库中存在名为newsale的表。这是newsale的CREATE语句:
CREATE TABLE newsale
(stor_id char(4),
ord_num varchar(20),
date datetime,
qty smallint,
payterms varchar(12),
title_id tid)
如果要检查要插入的每个记录,触发器conditionalinsert会逐行分析插入,然后删除标题中没有title_id的行。
CREATE TRIGGER conditionalinsert
ON sales
AFTER INSERT AS
IF
(SELECT COUNT(*) FROM titles, inserted
WHERE titles.title_id = inserted.title_id) <> @@ROWCOUNT
BEGIN
DELETE sales FROM sales, inserted
WHERE sales.title_id = inserted.title_id AND
inserted.title_id NOT IN
(SELECT title_id
FROM titles)
PRINT 'Only sales records with matching title_ids added.'
END
如果插入了不可接受的标题,则不会回滚该事务;相反,触发器删除不需要的行。删除已插入行的此功能依赖于触发触发器时处理发生的顺序。首先,将行插入sales表和插入的表中,然后触发触发器。
答案 1 :(得分:0)
只需创建一个INSTEAD OF DELETE
触发器!在那个触发器中,你有一个&#34;虚拟&#34;名为deleted
的表,其中包含要删除的所有记录。
因此,在触发器中,您只需将deleted
中包含的所有记录插入到日志表中,然后从表中删除记录。 (这将是DELETE
语句,并加入deleted
表)