2016-05-09 11 views
0

私は現実的な目的のために、現時点でいくつかのトリガーと制約を伴うデータベースを作成しています。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.

を、私は、問題を見つけるように見えることはできません、私はプロシージャを呼び出すことが制約を削除すると思った。

私は間違っていますか?

ありがとうございます。

+4

ここであなたはDMLを動作させるために制約を無効にした場合はトレーナーにデフォルト/ダミー行を追加することですあなたのデザインに深刻な問題があり、それを再考する必要があります。 – OldProgrammer

+1

制約を無効にしてチャーンを減らすことはできますが、アイデア全体には再考が必要です。行がビジー状態のときにスリープするコードでは、トランザクションの終了を延期するだけです。これはスケールされません。必要なことを表の説明とともに教えてください。 – kevinsky

+0

なぜ制約を完全に取り除かず、 'before insert'トリガーで外部キーが存在するかどうかをチェックし、そうでなければ例外を送出します。 – Utsav

答えて

1

TEAMSの外部キー列を、TRAINERの参照される主キーに存在しない値に更新しています。

FK制約が必要な場合は、簡単な修正は、その後、CODAの値が0

関連する問題