0

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

我有一个过程xyz,我想在创建表空间之前调用它。

4

3 回答 3

1

11.2 文档并未明确禁止在创建表空间时使用 DDL 触发器,但在创建数据库或控制文件时确实如此:http: //docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC

因此,没有任何迹象表明它不能完成。

于 2013-04-09T14:00:37.440 回答
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 的指点。

于 2013-04-10T05:28:48.067 回答
1

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

这里有几个 DDL 触发器示例

于 2013-04-09T13:46:03.367 回答