触发在创建之前获取表空间查询?

时间:2013-04-09 13:29:12

标签: oracle triggers tablespace

我想在使用trigger创建表空间之前获取查询。通过网络搜索没有提供足够的信息。所以,如果有人对此有所了解,那将是一个很大的帮助。

我有一个程序xyz,我希望在创建表空间之前调用它。

3 个答案:

答案 0 :(得分:1)

我可能错了,但我认为你不能专门捕获CREATE TABLESPACE:你可以创建一个DDL触发器,它将捕获所有CREATE事件但你必须做一些检查确保它是一个表空间创建。记住触发器是在每次创建事件时为每个用户执行的,因此要非常小心。

有一些DDL触发器的例子here

答案 1 :(得分:1)

11.2文档并未明确禁止在create tablespace上使用DDL触发器,但在create database或controlfile上执行:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC

所以没有任何迹象表明它无法完成。

答案 2 :(得分:1)

最后提出了一个有效的触发器:

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的指示。