私は現実的な目的のために、現時点でいくつかのトリガーと制約を伴うデータベースを作成しています。PL/SQLでトリガの制約を削除する方法は?
指定された行を削除する前に、私のトリガーの1つが列の値を0に設定する必要がありますが、削除では制約が機能しません... BEFORE DELETE
その後、もう1つのテーブルADD
私は再び2番目のトリガーを使用します。私はそれが仕事を得ることができますしかし
:
ALTER TABLE teams ADD CONSTRAINT teams_to_trainer FOREIGN KEY (coda)
REFERENCES trainer(coda);
--insert values
--...
--Procedure in which I execute the alter table commands
CREATE OR REPLACE PROCEDURE constraint_operation (p_hardcod IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
resource_busy EXCEPTION;
PRAGMA EXCEPTION_INIT(resource_busy,-54);
BEGIN
EXECUTE IMMEDIATE p_hardcod;
EXCEPTION
WHEN resource_busy
THEN
DBMS_LOCK.SLEEP(5);
COMMIT;
END;
/
--My Two Triggers
CREATE OR REPLACE TRIGGER delete_trainer
BEFORE DELETE
ON trainer
FOR EACH ROW
BEGIN
constraint_operation('ALTER TABLE teams DROP CONSTRAINT teams_to_trainer');
UPDATE teams SET coda = 0 WHERE :old.coda = coda;
END;
/
CREATE OR REPLACE TRIGGER delete_trainer_add_constraint
AFTER DELETE
ON trainer
FOR EACH ROW
BEGIN
constraint_operation('ALTER TABLE teams ADD CONSTRAINT teams_to_trainer
FOREIGN KEY (coda)REFERENCES trainer(coda)');
END;
/
そして呼び出すとき:
DELETE FROM trainer WHERE coda = 14;
私はこの取得:
SQL Error: ORA-02291: integrity constraint (USER.TEAMS_TO_TRAINER) violated - parent key not found 02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found" *Cause: A foreign key value has no matching primary key value. *Action: Delete the foreign key or add a matching primary key.
を、私は、問題を見つけるように見えることはできません、私はプロシージャを呼び出すことが制約を削除すると思った。
私は間違っていますか?
ありがとうございます。
ここであなたはDMLを動作させるために制約を無効にした場合はトレーナーにデフォルト/ダミー行を追加することですあなたのデザインに深刻な問題があり、それを再考する必要があります。 – OldProgrammer
制約を無効にしてチャーンを減らすことはできますが、アイデア全体には再考が必要です。行がビジー状態のときにスリープするコードでは、トランザクションの終了を延期するだけです。これはスケールされません。必要なことを表の説明とともに教えてください。 – kevinsky
なぜ制約を完全に取り除かず、 'before insert'トリガーで外部キーが存在するかどうかをチェックし、そうでなければ例外を送出します。 – Utsav