2011-08-26 3 views
1

2 편집 다음과 같이 관련 기능의 소스 코드입니다. Scaler Function/CHECK CONSTRAINT 작업으로이 기능이 필요합니다. 실제 배치는 그렇게 간단하지 않습니다.간단한 점검 제한 조건 그렇게 간단하지

원래의 질문 : 나는 FileID에 당신은을 삽입 할 수 1의 FileTypeId에 ​​대한 고유되도록 점검 제한 조건을 작성해야 fileURI 내

FileUriId, FileID에, FileTypeId

이름은 다음 표를 가정 FileTypeId 1.

접근 방식입니다 당신이 원하는만큼,하지만 하나의 행 같은 FileID에는 작동하지 않았다 :

1) dbo.fn_CheckFileType를 아이디 수익률은 다음과 같은 논리 INT :

내가 FileID에 1 삽입 ALTER TABLE FileUri ADD CONSTRAINT CK_FileUri_FileTypeId CHECK dbo.fn_CheckFileTypeId(FileId) <= 1가 두 번 FileTypeId 1, 두 번째 삽입이 허용 SELECT Count(FileId) FROM FileUri WHERE FileTypeId = 1

2).

감사합니다!

답변

4

당신은 필터링 된 고유 인덱스를 생성해야합니다 (SQL 서버 2008)

CREATE UNIQUE NONCLUSTERED INDEX ix ON YourTable(FileId) WHERE FileTypeId=1 

또는 중복 WHERE FileTypeId 약 인덱싱 된 뷰 (2000 및 2005)

CREATE VIEW dbo.UniqueConstraintView 
WITH SCHEMABINDING 
AS 
SELECT FileId 
FROM dbo.YourTable 
WHERE FileTypeId = 1 

GO 
CREATE UNIQUE CLUSTERED INDEX ix ON dbo.UniqueConstraintView(FileId) 
+0

이것은 발언을위한 것입니다. 샘플은 단순화 된 것이 었습니다. 내 사과. 실제 인스턴스는 점검 제한 조건으로 작동해야합니다. –

+0

@Eric - [스냅 샷 격리를 사용하지 않는 한] (http://sqlblog.com/blogs/hugo_kornelis/archive/2006/09/15/Snapshot-and-integrity-part-4.aspx) 일반적인 접근 방법 인덱스 기반 제약 조건만큼 효율적으로 작동하지 않아야하는 것처럼 보입니다. 스냅 샷을 사용하고 있습니까? 기능 코드에 오류가 없다고 확신합니까? 따로 테스트 해 봤니? –

+0

필자는 (예측 가능하게) 내 스키마를 약간 수정하고 제안한 단순한 고유 제한 방법을 사용할 수있었습니다. 목례. –

1

FieldTypeID와 Field를 모두 테이블의 기본 키로 지정하지 않는 이유는 무엇입니까?

또는 적어도 테이블의 고유 색인. 그것은 당신의 문제를 해결해야합니다.

+0

영업 이익은 관심과이 시뮬레이션 = 1 –

+0

@ Martin Smith, 감사합니다. 나는이 질문에 대해 오해했습니다. – Icarus

+0

노력을위한 Upvote. 너는 옳은 줄을 따라 갔다, 고마워! –

관련 문제