1

この特定の属性 ( Sportcode) があるので、トリガーを記述して更新カスケードを実装するよう求められます。この特定の属性を次の表に示します。

スポーツ

Sportcode       sport name                     sport event no
--------------- ------------------------------ ---------------
AR              Archery                               2 
AT              Athletics                             3 
BD              Badminton                             4 
BK              Basketball                            6 
BS              Baseball                              5 
BV              Beach Volleyball                     26 

トリガーを使用して更新カスケードを実装するにはどうすればよいSportcodeですか?


編集:

これが私がやるべきことかどうかはわかりませんが、次のようなものを思いつきました:

CREATE OR REPLACE TRIGGER Sportcode_Upd_Cas
  BEFORE UPDATE OF Sportcode ON sports
  FOR EACH ROW
BEGIN
  UPDATE sports
    SET Sportcode =:new.Sportcode
    WHERE Sportcode =:old.Sportcode;

  DBMS_OUTPUT.PUT_LINE('Corresponding Sportcode in the Sports table has also been updated');
END; 
4

4 に答える 4

1

DISCIPLINEそれが親テーブルでDISCIPLINE_CHILDあり、子テーブルであると仮定します。

CREATE OR REPLACE TRIGGER discipline_code_update
 AFTER UPDATE OF discipline_code ON discipline FOR EACH ROW
BEGIN
    UPDATE discipline_child
       SET discipline_code = :new.discipline_code
     WHERE discipline_code = :old.discipline_code;
END;
/

ステートメントに が含まれていOF discipline_codeない場合にトリガーが起動しないように、を含めました。discipline_codeUPDATE

于 2012-09-11T02:30:29.790 に答える
1

DISCIPLINE_CODE がテーブルの主キーである場合は、絶対に変更しないでください。主キーには 3 つの属性があることを思い出してください。

  1. ヌルではありません
  2. ユニークで、
  3. それは決して変更されません。

#3の理由はまさにあなたが今直面していることです.主キーを変更すると、データベース全体のその行への既存の参照もすべて変更する必要があります. これが、主キーを決して変更してはならない理由です。

Oracle は最初の 2 つを強制しますが、私が遭遇したデータベースで #3 を強制するものはありません。このテーブルの DISCIPLINE_CODE を変更している場合、定義上、それは実際には PRIMARY KEY ではありません。それを行うコードを書くことはできますが、それは本当に悪い考えです。

于 2012-09-11T11:15:55.953 に答える
1

OracleマニュアルによるとUPDATE CASCADE、参照キーを提供せずに効果を達成するには、次のようなことを行います。

create table p (p1 number constraint ppk primary key); 
create table f (f1 number constraint ffk references p); 
create trigger pt after update on p for each row begin
  update f set f1 = :new.p1 where f1 = :old.p1;
end;
/
于 2012-09-11T01:42:56.323 に答える
0

UPDATE CASCADE を実装する際の落とし穴は、@bob-jarvis が言及したもの以外の別の理由です。複数行の更新には注意が必要です。値が再利用される可能性があり、あるレコードの AFTER 値が別のレコードの BEFORE と重複する可能性がある場合、その結果、子行が複数回更新され、別の親に移行されます。

例:

1
2

1
2

実行後:

update parent set id = id + 1

あなたが得る:

2
3

3
3

キー値を再利用しないか、トリガーで同じ行を 2 回更新しないロジックを実装するか、このアプローチをまったく使用せず、真に不変の主キーを使用することをお勧めします。

于 2017-01-06T00:27:26.837 に答える