记录表sql server中行的删除

时间:2015-06-01 08:35:43

标签: sql-server logging triggers

我一直在寻找一种记录表中行删除的方法。

试过这个Log record changes in SQL server in an audit table,但这对我没有帮助。

我有一个歌曲列表数据库,日志表中有列:Title / Artist / Year / Position / SentinDate。

有一个包含1999年至2014年歌曲的列表,每年都有2000首歌曲(top2000就是它在荷兰的名字)。

基本上,删除某个年份后,日志表应该是什么样子:

image

当有人从1999 - 2014年的名单中删除某一年时,我需要一个基本的触发日志方式。

我希望有足够的信息让你理解,如果不是,我会尝试更详细地解释。

2 个答案:

答案 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表)