在Oracle中执行触发器以将旧值复制到镜像表
我们试图在删除/更新之前使用触发器将表的当前行复制到镜像表。下面是工作查询在Oracle中执行触发器以将旧值复制到镜像表,oracle,triggers,Oracle,Triggers,我们试图在删除/更新之前使用触发器将表的当前行复制到镜像表。下面是工作查询 BEFORE UPDATE OR DELETE ON CurrentTable FOR EACH ROW BEGIN INSERT INTO MirrorTable ( EMPFIRSTNAME, EMPLASTNAME, CELLNO, SALARY ) VALUES ( :old.EMPFIRSTNAME, :old.EMPLASTNAME, :old
BEFORE UPDATE OR DELETE
ON CurrentTable FOR EACH ROW
BEGIN
INSERT INTO MirrorTable
( EMPFIRSTNAME,
EMPLASTNAME,
CELLNO,
SALARY
)
VALUES
( :old.EMPFIRSTNAME,
:old.EMPLASTNAME,
:old.CELLNO,
:old.SALARY
);
END;
但问题是我们在当前表中有50多个coulmn,不想提及所有这些列名。有没有办法选择像这样的所有coulmn
:旧的*
任何建议都会有帮助
谢谢,事实上,没有。您需要列出所有列
- 当然,您可以通过从
DBA\u TAB\u列中提取列名来动态生成触发器代码。但这比简单地输入50个列名要多得多
- 如果您的表恰好是一个对象表,
将是该对象的一个实例,因此您可以插入该对象。但拥有对象表是相当罕见的:new
INSERT INTO MirrorTable
SELECT *
FROM CurrentTable
WHERE CurrentTable.primary_key_column = :old.primary_key_column
老实说,我认为这是一个糟糕的选择,不会这样做,但这是一个或多或少自由的世界,你可以自由(或多或少:-)做出自己的选择
分享和享受。出于自身的价值,我一直在写同样的东西,并用它来生成代码: SQL>设置页面大小0
SQL>选择“:old.”| | COLUMN| | | COLUMN|NAME |“,”从table|NAME='BIGTABLE'和owner='BOB'所在的所有|tab|列中;
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
如果输入所有列,则无需重复提及它们(空列可以使用NULL): 插入到bigtable值中(
:old.COL1,
:old.COL2,
:old.COL3,
:old.COL4,
:old.COL5,
空,
无效)
写那么多栏的桌子的人不应该吃甜点;-) 通常,如果在
CurrentTable
上定义的行级触发器中查询CurrentTable
,通常会得到一个变异表错误。例外情况是,如果每次插入都始终是带有插入的单行插入。。。值
但这并不特别现实。@JustinCave:doh!忘了我们说的是CurrentTable上的触发器。在这种情况下,我建议使用复合触发器。如果您使用具有列编辑模式的编辑器,这将对您的编码有很大的帮助。例如,Ultraedit和sublime Text可以非常轻松地复制一长列名称(名称1名称2等),然后将其编辑到另一列条目中,例如“Coalesce(总和(名称1),0)总和(名称01)”。它会加快你的速度,消除打字错误。
INSERT INTO MirrorTable
SELECT *
FROM CurrentTable
WHERE CurrentTable.primary_key_column = :old.primary_key_column