2017-03-13 3 views
2

1 대 다수 관계가있는 두 개의 표 머리글 및 항목이 있습니다.C# 또는 SQL에 데이터 삽입 또는 업데이트 금지

헤더 테이블

Id  StartDate EndDate 
--------------------------------------- 
1  1999/1/1 1999/5/1   
2  2000/1/1 2000/4/1 
3  2000/1/1 2000/5/1 

및 항목 표

HeaderRef=3에 항목을 추가하려면 방지하는 방법
Id  HeaderRef SLRef 
------------------------------------- 
101  1   201 
102  2   201 

SLRef=201이 같은 SLRef, 그리고 그것에 HeaderRef referd이 StartDate and EndDate이있는 헤더 행을 가지고 있기 때문에 해당 범위의 Header을 참조한 다른 항목이 SLRef입니다. 다른 사용자에 의해 제안

1) 트리거를 사용하여 당신을 가정하면

+1

삽입/업데이트 트리거를 사용해 보셨습니까? 쓸 수 있습니다. – pwas

+1

ItemTable에서 headerRef 및 SLRef를 고유하게 유지 하시겠습니까? –

+1

예 Hedar에 추가 된 날짜 범위에서 headerRef 및 SLRef를 고유하게 유지하려고합니다. –

답변

2

당신이 찾고있는 무엇을 실현하려 두 가지 방법이 있습니다 MS SQL 서버를 사용하고 있습니다. 트리거는 INSERT/UPDATE에 해당하며 날짜 범위를 확인하고 새 값을 추가하거나 오류를 발생시킵니다.

2) 당신은 ItemTable에 복합 기본 키를 사용할 수 있습니다

CREATE TABLE [dbo].[ItemTable](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [HeaderRef] [int] NOT NULL, 
    [SLRef] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [HeaderRef] ASC, 
    [SLRef] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

지금이 headerRef 및 SLRef INT 값 (키)의 중복 조합을 허용하지 않습니다 ItemTable 및 SQL Server에 제약을 둘 것이다.

돌아 가기 당신은 당신의 HeaderTable, 당신은 이제 시작 및 종료 날짜 HeaderTable에 고유 인덱스를 생성 시작과 종료 날짜

CREATE TABLE [dbo].[HeaderTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [STARTDATE] [datetime] not NULL, 
    [ENDDATE] [datetime] not NULL, 
CONSTRAINT [PK_HeaderTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

의 범위를 중복 중지 고유 제한 조건을 넣을 수 있습니다.

/****** Object: Index [IX_HeaderTable] Script Date: 03/13/2017 12:24:51 ******/ 
CREATE UNIQUE NONCLUSTERED INDEX [IX_HeaderTable] ON [dbo].[HeaderTable] 
(
    [ENDDATE] ASC, 
    [STARTDATE] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

HeaderTable에 또 다른 제약 조건을 추가하여 시작 날짜가 종료 날짜보다 이전인지 여부를 확인할 수 있습니다.

ALTER TABLE [dbo].[HeaderTable] WITH CHECK ADD CONSTRAINT [CheckEndLaterThanStart] CHECK (([ENDDATE]>=[STARTDATE])) 
GO 

ALTER TABLE [dbo].[HeaderTable] CHECK CONSTRAINT [CheckEndLaterThanStart] 
GO 

희망이 있습니다.

1

DML 트리거를 찾는 중입니다. 간단히 말해서 사용자가 데이터베이스의 데이터를 추가 또는 제거하여 데이터를 변경하려고 할 때 자동으로 호출되는 일종의 SQL 함수 또는 트리거입니다. 또한 트리거 본체 일부 유효성 검사 논리를 포함 할 수 있으므로 특정 조건을 충족하지 않으면 데이터를 삽입하지 않습니다.