你好我正在尝试创建一个历史表..我的代码几乎可以正常工作,但我的报告查询计算具有相同列值的行的总和(x_id)
现在我想创建一个首先删除旧行的触发器 (例如,第1行的值为(5x,100))
然后我的触发器将插入(5x,200),(5x,300)
我想在插入my(5x,200)和(5x,300)之前先删除(5x,100)列
我尝试在我的DELETE
之前在我的触发器中放置一个INSERT
语句,但最终只在我的历史记录表中插入了一行,它还删除了除最后一行之外新添加的行。
如果重要,我的触发器为AFTER UPDATE
和DELETE
。
此外,table1
和table1_hist
具有完全相同的列定义。
CREATE TRIGGER trig_table1_hist
ON table1
AFTER UPDATE, DELETE
AS
DELETE FROM table1_hist
WHERE table1_hist.t_id IN (SELECT t_id FROM inserted)
INSERT INTO table1_hist
SELECT *
FROM inserted
我尝试了这个但是它也用相同的主键删除了新添加的行。现在,如果我不删除,我的表将有(5x,100)(5x,200)(5x,300)但我需要(5x,100)消失,因为我的报告仍然包括(5x, 100)
答案 0 :(得分:0)
您可能在表1中插入2行,因此触发器被触发2次(第一行删除(5x,100),第二次删除(5x,200))
我不知道您在哪种情况下,但我建议您添加一个列,其中包含您在table1_hist中插入数据的日期,并根据这些日期显示报告。删除历史表中的行通常是个坏主意
答案 1 :(得分:0)
您需要逻辑来检查它是UPDATE
还是DELETE
。删除将使用伪表deleted
而不是inserted
。例如:
CREATE TRIGGER trig_table1_hist
ON table1
AFTER UPDATE,DELETE
AS
IF (EXISTS(SELECT 1 from deleted))
BEGIN
DELETE FROM table1_hist where table1_hist.t_id IN (SELECT t_id FROM deleted)
INSERT INTO table1_hist
SELECT * FROM deleted
ENd
IF (EXISTS(SELECT 1 FROM inserted))
BEGIN
DELETE FROM table1_hist where table1_hist.t_id IN (SELECT t_id FROM inserted)
INSERT INTO table1_hist
SELECT * FROM inserted
ENd
除此之外,你需要确保使用一个唯一的密钥 - 为table1选择主键,不要使用可能重复或不重复的字段 - 否则,你最终会产生意想不到的后果(比如将错误的行放入历史表中)。