2017-04-14 12 views
1

私はSQL Serverにデータベースを持っています。そこには顧客用のテーブルが1つあります。各顧客は複数の予約を行うことができますが、予約は1人の顧客にしか属しません。ポイントは、私はAPIを書いてからWPFを使ってクライアントサイドのアプリを書いたのですが、その顧客との関連する予約を実際に削除することなく、顧客を削除できないことに気がつきました。私のT-SQLは、おおよそ次のようになります。私は予約を既存たお客様を削除することはできません言ったようCASCADE DELETEを使用しない行の削除?

CREATE PROCEDURE DeleteCustomer 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DELETE FROM [dbo].[Customer] 
    WHERE Id = @Id 
END 
GO 

しかし:次に

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [FullName] [nvarchar](50) NOT NULL, 
    [DateOfBirth] [date] NOT NULL, 
    [Phone] [nvarchar](20) NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Booking](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Amount] [decimal](10,2) NOT NULL, 
    [CustomerId] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) 

ALTER TABLE [dbo].Booking WITH CHECK ADD CONSTRAINT [FK_Booking_Customer] FOREIGN KEY([CustomerId]) 
REFERENCES [dbo].[Customer] ([Id]) 
GO 
ALTER TABLE [dbo].[Booking] CHECK CONSTRAINT [FK_Booking_Customer] 
GO 

、私はこのように定義され、削除のストアドプロシージャを持っています。 1つの方法は確実にCASCADE DELETEを使用することですが、顧客が削除された場合でも予約を削除したくありません。どのようにして問題や回避策を克服するか?

+0

外部キーを削除するか、カスタムフラグを使用して顧客を削除します(これにより、必要に応じて削除を取り消すこともできます)。 – Marvin

+0

@Marvin何とか外部キーを取り除いて、削除してから外部キーを返すことは可能ですか? – typos

答えて

1

私が見るオプションは次のとおりです。

  1. は、外部キー列[CustomerId] NULL可能にします、そして、ソフト、例えば、Customerテーブルの上に削除on delete set null
  2. の使用を使用しますIsActiveまたはIsDeletedなどのビット列。
  3. 外部キーを無効にします。alter table [dbo].Booking nocheck constraint [FK_Booking_Customer]
  4. 外部キーを削除します。

ほとんどの場合、私はソフト削除オプションを実装します。

+0

オプションありがとうございます。私のシナリオでは最初のものがうまくいきます。 – typos

+0

@typosお手伝いします! – SqlZim

関連する問題