sqlserver에서 check절에 쿼리를 사용하게 되면은
이 컨텍스트에는 하위 쿼리를 사용할 수 없습니다. 스칼라 식만 사용할 수 있습니다.
이런 에러가 발생합니다.
그래서 트리거나 프로시저로 검사를 해줘야 하는데요. 트리거는 잘 사용을 못하고... 프로시저에서 검사를 해줘야 하면은 관련된 프로시저에 반복적으로 코딩을 해줘야 하는 번거로움이 있습니다.
그래서, 이런 경우에 사용할 수 있는 방법입니다.
check절에 사용하려는 쿼리를 스칼라값을 반환하는 함수로 만들어서 check절에 사용하면 원래의 목적을 얻을 수 있습니다.
간단히 셈플 코드를 보면은,
캐시 인지 표시하는 테이블 a가 있습니다.
create table a (col int, iscash tinyint);
그리고, 그 테이블에서 해당 col값이 캐시인지 검색하는 함수가 있습니다.
create function dbo.func (@col int)
returns int
as
begin
declare @ret int;
set @ret = (select iscash from dbo.a where col = @col);
return @ret;
end
go
이제 이 함수를 사용해서 check제약 조건을 사용하는 테이블을 만들어 보도록 하겠습니다.
create table b (col int check (dbo.func(col) = 1));
간단합니다.
테스트를 위해서 우선 a테이블에 검색용 데이터를 입력 합니다.
insert into dbo.a(col, iscash) values (1, 0), (2, 1);
그리고 b테이블에 데이터를 입력하면서 check제약 조건이 잘 동작하는지 확인해 보겠습니다.
우선 제약 조건을 위반하는 데이터를 넣으면
insert into dbo.b(col) values (1);
INSERT 문이 CHECK 제약 조건 "CK__b__col__297722B6"과(와) 충돌했습니다. 데이터베이스 "test", 테이블 "dbo.b", column 'col'에서 충돌이 발생했습니다.
이런 비슷한 에러가 발생합니다.
이번에는 제약 조건을 만족하는 데이터를 넣으면
insert into dbo.b(col) values (2);
정상적으로 입력이 됩니다.
저처럼 트리거를 잘 사용 못하는 분들은 한번 사용해 보세요. 트리거 잘 사용하시는 분들은 몰라요 - _-)a;;
Comment 4
-
이재학_302349
2012.03.19 23:38
-
카즈야마(이정우)
2012.03.20 08:50
트리거보다 위 방법으로 체크해야되는게 맞는거 아닌가요?
위 방법은 데이터 입력전 체크 제약조건을 타는거고
트리거는 일단 데이터넣고 제약조건에 위배 되는지를 체크하는거 아닌가요?
ㅡ.ㅡ; 제가 잘못알고있는건가요ㅠ.ㅠ
-
성이[SungE | 추교성]
2012.03.20 09:11
맞다 틀리다보단 방법을 알고 있느냐 모르느냐 차이 같아요. 모르면 프로시저에 넣던지 트리거를 걸던지 다른 방법을 사용하겠죠.
그리고, 트리거도 INSTEAD OF INSERT 트리거를 사용하면 대상 테이블에 입력 되기전에 검사할 수 있는 걸로 알고 있어요.
방법이야 사용하기 나름이니까요~ ~(_ ㅁ_)~
-
카즈야마(이정우)
2012.03.20 10:57
아하~ 그렇군요^^ 또 하나 배웠네여 ㅎㅎ 감사합니다~
아.. 좋은 내용입니다.
데이터와 가장 가까운 곳에서 비즈니스 룰을 체크하는 궁극의 스킬이죠~