【发布时间】:2017-11-03 15:01:41
【问题描述】:
我想出了以下触发器来提取执行表行更新语句时更新的所有列名...
但问题是如果有更多的列(至少 100 列),性能/效率就会受到关注
示例触发代码:
set define off;
create or replace TRIGGER TEST_TRIGG
AFTER UPDATE ON A_AAA
FOR EACH ROW
DECLARE
mytable varchar2(32) := 'A_AAA';
mycolumn varchar2(32);
updatedcols varchar2(3000);
cursor s1 (mytable varchar2) is
select column_name from user_tab_columns where table_name = mytable;
begin
open s1 (mytable);
loop
fetch s1 into mycolumn;
exit when s1%NOTFOUND;
IF UPDATING( mycolumn ) THEN
updatedcols := updatedcols || ',' || mycolumn;
END IF;
end loop;
close s1;
--do a few things with the list of updated columns
dbms_output.put_line('updated cols ' || updatedcols);
end;
/
有没有其他获取列表的方法?
也许有 v$ 表(v$transaction 或类似的东西)?
【问题讨论】:
-
你可以做一个
before更新触发器,并可以将:new.col与':old.col'进行比较,但首先,拥有100个以上的列听起来有点多。 -
似乎标准化是邪恶的
-
在
ERP系统中,似乎每个表至少有 40 列。我猜这可能不是因为规范化,或者 ERP 系统无法对用户自定义表进行非规范化......只是一个想法......
标签: oracle plsql cursor database-trigger