Есть ли чистый способ получить отношение таблица-триггер-столбец-последовательность? - PullRequest
2 голосов
/ 26 октября 2010

Я построил запрос на "наилучшее предположение", чтобы получить связанный table.column для последовательности. Есть ли лучший, более чистый метод, чтобы получить это отношение?

select ut.table_name, ut.table_owner, ut.trigger_name, us.sequence_name 
  ,upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner
)) triger_ddl
  ,to_char(regexp_substr(
     upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner))
    ,'.*(;|BEGIN)[^;]*' || us.sequence_name || '.NEXTVAL[^;]*;.*'
  )) sequence_stmt
  ,regexp_substr(
     to_char(regexp_substr(
        upper(dbms_metadata.get_ddl('TRIGGER', ut.trigger_name, ut.table_owner))
       ,'.*;|BEGIN[^;]*' || us.sequence_name || '.NEXTVAL[^;]*;.*'
     ))
    ,'(INTO[[:blank:]]*)*:NEW\.([[:alpha:]]+|"[^"]+")([[:blank:]]*:=)*'
  ) sequence_column
from user_triggers ut
    ,user_dependencies ud
    ,user_sequences us
  where UD.NAME = ut.trigger_name 
  and   ud.type = 'TRIGGER'
  and   UD.REFERENCED_NAME = us.sequence_name
  and   UD.REFERENCED_TYPE = 'SEQUENCE'

Мне это нужно для таблицы api code_generator, определяющей значение по умолчанию для процедуры вставки.

1 Ответ

1 голос
/ 27 октября 2010

Ответ, возможно, к сожалению, нет.В Oracle нет понятия взаимосвязи между последовательностью и столбцом таблицы.

Единственный полу-надежный способ его получения - это просмотр исходного кода (не только триггеров, но и любого кода, который вставляет),Вы также можете делать обоснованные предположения на основе следующего значения последовательности, которое должно (если все работает должным образом) быть немного выше максимального значения в столбце таблицы.

Если вам повезет,столбцы и последовательности были названы с использованием согласованного соглашения, например, «MYTABLE.MY_ID» всегда заполняется последовательностью с именем «MY_ID_SEQ» или чем-то другим.Но нет гарантии, что кто-то не нарушил соглашение.

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