2013-04-28 1 views
2

Я работаю над старой системой баз данных оракула (10 г), и у меня нет подробной информации о схеме. Мне нужно выяснить, удалит ли конкретную запись в таблице каскадные удаления в других таблицах. Я проверил триггеры. Но я не уверен в каскадировании из-за реляционных ограничений. Есть ли простой способ определить это?Oracle определить, будет ли удаление каскадом

+0

Я предполагаю, что я старею - 10g теперь устарело? – haki

ответ

8

Предполагая, что вы знаете (или можете определить) ограничение внешнего ключа (а) участие, вы можете посмотреть на DELETE_RULE колонки с DBA_CONSTRAINTS

SELECT constraint_name, delete_rule 
    FROM dba_constraints 
WHERE r_constraint_name = <<name of the primary key constraint>> 
    AND r_owner = <<owner of the primary key constraint>> 
    AND delete_rule = 'CASCADE' 

покажут вам все ограничения внешнего ключа, которые относятся к конкретному ограничение первичного ключа и каскадирование удалений. Если вас беспокоят ограничения, которые будут делать SET NULL, когда родительская строка будет удалена, вы можете искать строки, где delete_rule также был SET NULL.

Обратите внимание, что если вы не имеете прав на DBA_CONSTRAINTS таблице, вы можете использовать вместо ALL_CONSTRAINTS при условии, что вы на самом деле касается только с таблицами, которые у вас есть SELECT привилегии.

+0

Спасибо, Джастин! – vikas

+0

Почему бы не использовать '' 'user_constraints'''? – Ben

+1

@Ben - Вы, конечно, можете использовать 'user_constraints' или' all_constraints', если знаете, что у вас есть какие-либо ограничения или у вас есть доступ к любым таблицам, где существуют эти ограничения. Возможно, хотя, вероятно, маловероятно, что в другой схеме есть таблица, в которой у вас нет доступа «select» к этому имеет внешний ключ, который ссылается на таблицу в вашей схеме. В этом случае вам нужно использовать 'dba_constraints'. –

Смежные вопросы