我正在写一个触发器,在删除之前将一行复制到另一个表。我似乎无法让它只用一行。我在这里看了很多帖子,他们将where语句设置为id = existingId;或类似的东西。我似乎无法弄清楚如何让触发器只复制一行。或者如何告诉它当前行是什么。我不能在where语句中使用表中的特定值(如id,name等),因为我不知道要选择哪一行。谢谢!
这是我到目前为止所做的:
create or replace TRIGGER archive_tbl
BEFORE DELETE ON STUDENT
BEGIN
INSERT INTO ARCHIVE_STUDENT (stdid, fname, lname, mi, majorid, address, city, state, zip, phone, advid)
SELECT * FROM STUDENT
WHERE ????
END;
答案 0 :(得分:1)
对于Oracle,您可以使用即将删除的:old.col1
到refer to the row。如果你这样做,请务必声明触发器for each row
。
INSERT INTO YourTable (col1, col2, col3)
VALUES (:old.col1, :old.col2, :old.col3)
对于SQL Server,您可以使用deleted
special table。它包含已删除的行。
INSERT INTO YourTable (col1, col2, col3)
SELECT col1, col2, col3 FROM deleted
答案 1 :(得分:1)
在触发器上,您可以引用new
和old
转换变量,以便查看记录的值(在删除的情况下,只有旧的)。
您无法从Student中选择值,因为您已经删除了它,因此要么为每个列使用old.column,要么查询已删除的表,就像Andomar在其答案中所述。