2016-02-04 2 views
2

У меня есть две таблицы, называемые пациентом и аптекой. Каждый пациент однозначно связан с одной аптекой. Я хочу создать ограничение внешнего ключа во время выполнения между этими таблицами.Как создать внешний ключ во время выполнения с использованием триггеров и/или процедур в среде Oracle

Create table patient 
(patient_Id varchar2(5) primary key, 
patient_name varchar2(20)); 

Create table pharmacy 
(pharmacy_Id varchar2(5) primary key, 
pharmacy_name varchar2(20); 

Create table patient_pharmacy_mapper 
(patient_Id varchar2(5) references patient(patient_Id), 
pharmacy_Id varchar2(5) references pharmacy(pharmacy_Id)); 

Вместо написания «ссылки» во время разработки, Могу ли я создать/удалить эти ограничения внешнего ключа во время выполнения (когда какое-либо заявление пожаров DML)?

Я мало знаю о создании триггера, где мы должны вызвать процедуру с помощью оператора «Alter table».

+3

Возможно, вы попытаетесь достичь этого с помощью 'Dynamic SQL', хотя любая команда DDL перенесет все ваши транзакции. Кроме того, почему вы хотите манипулировать своими ограничениями в своих триггерах ?! Похож на действительно плохую идею/дизайн для меня (если мне не хватает чего-то или не хватает знаний Oracle DB?). – AndrewMcCoist

+0

Я пытаюсь изолировать таблицы друг от друга для целей безопасности. –

+0

Вот некоторые ссылки, вы можете прочитать [Native Dynamic SQL] (https://oracle-base.com/articles/8i/native-dynamic-sql), [Кодирование динамического SQL] (https://docs.oracle .com/CD/B19306_01/appdev.102/b14251/adfns_dynamic_sql.htm) – AndrewMcCoist

ответ

5

Заявления DDL автоматически фиксируют транзакцию. Как вы не можете совершить (или откат) в качестве триггера, вы можете не запуска DDL заявления в качестве триггера (ни со статическим SQL, ни с динамическим SQL)


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

1

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

0

Как и другие заявления, я также говорю, что это очень плохая идея.

Рассмотрите, может быть enable/disable ограничений или вы можете установить их отложенные: SET CONSTRAINT[S] Возможно, это решение проблемы.

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