0

5つのテーブルを持つデータベースがあります

[Person]
-PersonId PK
-First name
-Middle name
-Surname
-Type

[Resident]
-PersonId  PK FK
-AddressId PK FK


[Addresse]
-AddressId PK
-Road
-Number
-Postal code
-City
-Type

[TelephoneOwner]
-TelephoneId PK FK
-PersonId PK FK

[Telephone]
-TelephoneId PK
-TelephoneNumber 
-Type

すべての FK 制約が使用しています

ON DELETE CASCADE
ON UPDATE CASCADE

この関係は、個人が複数の住所を持つことができ、住所が複数の人を持つことができるということです。1 人の人が複数の Telephone を持つことができ、1 つの Telephone が複数の人を持つことができます。

ファーストネームを使用している人物に関連するものをすべて削除したいと思います。もちろん、他の人が使用した住所/電話番号はデータベースに残しておいてください。

4

1 に答える 1

0

外部キーを使用すると、PARENT テーブルを更新または削除すると、CASCADE は CHILD テーブルに影響を与えます。

Resident と TelephoneOwner の親テーブルである Person: から削除します。削除した人のレコードは、これら 2 つのテーブルから削除されます。Resident および TelephoneOwner から Telephone または Addresse にカスケードしません。これらのテーブルをきれいに保ちたい場合は、これらのテーブルを定期的にクリーンアップするジョブをスケジュールするか、Person にトリガーを追加して、所有者のいない電話番号または住所を残すかどうかを確認することができます。その場合は、電話番号または住所を削除してください。

リクエストごとに、トリガーの例を以下に示します。システムが絶えず削除と更新を行っている場合、トリガーによってパフォーマンスの問題が発生する可能性があることに注意してください。

    CREATE TRIGGER [dbo].[some_trigger_name]
        ON [dbo].[Person]
      FOR DELETE
    AS
    BEGIN
      SET NOCOUNT ON
    DELETE 
    FROM Addresse
    WHERE AddressId IN(-- Select the Addresses associated with people who were just deleted.
    SELECT R1.AddressId FROM DELETED JOIN Resident R1 on DELETED.PersonId  = R1.PersonId 
    EXCEPT
    -- Substract Addresses that have a Person associated with them other then a Person who was just deleted.
    SELECT R2.AddressId FROM Resident R2 
    WHERE R2.PersonId  NOT IN(SELECT PersonId  from DELETED))
    END
    GO

これを変更して更新したり、電話機を削除したりすることもできます。

于 2013-09-19T22:10:51.990 に答える