триггер на схему

aldon
Дата: 24.11.2008 09:34:46
Всем, здравствуйте!

Создал тригер на схему.
create or replace trigger before_shema_changed
before ddl on SCHEMA ...

Он нормально работает, записывая все изменения в таблицу. Однако есть одно "но"... Если команда выполняется через процедуру

PROCEDURE ExecuteCommand(CommandText in varchar2)
IS
BEGIN
execute immediate CommandText;
END;


данные в таблицу не вставляются (похоже тригер при этом не запускается), хотя сама процедура при этом отрабатывает без ошибок. В чем может быть дело?
Заранее, спасибо.
aldon
Дата: 24.11.2008 09:48:29
Извиняюсь, одно уточнение. При локальном запуске процедуры, все отрабатывает нормально. Записи в таблице нет при запуске этой процедуры через DB линк.
Jannny
Дата: 24.11.2008 11:47:04
Вы можете продемонстрировать?
aldon
Дата: 24.11.2008 12:16:39
Как?

Это работает:
begin
ExecuteCommand('create table test (id number)');
end;
И это работает:
create table test (id number);

А так не работает.
begin
ExecuteCommand@DB_Link('create table test (id number)');
end;

Это сам тригер:

create or replace trigger before_shema_changed
before ddl on SCHEMA
declare
old_txt clob;
sql_rows ora_name_list_t;
rows NUMBER;
sql_txt clob := null;
prog schema_changes.program%type;
begin
begin
select program into prog from v$session where sid = (select SYS_CONTEXT('USERENV', 'SID') from dual);
exception
when others then prog := null;
end;
begin
rows := ora_sql_txt(sql_rows);
FOR i IN 1 .. rows LOOP
sql_txt := sql_txt || sql_rows(i);
END LOOP;
exception
when others then sql_txt := null;
end;
begin
case upper(ora_dict_obj_type)
when 'PACKAGE BODY' then
select dbms_metadata.get_ddl('PACKAGE', upper(ora_dict_obj_name)) into old_txt from dual;
else
select dbms_metadata.get_ddl(upper(ora_dict_obj_type), upper(ora_dict_obj_name)) into old_txt from dual;
end case;
exception
when others then old_txt := null;
end;
insert into schema_changes
(obj_type, obj_name, old_text, change_date, sh_user, os_user, user_host, user_ip, sql_text, ora_event, program)
values
(upper(ora_dict_obj_type), upper(ora_dict_obj_name), old_txt, sysdate, upper(user), upper(SYS_CONTEXT('USERENV', 'OS_USER')),
upper(SYS_CONTEXT('USERENV', 'HOST')), SYS_CONTEXT('USERENV', 'IP_ADDRESS'), sql_txt, upper(ora_sysevent), upper(prog));
end;
aldon
Дата: 24.11.2008 12:28:01
Может пример с созданием таблицы не совсем удачен. На самом деле тригер должен срабатывать при изменении объектов схемы user1. Но линк зарегистрирован с удаленной базы на user2. И нужно видеть когда объекты схемы user1 изменены самим user1, а когда их изменил user2.
_Alex_SMIRNOV_
Дата: 24.11.2008 14:08:26
aldon
Может пример с созданием таблицы не совсем удачен. На самом деле тригер должен срабатывать при изменении объектов схемы user1. Но линк зарегистрирован с удаленной базы на user2. И нужно видеть когда объекты схемы user1 изменены самим user1, а когда их изменил user2.


CREATE TRIGGER
SCHEMA
Specify SCHEMA to define the trigger on the current schema. The trigger fires whenever any user connected as schema initiates the triggering event.


Наверное тут нужен триггер на БД.
aldon
Дата: 24.11.2008 14:45:35
Спасибо за ответ, но полномочий на создание тригера на всю базу данных у меня нет. Я могу действовать только в пределах моей схемы.
Andrey.L
Дата: 24.11.2008 14:54:10
aldon
Спасибо за ответ, но полномочий на создание тригера на всю базу данных у меня нет. Я могу действовать только в пределах моей схемы.

Создай триггер БД вида:
if ora_dict_obj_owner = 'OWNER' then
  your_procedure();
end if;
и отдай тому кто может его там разместить. Думаю, проблем не будет.
aldon
Дата: 24.11.2008 15:01:12
Всем спасибо, попробую договориться с админами.
aldon
Дата: 25.11.2008 05:51:40
С админами договориться не удалось. А есть какие-то обходные пути, чтобы решить мою проблему со всеми возможными полномочиями, но только на мою схему?