如何在触发器中得到触发的SQL语句?
想写一个由DDL触发的触发器,如何在触发器中得到这个DDL语句?
如果是一个由DML触发的触发器,能不能在触发器中得到这个DML语句呢?
这个问题没有人感兴趣么?
没看明白
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address and username='uname';
试试
获得单个对象的DDL语句
set heading off
set echo off
set feedback off
set pages off
set long 90000
select dbms_metadata.get_ddl(‘TABLE’,’TABLENAME’,’SCAME’) from dual;
如果获取整个用户的脚本,可以用如下语句
select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
当然,如果是索引,则需要修改相关table到index
获取视图脚本:
SEELCT DBMS_METADATA.GET_DDL('VIEW','YOURVIEWNAME') FROM DUAL;
beckhambobo(beckham
我试了,不行。
select dbms_metadata.get_ddl(‘TABLE’,’TABLENAME’,’SCAME’) from dual;
得到的是某张表的建表语句,而且要指定表名、方案名。
select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
得到的是所有用户表的建表语句。
而我是想实现一个触发器,在用户修改任意一张表时,得到他修改表结构的ddl语句,触发器代码如下(现在客户的机器名、时间、oracle用户名都能够得到,就是不能得到用户该库结构的ddl语句,怎么办呐!!):
CREATE OR REPLACE TRIGGER "GZGUEST"."TRG_ALTER" AFTER
ALTER ON DATABASE declare
PM_NAME VARCHAR2(500);
PM_IP_ADDRESS VARCHAR2(500);
PM_USERNM VARCHAR2(500);
PM_HOST VARCHAR2(50);
PM_SESSIONID VARCHAR2(50);
PM_OSUSERNM VARCHAR2(50);
PM_SID NUMBER;
CURRENT_SQL VARCHAR2(500);
PM_SQLTXT VARCHAR2(2000);
PM_SQLADDR VARCHAR2(100);
INSTERR EXCEPTION;
BEGIN
PM_NAME := 'ALTER';
PM_SQLTXT:= '';
SELECT DISTINCT(SID) INTO PM_SID FROM V$MYSTAT;
SELECT SYS_CONTEXT ('USERENV', 'CURRENT_SQL') INTO CURRENT_SQL FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') INTO PM_USERNM FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'HOST') INTO PM_HOST FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'IP_ADDRESS') INTO PM_IP_ADDRESS FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'SESSIONID') INTO PM_SESSIONID FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'OS_USER') INTO PM_OSUSERNM FROM DUAL;
-- select TO_CHAR(dbms_metadata.get_ddl('TABLE','TEMP_SPACE','GZGUEST')) into CURRENT_SQL from dual;
select TO_CHAR(dbms_metadata.get_ddl('TABLE',u.table_name)) INTO CURRENT_SQL from user_tables u;
INSERT INTO GZGUEST.TEMP_CRONTAB (NAME,TM,USERNM,CLHOST,IPADDRESS,SESSIONID,ADTSESSIONID,OSUSERNM,SQLTXT,CURSORID)
values(PM_NAME,SYSDATE,PM_USERNM,PM_HOST,PM_IP_ADDRESS,PM_SID,PM_SESSIONID,PM_OSUSERNM,PM_SQLTXT,CURRENT_SQL);
EXCEPTION
WHEN INSTERR THEN
RETURN;
END;。
商业版发布站程序下载:发布站程序下载:
如果是一个由DML触发的触发器,能不能在触发器中得到这个DML语句呢?
这个问题没有人感兴趣么?
没看明白
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address and username='uname';
试试
获得单个对象的DDL语句
set heading off
set echo off
set feedback off
set pages off
set long 90000
select dbms_metadata.get_ddl(‘TABLE’,’TABLENAME’,’SCAME’) from dual;
如果获取整个用户的脚本,可以用如下语句
select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
当然,如果是索引,则需要修改相关table到index
获取视图脚本:
SEELCT DBMS_METADATA.GET_DDL('VIEW','YOURVIEWNAME') FROM DUAL;
beckhambobo(beckham
我试了,不行。
select dbms_metadata.get_ddl(‘TABLE’,’TABLENAME’,’SCAME’) from dual;
得到的是某张表的建表语句,而且要指定表名、方案名。
select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
得到的是所有用户表的建表语句。
而我是想实现一个触发器,在用户修改任意一张表时,得到他修改表结构的ddl语句,触发器代码如下(现在客户的机器名、时间、oracle用户名都能够得到,就是不能得到用户该库结构的ddl语句,怎么办呐!!):
CREATE OR REPLACE TRIGGER "GZGUEST"."TRG_ALTER" AFTER
ALTER ON DATABASE declare
PM_NAME VARCHAR2(500);
PM_IP_ADDRESS VARCHAR2(500);
PM_USERNM VARCHAR2(500);
PM_HOST VARCHAR2(50);
PM_SESSIONID VARCHAR2(50);
PM_OSUSERNM VARCHAR2(50);
PM_SID NUMBER;
CURRENT_SQL VARCHAR2(500);
PM_SQLTXT VARCHAR2(2000);
PM_SQLADDR VARCHAR2(100);
INSTERR EXCEPTION;
BEGIN
PM_NAME := 'ALTER';
PM_SQLTXT:= '';
SELECT DISTINCT(SID) INTO PM_SID FROM V$MYSTAT;
SELECT SYS_CONTEXT ('USERENV', 'CURRENT_SQL') INTO CURRENT_SQL FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') INTO PM_USERNM FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'HOST') INTO PM_HOST FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'IP_ADDRESS') INTO PM_IP_ADDRESS FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'SESSIONID') INTO PM_SESSIONID FROM DUAL;
SELECT SYS_CONTEXT ('USERENV', 'OS_USER') INTO PM_OSUSERNM FROM DUAL;
-- select TO_CHAR(dbms_metadata.get_ddl('TABLE','TEMP_SPACE','GZGUEST')) into CURRENT_SQL from dual;
select TO_CHAR(dbms_metadata.get_ddl('TABLE',u.table_name)) INTO CURRENT_SQL from user_tables u;
INSERT INTO GZGUEST.TEMP_CRONTAB (NAME,TM,USERNM,CLHOST,IPADDRESS,SESSIONID,ADTSESSIONID,OSUSERNM,SQLTXT,CURSORID)
values(PM_NAME,SYSDATE,PM_USERNM,PM_HOST,PM_IP_ADDRESS,PM_SID,PM_SESSIONID,PM_OSUSERNM,PM_SQLTXT,CURRENT_SQL);
EXCEPTION
WHEN INSTERR THEN
RETURN;
END;。
商业版发布站程序下载:发布站程序下载:
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论