oracle - 如何记录 Alter Column DDL 操作
问题描述
我需要创建一个数据库触发器,它将使用 Oracle 的模式触发器在特定表中记录每个 alter ( Add Column
, Modify Column
, ) 语句。Drop Column
如何得到它?
到目前为止,我尝试了以下代码:
TRIGGER after_ddl_creation
after CREATE ON SCHEMA
DECLARE
V CLOB;
BEGIN
FOR REC IN(SELECT TEXT FROM user_source WHERE NAME=SYS.DICTIONARY_OBJ_NAME)
LOOP
V:=V||REC.TEXT;
END LOOP ;
INSERT INTO myAudit VALUES
(SYS.DICTIONARY_OBJ_NAME,SYS.DICTIONARY_OBJ_TYPE,SYSDATE,USER,NULL,NULL,V);
END;
解决方案
您可以使用这样的数据库触发器:
create or replace trigger after_ddl_creation after ddl on schema
declare
v_oty varchar2(75) := ora_dict_obj_type;
v_don varchar2(75) := ora_dict_obj_name;
v_evt varchar2(75) := ora_sysevent;
v_olu varchar2(75) := nvl(ora_login_user,'Undefined Schema');
v_sql ora_name_list_t;
v_stm clob;
v_sct owa.vc_arr;
n pls_integer;
n_max pls_integer := 10000;
--> can log upto ten-thousand rows of "text" value, within "stmt" column,
--> which can be accessed by using (`[user|all|dba]_source`) views.
begin
v_sct(1) := 'SESSIONID';
v_sct(2) := 'IP_ADDRESS';
v_sct(3) := 'TERMINAL';
v_sct(4) := 'OS_USER';
v_sct(5) := 'AUTHENTICATION_TYPE';
v_sct(6) := 'CLIENT_INFO';
v_sct(7) := 'MODULE';
for i in 1..7
loop
v_sct(i) := sys_context('USERENV',v_sct(i));
end loop;
select decode(v_sct(1),0,null,v_sct(1)),
decode(upper(v_sct(3)),'UNKNOWN',null,v_sct(3))
into v_sct(1),v_sct(3) from dual;
n := ora_sql_txt( v_sql );
if n > n_max then
n := n_max;
end if;
for i in 1..n
loop
v_stm := v_stm || v_sql(i);
end loop;
if ( evt = 'ALTER' and oty = 'TABLE'
and regexp_like(v_stm,'Add|Modify|Drop','i') ) then
insert into myAudit(ts,usr,evnt,stmt,sessionid,ip,terminal,os_user,auth_type,
object_type,object_name,client_info,module_info)
values(sysdate,v_olu,v_evt,v_stm,v_sct(1),v_sct(2),v_sct(3),v_sct(4),v_sct(5),
v_oty,v_don,v_sct(6),v_sct(7));
end if;
end;
myAudit
由于上述 INSERT 语句,通过重新创建表。
推荐阅读
- django - Django中的跟随按钮
- nats.io - 已发布消息是否发送到 NATS 集群中的所有节点?还是只针对具有本地订阅者的节点来接收消息的主题?
- visual-studio-code - VS Code 在编辑器中将“类型/参数”显示为标签
- embedded - 缓冲要在 UART 上发送的数据的最佳实践
- flutter - 每次设置状态时都会调用 Flutter 函数
- azure - 用于 WordPress 托管的不同 Azure 服务
- deep-learning - 如何保存克隆 pytorch 模块?创建一个新的更快吗?#Pytorch
- firebase - Firebase 身份验证不适用于 Cordova
- machine-learning - 是否在 GridSearchCV/RandomizedCV 中使用验证集?
- html - 为什么我不能使用弹性框将所有这些项目排序到一个列中