Триггеры Oracle не отображаются в DBA_SOURCE - PullRequest
4 голосов
/ 30 ноября 2011

В нашем приложении только около 25% триггеров базы данных отображаются в DBA_SOURCE. Я знаю, что могу заставить других появиться, если я сделаю реальную модификацию (например, добавление и удаление пробела), а затем перекомпилирую триггер, но у меня есть около 400 триггеров для модификации (это довольно большое приложение). Перекомпиляция триггеров с alter trigger <triggername> compile; ничего не дала.

Без триггеров в DBA_SOURCE мы не сможем выполнить текстовый поиск по коду триггера.

Есть ли какой-нибудь более простой способ сделать это? И есть ли способ предотвратить проблему в будущем?

Мы находимся на Oracle 10.2.0.5.0.

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

Я полагаю, вы можете найти источник в all_triggers. К сожалению, данные находятся в переменной LONG (пример Oracle - делать как я говорю, а не как я). Таким образом, проще всего было бы создать таблицу для использования, заполнить ее данными, преобразованными в CLOB, а затем выполнить поиск:

CREATE TABLE tr (trigger_name VARCHAR2(32), trigger_body CLOB);

INSERT INTO tr 
 (SELECT trigger_name, TO_LOB(trigger_body)
    FROM all_triggers
   WHERE owner = 'xxx');

SELECT trigger_name
  FROM tr
 WHERE trigger_body LIKE '%something%';

Я не уверен, почему представление dba_source заполнено только для триггеров. Так же и в моей базе данных 10.2.0.4.

EDIT:

Вот короткий скрипт, который вы можете использовать для воссоздания всех ваших триггеров, и в этот момент все они должны быть в dba_source:

CREATE TABLE temp_sql (sql1 CLOB, sql2 CLOB);

INSERT INTO temp_sql (sql1, sql2) (
SELECT 'CREATE OR REPLACE TRIGGER '||
       DESCRIPTION||' '||CASE WHEN when_clause IS NULL THEN NULL ELSE 'WHEN('||when_clause||')' END sql1,
       to_lob(trigger_body) sql2
  FROM all_triggers
 WHERE table_owner = 'theowner');

DECLARE
  v_sql VARCHAR2(32760); 

BEGIN
  FOR R IN (SELECT sql1||' '||sql2 S FROM temp_sql) LOOP
    v_sql := R.s;
    EXECUTE IMMEDIATE v_sql;
  END LOOP;
END;
/
2 голосов
/ 01 декабря 2011

У нас была такая же проблема. Это проблема миграции с более старых версий Oracle.

Триггеры не были включены в DBA_SOURCE в более ранней версии (8 ?, 9i?) И не добавлялись в DBA_SOURCE при миграции на более новые версии. Перекомпиляция не помещала их в DBA_SOURCE. Но если вы удалите и заново создадите триггеры, они будут включены в DBA_SOURCE.

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

0 голосов
/ 30 ноября 2011

Кому принадлежат триггеры?

и, конечно, вы пытались

выбрать владельца, имя_объекта из всех_объектов, где object_type = 'TRIGGER' и владелец в ('schema1', 'schema2')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...