3

次のオブジェクトを SQL のテーブルとして想定してみましょう。

  • Companies
  • Employees(企業を指す)
  • Meetings(企業も指す)

また、従業員は会議に参加できるため、リンク テーブルがあります。

  • EmployeeMeetings(つまり、従業員と会議の両方への FK)

さらに、会社のテーブルに触れることはできません (たとえば、これに対するトリガーはありません)。私がしたいのは、次のことです。

  1. 会社が削除されると、すべての従業員が削除されます
  2. 会社が削除されると、すべての会議が削除されます
  3. 従業員または会議のいずれかが削除されると、すべてのEmployeeMeeting記録が削除されます

残念ながら、これが恐ろしい「サイクルまたは複数のカスケードパスを引き起こす可能性がある」ことを引き起こすため、私は立ち往生しています。制約がある場合、これをどのように回避しますか? 両方の FK を入れることさえできないと思います。または、会社を削除した後、FK がEmployeeMeetingsこれを防ぐため、従業員または会議のいずれかを削除できないというリスクがあります。右?

4

2 に答える 2

2

私があなただったら、トリガーとカスケード削除を完全に避けます。彼らは常に予期しない方法で動作します。

ストアド プロシージャは、トリガーやカスケード削除に比べて理解しやすいものです。したがって、会社の前に会議と従業員を削除するストアド プロシージャを作成します。

create procedure dbo.RemoveCompany(@companyId int)
as
delete * from employees where CompanyId = @companyId
delete * from meetings where CompanyId = @companyId
delete * from companies where Id = @companyId

さらに、ストアド プロシージャは、データベースとアプリケーションの間に明示的なコントラクトを作成します。

于 2011-02-14T21:50:58.700 に答える
2

会社から従業員へ、会社から会議へ、従業員から従業員会議へのカスケード削除を行います。EmployeeMeetings で削除するテーブル Meetings の削除後にトリガーを追加します。

create trigger Meetings_Delete on Meetings after delete
as
begin
  set nocount on;
  delete EmployeeMeetings
  from deleted
  where deleted.MeetingsID = EmployeeMeetings.MeetingsID
end
于 2011-02-14T21:51:42.303 に答える