我想在使用触发器创建表空间之前获取查询。通过网络搜索没有提供足够的信息。因此,如果有人对此有所了解,那将是一个很大的帮助。
我有一个过程xyz
,我想在创建表空间之前调用它。
我想在使用触发器创建表空间之前获取查询。通过网络搜索没有提供足够的信息。因此,如果有人对此有所了解,那将是一个很大的帮助。
我有一个过程xyz
,我想在创建表空间之前调用它。
11.2 文档并未明确禁止在创建表空间时使用 DDL 触发器,但在创建数据库或控制文件时确实如此:http: //docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC。
因此,没有任何迹象表明它不能完成。
最后想出了一个有效的触发器:
set serveroutput on;
CREATE OR REPLACE TRIGGER ddl_trig
BEFORE CREATE
ON DATABASE
DECLARE
sql_text DBMS_STANDARD.ora_name_list_t;
v_stmt VARCHAR2(2000);
n PLS_INTEGER;
BEGIN
IF (ora_dict_obj_type = 'TABLESPACE' ) AND (ora_sysevent = 'CREATE') THEN
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP
v_stmt := v_stmt || sql_text(i);
END LOOP;
dbms_output.put_line('------------Query Used---------------');
dbms_output.put_line(v_stmt);
END IF;
END ddl_trig;
/
show errors;
从Oracle Doc获得事件列表。我衷心感谢@David @Steve 的指点。
我可能是错的,但我认为您不能专门捕获 CREATE TABLESPACE:您可以创建一个 DDL 触发器,该触发器将捕获所有 CREATE 事件,但您必须进行一些检查以确保它是一个表空间创建。请记住,每次事件发生时都会为每个用户执行触发器,因此要非常小心。
这里有几个 DDL 触发器示例