반응형

n       CHECK 제약 조건

논리 연산자에 따라 TRUE 또는 FALSE 반환하는 논리식을 사용하여 CHECK 제약 조건을 생성할 있습니다. CHECK 제약 조건을 추가하면 데이터 무결성을 보장할 있을 아니라, CHECK 제약 조건에 위배되는 범위의 값을 조건절에서 검색하는 경우에는 실제로 테이블을 액세스하지 않고 결과를 바로 반환하므로 성능에도 도움이 됩니다. 이와 같이 성능에 도움이 되도록 하기 위해서는 CHECK 제약 조건을 WITH CHECK 옵션으로 생성해야 합니다.

하나에 여러 개의 CHECK 제약 조건을 적용할 있고, 테이블 내에서 테이블 단위로 CHECK 제약 조건을 만들어 여러 열에 적용할 수도 있습니다.

 

[따라하기] 열의 포맷 지정한 (컬럼) 단위의 CHECK 제약 조건 생성하기

CREATE TABLE ColCheckTest (

                           Seq int identity(1,1),

                           State char(3),

                           CONSTRAINT CK_State CHECK (State Like '[A-Z][0-9]S')

);

GO

 

[따라하기] 테이블 단위의 CHECK 제약 조건 생성하기

CREATE TABLE TblCheckTest (

                           Seq int identity(1,1),

                           MinValue int,

                           MaxValue int,

);

GO

ALTER TABLE TblCheckTest

ADD CONSTRAINT CK_Min_Max CHECK (MinValue <= MaxValue);

GO

 

CHECK 제약 조건은 FALSE 평가되는 값을 거부합니다. NULL 없는 값으로 평가되므로 식에 NULL 값이 있으면 제약 조건이 무시됩니다. 예를 들어 MyColumn = 10 같이 MyColumn 10 포함할 있도록 int MyColumn 대한 제약 조건을 지정한다고 가정합니다. MyColumn NULL 값을 삽입할 경우 SQL Server 2005 데이터베이스 엔진 에서는 NULL 삽입하고 오류를 반환하지 않습니다.

CHECK 제약 조건 정보는 동적 관린 sys.check_constraints에서 확인할 있습니다.

제약 조건에 직접 xml 데이터 형식 메서드를 사용할 없습니다. CHECK 제약 조건에서 xml 데이터 형식 메서드를 사용하고자 하는 경우에는 UDF 래퍼를 생성하여 xml 데이터 형식 메서드를 래핑하면 됩니다.  

Xml 데이터 형식 메서드를 직접 CHECK 제약 조건으로 생성하려고 하면 다음과 같은 오류가 반환됩니다.

 

메시지 423, 수준 16, 상태 16, 1

Xml 데이터 형식 메서드는 CHECK 제약 조건에서 지원되지 않습니다. 메서드 호출을 래핑하려면 스칼라 사용자 정의 함수를 만드십시오. 오류는 테이블 "XmlTest"에서 발생했습니다.

 

[따라하기] XML 데이터 형식 메서드를 활용하여 xml 열에 CHECK 제약 조건 생성하기

USE Tempdb

GO

CREATE FUNCTION my_udf(@var xml) returns bit

AS BEGIN

RETURN @var.exist('/ProductDescription/@ProductID')

END

GO

CREATE TABLE XMLCheckTest (

    Col1 int primary key,

    Col2 xml check(dbo.my_udf(Col2)=1))

GO

 

UDF 사용하여 보다 복잡한 CHECK 제약 조건의 생성이 가능합니다.

[따라하기] UDF 사용하여 CHECK 제약 조건 생성하기

-- 동일한 값은 행까지만 삽입하도록 하는 예제입니다.

USE tempdb;

GO

CREATE TABLE DoubleKeys(

                           key_col int NOT NULL,

                           Other char(1)

)

GO

CREATE FUNCTION dbo.fn_DoubleKeysCnt (@key AS INT) RETURNS INT

AS

BEGIN

  RETURN (SELECT COUNT(*) FROM DoubleKeys WHERE key_col = @key);

END

GO

-- UDF CHECK 제약 조건에 활용

ALTER TABLE DoubleKeys

  ADD CONSTRAINT CHK_DoubleKeys_NoMoreThanTwo

  CHECK (dbo.fn_DoubleKeysCnt(key_col) <= 2);

GO

-- 중복 데이터 INSERT

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

GO

-- 동일한 값은 건씩만 INSERT 되었음을 확인

SELECT * FROM DoubleKeys;

GO

 

n       DEFAULT 정의

열에 DEFAULT 정의가 있는 테이블로 행을 로드할 열에 대한 값이 지정되어 있지 않으면 SQL Server 2005 데이터베이스 엔진 에서 해당 열에 기본값을 삽입하도록 주는 기능입니다. NULL 허용하는 열을 사용하는 것은 바람직하지 않으므로 가능하면 열에 DEFAULT 정의를 정의하는 것이 보다 좋은 해결책입니다.

열에서 Null 값을 허용하지 않고 DEFAULT 정의도 없으면 열에 명시적으로 값을 지정해야 합니다. 그렇지 않으면 데이터베이스 엔진 열에서 NULL 값을 허용하지 않는다는 오류를 반환합니다.

반응형

+ Recent posts