Триггер для получения запроса табличного пространства перед созданием?

Я хотел бы получить запрос перед созданием табличного пространства с помощью триггера. Поиск в сети не дал достаточной информации. Так что будет очень полезно, если кто-то прольет свет на это.

У меня есть процедура xyz, которую я хочу вызвать перед созданием табличного пространства.


person learningloop    schedule 09.04.2013    source источник
comment
Создание табличного пространства внутри триггера? Чего именно вы пытаетесь достичь?   -  person Rene    schedule 09.04.2013
comment
@Rene Это не создание табличного пространства внутри триггера. Он захватывает событие создания табличного пространства до создания табличного пространства. Также захват запроса, используемого для создания табличного пространства, внутри триггера.   -  person learningloop    schedule 09.04.2013


Ответы (3)


Я могу ошибаться, но я не думаю, что вы можете специально зафиксировать CREATE TABLESPACE: вы можете создать триггер DDL, который будет перехватывать все события CREATE, но тогда вам придется выполнить некоторую проверку, чтобы убедиться, что это создание табличного пространства. Помните, что триггеры выполняются для каждого пользователя каждый раз, когда происходит событие, для которого они созданы, поэтому будьте с ними очень осторожны.

Несколько примеров триггеров DDL приведены здесь

person Steve Pettifer    schedule 09.04.2013

Документация 11.2 специально не запрещает триггеры DDL при создании табличного пространства, но запрещает при создании базы данных или управляющего файла: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CIHGCJHC.

Так что нет ничего, чтобы предположить, что это не может быть сделано.

person David Aldridge    schedule 09.04.2013

Наконец придумал триггер, который работает:

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 за подсказки.

person learningloop    schedule 10.04.2013
comment
Без проблем. Единственное, что я хотел бы сказать, это то, что я думаю, что этот триггер будет срабатывать каждый раз, когда любой пользователь выполняет любой оператор DDL в базе данных. Я подозреваю, что если бы вы изменили его на BEFORE CREATE, это помогло бы. Всегда полезно ограничивать запуск чего-либо только тогда, когда это необходимо, насколько это возможно, ради производительности. - person Steve Pettifer; 10.04.2013
comment
@StevePettifer Спасибо, прежде чем создавать, нужно, и ваша точка зрения на производительность является подходящим предложением. - person learningloop; 10.04.2013