2014-10-30 1 views
1

나는 두 개의 테이블이있다. 내가하고 싶은 일은 동의어 + gettypeforvalue (value)가 고유하지 않으면 더 많은 동의어를 추가하는 것을 거부하는 것입니다.고유 제약 호출하는 사용자 정의 함수

예. (동의어 + 값의 관련 유형이 고유하지 않은)

primarytable: 
------------- 
value  | type 
-------------|--------- 
Toyota F-150 | carmake 
GMC Canyon | carmake 

secondarytable: 
--------------- 
value  | synonym 
-------------|--------------- 
Toyota F-150 | toyota pickup 
GMC Canyon | gmc pickup 

는 OK이지만,

primarytable: 
------------- 
value  | type 
-------------|---------------- 
Toyota F-150 | carmake 
GMC Canyon | carmake 

secondarytable: 
--------------- 
value  | synonym 
-------------|----- 
Toyota F-150 | pickup 
GMC Canyon | pickup 

는 확인 안됩니다.

내가 함수

create function uf_getTypeForValue(@value nvarchar(50)) 
    returns nvarchar(50) 
as 
begin 
    return (select type from primarytable p where p.value = @value) 
end 
다음 secondarytable에 고유 제한 조건을 추가하고 시도 그러나

alter table secondarytable add constraint uc_secondarytable_synonym_unique_for_type 
unique (synonym, uf_getTypeForValue(value)) 

을, 나는 성공적으로 불렀다이 Incorrect syntax near '('.

에 오류 메시지가 함수는 전에 check -constraints에서, 그래서 분명히 고유 한 제약 조건으로 그렇게 할 수 없습니까?

내가 알고 있어야하는 구문 트릭이 있습니까? 아니면 어떻게 다른 방식으로이 작업을 수행 할 수 있습니까?

답변

0

here 구문에서 고유 제한 조건에 대해서만 열을 사용할 수 있다고 생각합니다. 그러나 "CHECK"제약 조건에는 논리식이 포함될 수 있습니다. 그래서 그것을 사용하여 그것을 성취 할 수 있습니다. 과 같이 함수 내에서 당신의 행 수 쿼리를 확인하십시오

--drop function NumberOfSimilarRows 
CREATE FUNCTION NumberOfSimilarRows(@synonymToCheck nvarchar(50), @valueToCheck nvarchar(50)) 
RETURNS int 
AS 
BEGIN 
    DECLARE @rowcount int 
    SELECT @rowcount = COUNT(*) FROM secondarytable WHERE synonym = @synonymToCheck and value = dbo.uf_getTypeForValue(@valueToCheck) 
    RETURN @rowcount 
END; 

그런 다음 당신이 그렇게 같은 CHECK 제약 조건에서 사용할 수 있습니다 :

ALTER TABLE secondarytable 
ADD CONSTRAINT uc_secondarytable_synonym_unique_for_type 
CHECK (dbo.NumberOfSimilarRows(synonym, value) <= 1); 
+0

또한 트리거를 통해 확인 할 수 ... 확실하지하는 더 나은. – Anssssss