A. 새 열을 추가하도록 테이블 변경
다음 예제는 null 값을 허용하고 DEFAULT 정의를 통해 제공된 값이 없는 열을 추가합니다. 각 행은 새 열에 NULL을 가집니다.
CREATE TABLE doc_exa ( column_a INT)
GO
ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL
GO
EXEC sp_help doc_exa
GO
DROP TABLE doc_exa
GO
B. 열을 삭제하도록 테이블 변경
다음 예제는 열을 삭제하도록 테이블을 수정합니다.
CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE doc_exb DROP COLUMN column_b
GO
EXEC sp_help doc_exb
GO
DROP TABLE doc_exb
GO
C. 제약 조건이 있는 열을 추가하도록 테이블 변경
다음 예제는 UNIQUE 제약 조건이 있는 새 열을 추가합니다.
CREATE TABLE doc_exc ( column_a INT)
GO
ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE
GO
EXEC sp_help doc_exc
GO
DROP TABLE doc_exc
GO
D. 검사되지 않은 제약 조건을 추가하도록 테이블 변경
다음 예제는 테이블의 기존 열에 제약 조건을 추가합니다. 이 열에는 제약 조건을 위반하는 값이 있으므로 기존 행에 대해 유효성 검사를 하지 않고 제약 조건을 추가하도록 WITH NOCHECK을 사용해야 합니다.
CREATE TABLE doc_exd ( column_a INT)
GO
INSERT INTO doc_exd VALUES (-1)
GO
ALTER TABLE doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1)
GO
EXEC sp_help doc_exd
GO
DROP TABLE doc_exd
GO
E. 제약 조건이 있는 여러 열을 추가하도록 테이블 변경
다음 예제는 제약 조건이 정의된 여러 열을 새로 추가합니다. 첫 번째 새 열은 IDENTITY 속성이 있으므로 테이블의 각 행은 ID 열에 새로운 증가 값을 가집니다.
CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE)
GO
ALTER TABLE doc_exe ADD
/* Add a PRIMARY KEY identity column. */
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,
/* Add a column referencing another column in the same table. */
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),
/* Add a column with a constraint to enforce that */
/* nonnull data is in a valid phone number format. */
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d IS NULL OR
column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR
column_d LIKE
"([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),
/* Add a nonnull column with a default. */
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081
GO
EXEC sp_help doc_exe
GO
DROP TABLE doc_exe
GO
F. 기본값이 있는 Null 허용 열 추가
다음 예제는 DEFAULT 정의가 있는 null 허용 열을 추가하고 WITH VALUES를 사용하여 테이블의 각 기존 행에 대한 값을 제공합니다. WITH VALUES를 사용하지 않으면 각 행이 새 열에 NULL 값을 가집니다.
ALTER TABLE MyTable
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT getdate() WITH VALUES
G. 제약 조건 해제 및 재설정
다음 예제는 데이터에 허용되는 급여를 제한하는 제약 조건을 해제합니다. ALTER TABLE에 WITH NOCHECK CONSTRAINT를 사용하면 제약 조건이 해제되어 해당 제약 조건을 위반하는 데이터를 삽입할 수 있습니다. WITH CHECK CONSTRAINT는 제약 조건을 다시 설정합니다.
CREATE TABLE cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
)
-- Valid inserts
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)
-- This insert violates the constraint.
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)
-- Disable the constraint and try again.
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)
-- Reenable the constraint and try another insert, will fail.
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,"Eric James",110000)
H. 트리거 해제 및 재설정
다음 예제는 ALTER TABLE의 DISABLE TRIGGER 옵션을 사용하여 트리거를 해제하고 트리거를 위반하는 데이터를 삽입할 수 있도록 합니다. ENABLE TRIGGER를 사용하여 트리거를 다시 설정할 수 있습니다.
CREATE TABLE trig_example
(id INT,
name VARCHAR(10),
salary MONEY)
go
-- Create the trigger.
CREATE TRIGGER trig1 ON trig_example FOR INSERT
as
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print "TRIG1 Error: you attempted to insert a salary > $100,000"
ROLLBACK TRANSACTION
END
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (1,"Pat Smith",100001)
GO
-- Disable the trigger.
ALTER TABLE trig_example DISABLE TRIGGER trig1
GO
-- Attempt an insert that would normally violate the trigger
INSERT INTO trig_example VALUES (2,"Chuck Jones",100001)
GO
-- Re-enable the trigger.
ALTER TABLE trig_example ENABLE TRIGGER trig1
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (3,"Mary Booth",100001)
GO
관련 항목