ALTER TABLE(Transact-SQL)ALTER TABLE (Transact-SQL)

이 항목은 다음에 적용됩니다. 예SQL Server(2008부터)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

열과 제약 조건을 변경, 추가 또는 삭제하거나 파티션을 재할당하고 다시 작성하거나 제약 조건과 트리거를 설정 또는 해제하여 테이블 정의를 수정합니다.Modifies a table definition by altering, adding, or dropping columns and constraints, reassigning and rebuilding partitions, or disabling or enabling constraints and triggers.

중요

Azure SQL Database 관리되는 인스턴스에서 이 T-SQL 기능은 특정 동작이 변경되었습니다.On Azure SQL Database Managed Instance, this T-SQL feature has certain behavior changes. 모든 T-SQL 동작 변경에 대한 자세한 내용은 SQL Server에서 Azure SQL Database 관리되는 인스턴스 T-SQL 차이점을 참조하세요.See Azure SQL Database Managed Instance T-SQL differences from SQL Server for details for all T-SQL behavior changes.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Disk-Based ALTER TABLE Syntax for SQL Server and Azure SQL Database

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name   
{   
    ALTER COLUMN column_name   
    {   
        [ type_schema_name. ] type_name   
            [ (   
                {   
                   precision [ , scale ]   
                 | max   
                 | xml_schema_collection   
                }   
            ) ]   
        [ COLLATE collation_name ]   
        [ NULL | NOT NULL ] [ SPARSE ]  
      | { ADD | DROP }   
          { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION | SPARSE | HIDDEN }  
      | { ADD | DROP } MASKED [ WITH ( FUNCTION = ' mask_function ') ]  
    }   
    [ WITH ( ONLINE = ON | OFF ) ]  
    | [ WITH { CHECK | NOCHECK } ]  

    | ADD   
    {   
        <column_definition>  
      | <computed_column_definition>  
      | <table_constraint>   
      | <column_set_definition> 
    } [ ,...n ]  
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START   
                   [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ] 
           DEFAULT constant_expression [WITH VALUES] ,  
            system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END   
                   [ HIDDEN ] [ NOT NULL ]  [ CONSTRAINT constraint_name ] 
           DEFAULT constant_expression [WITH VALUES] ,  
         ]  
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )  

    | DROP   
     [ {  
         [ CONSTRAINT ]  [ IF EXISTS ]  
         {   
              constraint_name   
              [ WITH   
               ( <drop_clustered_constraint_option> [ ,...n ] )   
              ]   
          } [ ,...n ]  
          | COLUMN  [ IF EXISTS ]  
          {  
              column_name   
          } [ ,...n ]  
          | PERIOD FOR SYSTEM_TIME  
     } [ ,...n ]  
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
        { ALL | constraint_name [ ,...n ] }   

    | { ENABLE | DISABLE } TRIGGER   
        { ALL | trigger_name [ ,...n ] }  

    | { ENABLE | DISABLE } CHANGE_TRACKING   
        [ WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } ) ]  

    | SWITCH [ PARTITION source_partition_number_expression ]  
        TO target_table   
        [ PARTITION target_partition_number_expression ]  
        [ WITH ( <low_priority_lock_wait> ) ]  

    | SET   
        (  
            [ FILESTREAM_ON =   
                { partition_scheme_name | filegroup | "default" | "NULL" } ]  
            | SYSTEM_VERSIONING =   
                  {   
                      OFF   
                  | ON   
                      [ ( HISTORY_TABLE = schema_name . history_table_name   
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] 
                          [, HISTORY_RETENTION_PERIOD = 
                          { 
                               INFINITE | number {DAY | DAYS | WEEK | WEEKS 
                 | MONTH | MONTHS | YEAR | YEARS } 
                          } 
                          ]  
                        )  
                      ]  
                  }  
          )  

    | REBUILD   
      [ [PARTITION = ALL]  
        [ WITH ( <rebuild_option> [ ,...n ] ) ]   
      | [ PARTITION = partition_number   
           [ WITH ( <single_partition_rebuild_option> [ ,...n ] ) ]  
        ]  
      ]  

    | <table_option>  

    | <filetable_option>  

    | <stretch_configuration>  
}  
[ ; ]  

-- ALTER TABLE options  

<column_set_definition> ::=   
    column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS  

<drop_clustered_constraint_option> ::=    
    {   
        MAXDOP = max_degree_of_parallelism  
      | ONLINE = { ON | OFF }  
      | MOVE TO   
         { partition_scheme_name ( column_name ) | filegroup | "default" }  
    }  
<table_option> ::=  
    {  
        SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )  
    }  

<filetable_option> ::=  
    {  
       [ { ENABLE | DISABLE } FILETABLE_NAMESPACE ]  
       [ SET ( FILETABLE_DIRECTORY = directory_name ) ]  
    }  

<stretch_configuration> ::=  
    {  
      SET (  
        REMOTE_DATA_ARCHIVE   
        {  
            = ON (  <table_stretch_options>  )  
          | = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED )  
          | ( <table_stretch_options> [, ...n] )  
        }  
            )  
    }  

<table_stretch_options> ::=  
    {  
     [ FILTER_PREDICATE = { null | table_predicate_function } , ]  
       MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }  
    }  

<single_partition_rebuild__option> ::=  
{  
      SORT_IN_TEMPDB = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }  
    | ONLINE = { ON [( <low_priority_lock_wait> ) ] | OFF }  
}  

<low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ], 
        ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )   
}  
-- Memory optimized ALTER TABLE Syntax for SQL Server and Azure SQL Database

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name   
{   
    ALTER COLUMN column_name   
    {   
        [ type_schema_name. ] type_name   
            [ (   
                {   
                   precision [ , scale ]   
                }   
            ) ]   
        [ COLLATE collation_name ]   
        [ NULL | NOT NULL ] 
    }  

    | ALTER INDEX index_name   
    {   
        [ type_schema_name. ] type_name   
        REBUILD   
        [ [ NONCLUSTERED ] WITH ( BUCKET_COUNT = bucket_count )
        ]  
    }  

    | ADD   
    {   
        <column_definition>  
      | <computed_column_definition>  
      | <table_constraint> 
      | <table_index>
      | <column_index>
    } [ ,...n ]  
      | [ system_start_time_column_name datetime2 GENERATED ALWAYS AS ROW START   
                   [ HIDDEN ] [ NOT NULL ] [ CONSTRAINT constraint_name ] 
           DEFAULT constant_expression [WITH VALUES] ,  
            system_end_time_column_name datetime2 GENERATED ALWAYS AS ROW END   
                   [ HIDDEN ] [ NOT NULL ]  [ CONSTRAINT constraint_name ] 
           DEFAULT constant_expression [WITH VALUES] ,  
         ]  
       PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )  

    | DROP   
     [ {  
         CONSTRAINT  [ IF EXISTS ]  
         {   
              constraint_name   
          } [ ,...n ]  
      | INDEX  [ IF EXISTS ] 
      {
          index_name
      } [ ,...n ]
          | COLUMN  [ IF EXISTS ]  
          {  
              column_name   
          } [ ,...n ]  
          | PERIOD FOR SYSTEM_TIME  
     } [ ,...n ]  
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
        { ALL | constraint_name [ ,...n ] }   

    | { ENABLE | DISABLE } TRIGGER   
        { ALL | trigger_name [ ,...n ] }  

    | SWITCH [ [ PARTITION ] source_partition_number_expression ]  
        TO target_table   
        [ PARTITION target_partition_number_expression ]  
        [ WITH ( <low_priority_lock_wait> ) ]  

    | SET   
        (  
            SYSTEM_VERSIONING =   
                  {   
                      OFF   
                  | ON   
                      [ ( HISTORY_TABLE = schema_name . history_table_name   
                          [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] 
                          [, HISTORY_RETENTION_PERIOD = 
                          { 
                               INFINITE | number {DAY | DAYS | WEEK | WEEKS 
                 | MONTH | MONTHS | YEAR | YEARS } 
                          } 
                          ]  
                        )  
                      ]  
                  }  
          )  

    | <table_option>    
}  
[ ; ]  

-- ALTER TABLE options  

< table_constraint > ::=  
 [ CONSTRAINT constraint_name ]  
{    
   { PRIMARY KEY | UNIQUE }  
     {   
       NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])  
       | NONCLUSTERED HASH (column [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )   
                    }   
    | FOREIGN KEY   
        ( column [ ,...n ] )   
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
    | CHECK ( logical_expression )   
}  

<column_index> ::=  
  INDEX index_name  
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count)  }  

<table_index> ::=  
  INDEX index_name  
{   [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)   
  | [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )   
      [ ON filegroup_name | default ]  
  | CLUSTERED COLUMNSTORE [WITH ( COMPRESSION_DELAY = {0 | delay [Minutes]})]  
      [ ON filegroup_name | default ]   
}  

<table_option> ::=  
{  
    MEMORY_OPTIMIZED = ON   
  | DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}  
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name . history_table_name  
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]   
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

ALTER TABLE [ database_name . [schema_name ] . | schema_name. ] source_table_name   
{  
    ALTER COLUMN column_name  
        {   
            type_name [ ( precision [ , scale ] ) ]   
            [ COLLATE Windows_collation_name ]   
            [ NULL | NOT NULL ]   
        }  
    | ADD { <column_definition> | <column_constraint> FOR column_name} [ ,...n ]  
    | DROP { COLUMN column_name | [CONSTRAINT] constraint_name } [ ,...n ]  
    | REBUILD {  
            [ PARTITION = ALL [ WITH ( <rebuild_option> ) ] ] 
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_option> ] ]
      } 
    | { SPLIT | MERGE } RANGE (boundary_value)  
    | SWITCH [ PARTITION source_partition_number  
        TO target_table_name [ PARTITION target_partition_number ] [ WITH ( TRUNCATE_TARGET_PARTITION = ON | OFF )
}  
[;]  

<column_definition>::=  
{  
    column_name  
    type_name [ ( precision [ , scale ] ) ]   
    [ <column_constraint> ]  
    [ COLLATE Windows_collation_name ]  
    [ NULL | NOT NULL ]  
}  

<column_constraint>::=  
    [ CONSTRAINT constraint_name ] DEFAULT constant_expression  

<rebuild_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]   
}

<single_partition_rebuild_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
}  

인수Arguments

database_namedatabase_name
테이블이 생성된 데이터베이스 이름입니다.Is the name of the database in which the table was created.

schema_nameschema_name
테이블이 속한 스키마의 이름입니다.Is the name of the schema to which the table belongs.

table_nametable_name
변경할 테이블의 이름입니다.Is the name of the table to be altered. 테이블이 현재 데이터베이스에 없거나 현재 사용자가 소유한 스키마에 포함되지 않은 경우에는 데이터베이스와 스키마를 명시적으로 지정해야 합니다.If the table is not in the current database or is not contained by the schema owned by the current user, the database and schema must be explicitly specified.

ALTER COLUMNALTER COLUMN
명명된 열을 변경하도록 지정합니다.Specifies that the named column is to be changed or altered.

다음과 같은 열은 수정할 수 없습니다.The modified column cannot be any one of the following:

  • timestamp 데이터 형식이 있는 열A column with a timestamp data type.

  • 테이블의 ROWGUIDCOLThe ROWGUIDCOL for the table.

  • 계산 열 또는 계산 열에 사용되는 열A computed column or used in a computed column.

  • CREATE STATISTICS 문으로 생성된 통계에 사용되는 열. 단, 열의 데이터 형식이 varchar, nvarchar 또는 varbinary인 경우, 데이터 형식이 변경되지 않은 경우, 새 크기가 원래 크기보다 크거나 같은 경우, 열이 Not Null에서 Null로 변경된 경우는 제외합니다.Used in statistics generated by the CREATE STATISTICS statement unless the column is a varchar, nvarchar, or varbinary data type, the data type is not changed, and the new size is equal to or greater than the old size, or if the column is changed from not null to null. 먼저 DROP STATISTICS 문을 사용하여 통계를 제거합니다.First, remove the statistics using the DROP STATISTICS statement. 쿼리 최적화 프로그램에 의해 자동으로 생성된 통계는 ALTER COLUMN에 의해 자동으로 삭제됩니다.Statistics that are automatically generated by the query optimizer are automatically dropped by ALTER COLUMN.

  • PRIMARY KEY 또는 [FOREIGN KEY] REFERENCES 제약 조건에 사용된 열Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.

  • CHECK 또는 UNIQUE 제약 조건에 사용된 열.Used in a CHECK or UNIQUE constraint. 그러나 CHECK 또는 UNIQUE 제약 조건에 사용된 가변 길이 열의 길이는 변경할 수 있습니다.However, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • DEFAULT 정의와 연결되는 열.Associated with a default definition. 그러나 데이터 형식이 변경되지 않은 경우 열의 길이, 전체 자릿수 또는 소수 자릿수를 변경할 수 있습니다.However, the length, precision, or scale of a column can be changed if the data type is not changed.

text, ntextntextimage 열의 데이터 형식은 다음과 같은 방식으로만 변경할 수 있습니다.The data type of text, ntext, and image columns can be changed only in the following ways:

  • text에서 varchar(max), nvarchar(max) 또는 xmltext to varchar(max), nvarchar(max), or xml

  • ntext에서 varchar(max), nvarchar(max) 또는 xmlntext to varchar(max), nvarchar(max), or xml

  • image에서 varbinary(max)image to varbinary(max)

데이터 형식을 변경하면 데이터 자체가 변경되는 경우도 있습니다.Some data type changes may cause a change in the data. 예를 들어 nchar 또는 nvarchar 열을 char 또는 varchar로 변경하면 확장 문자가 변환될 수 있습니다.For example, changing a nchar or nvarchar column, to char or varchar, may cause the conversion of extended characters. 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하세요.For more information, see CAST and CONVERT (Transact-SQL). 열의 전체 자릿수 또는 소수 자릿수를 줄이면 데이터가 잘릴 수 있습니다.Reducing the precision or scale of a column may cause data truncation.

참고

분할된 테이블의 열 데이터 형식은 변경할 수 없습니다.The data type of a column of a partitioned table cannot be changed.

인덱스에 포함된 열의 데이터 형식은 열이 varchar, nvarchar 또는 varbinary 데이터 형식이고 새로운 크기가 이전 크기보다 크거나 같은 경우가 아니면 변경할 수 없습니다.The data type of columns included in an index cannot be changed unless the column is a varchar, nvarchar, or varbinary data type, and the new size is equal to or larger than the old size.

기본 키 제약 조건에 포함된 열은 NOT NULL에서 NULL로 변경할 수 없습니다.A column included in a primary key constraint, cannot be changed from NOT NULL to NULL.

수정하는 열이 ENCRYPTED WITH를 사용하여 암호화된 경우 데이터 형식을 호환되는 데이터 형식으로 변경할 수 있지만(예를 들어 INT에서 BIGINT로) 암호화 설정은 변경할 수 없습니다.If the column being modified is encrypted using ENCRYPTED WITH, you can change the datatype to a compatible datatype (such as INT to BIGINT) but you cannot change any encryption settings.

column_namecolumn_name
변경, 추가 또는 삭제할 열의 이름입니다.Is the name of the column to be altered, added, or dropped. column_name은 최대 128자까지 가능합니다.column_name can be a maximum of 128 characters. 새 열의 경우 timestamp 데이터 형식으로 만들어진 열에 대해 column_name을 생략할 수 있습니다.For new columns, column_name can be omitted for columns created with a timestamp data type. timestamp 데이터 형식 열에 대해 column_name이 지정되지 않으면 timestamp가 이름으로 사용됩니다.The name timestamp is used if no column_name is specified for a timestamp data type column.

[ type_schema_name. ] type_name[ type_schema_name. ] type_name
변경된 열의 새 데이터 형식 또는 추가된 열의 데이터 형식입니다.Is the new data type for the altered column, or the data type for the added column. 분할된 테이블의 기존 열에 type_name을 지정할 수 없습니다.type_name cannot be specified for existing columns of partitioned tables. type_name은 다음 중 하나일 수 있습니다.type_name can be any one of the following:

  • SQL ServerSQL Server 시스템 데이터 형식A SQL ServerSQL Server system data type.

  • SQL ServerSQL Server 시스템 데이터 형식을 기반으로 하는 별칭 데이터 형식.An alias data type based on a SQL ServerSQL Server system data type. 별칭 데이터 형식은 CREATE TYPE 문으로 만들어진 다음 테이블 정의에 사용됩니다.Alias data types are created with the CREATE TYPE statement before they can be used in a table definition.

  • .NET Framework.NET Framework 사용자 정의 형식 및 이 형식이 속한 스키마.A .NET Framework.NET Framework user-defined type, and the schema to which it belongs. .NET Framework.NET Framework 사용자 정의 형식은 CREATE TYPE 문으로 만들어진 다음 테이블 정의에서 사용됩니다. user-defined types are created with the CREATE TYPE statement before they can be used in a table definition.

변경된 열의 type_name에는 다음과 같은 조건이 적용됩니다.The following are criteria for type_name of an altered column:

  • 이전 데이터 형식은 암시적으로 새 데이터 형식으로 변환 가능해야 합니다.The previous data type must be implicitly convertible to the new data type.
  • type_nametimestamp가 될 수 없습니다.type_name cannot be timestamp.
  • ALTER COLUMN에 대해 ANSI_NULL 기본값이 항상 설정되어 있습니다. 값을 지정하지 않으면 열에 Null이 허용됩니다.ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • ALTER COLUMN에 대해 ANSI_PADDING 패딩이 항상 ON으로 설정되어 있습니다.ANSI_PADDING padding is always ON for ALTER COLUMN.
  • 수정된 열이 ID 열이면 new_data_type은 ID 속성을 지원하는 데이터 형식이어야 합니다.If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
  • SET ARITHABORT의 현재 설정이 무시됩니다.The current setting for SET ARITHABORT is ignored. ALTER TABLE은 ARITHABORT가 ON으로 설정된 것처럼 동작합니다.ALTER TABLE operates as if ARITHABORT is set to ON.

참고

COLLATE 절을 지정하지 않으면 열의 데이터 형식을 변경했을 때 데이터 정렬이 데이터베이스의 기본 데이터 정렬로 변경됩니다.If the COLLATE clause is not specified, changing the data type of a column will cause a collation change to the default collation of the database.

전체 자릿수precision
지정된 데이터 형식의 전체 자릿수입니다.Is the precision for the specified data type. 유효한 전체 자릿수 값에 대한 자세한 내용은 전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)를 참조하세요.For more information about valid precision values, see Precision, Scale, and Length (Transact-SQL).

scalescale
지정된 데이터 형식의 소수 자릿수입니다.Is the scale for the specified data type. 유효한 소수 자릿수 값에 대한 자세한 내용은 전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)를 참조하세요.For more information about valid scale values, see Precision, Scale, and Length (Transact-SQL).

maxmax
2^31-1바이트의 문자, 이진 데이터 및 유니코드 데이터를 저장하기 위한 varchar, nvarcharvarbinary 데이터 형식에만 적용됩니다.Applies only to the varchar, nvarchar, and varbinary data types for storing 2^31-1 bytes of character, binary data, and of Unicode data.

xml_schema_collectionxml_schema_collection
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

XML 스키마를 xml 데이터 형식에 연결하기 위해 이 형식에만 적용됩니다.Applies only to the xml data type for associating an XML schema with the type. 스키마 컬렉션에 xml 열을 입력하기 전에 먼저 CREATE XML SCHEMA COLLECTION을 사용하여 데이터베이스에 해당 스키마 컬렉션을 만들어야 합니다.Before typing an xml column to a schema collection, the schema collection must first be created in the database by using CREATE XML SCHEMA COLLECTION.

COLLATE < collation_name > 변경된 열에 대한 새 데이터 정렬을 지정합니다.COLLATE < collation_name > Specifies the new collation for the altered column. 이를 지정하지 않으면 열에 데이터베이스의 기본 데이터 정렬이 할당됩니다.If not specified, the column is assigned the default collation of the database. 데이터 정렬 이름으로는 Windows 데이터 정렬 이름 또는 SQL 데이터 정렬 이름을 사용할 수 있습니다.Collation name can be either a Windows collation name or a SQL collation name. 목록 및 자세한 내용은 Windows 데이터 정렬 이름(Transact-SQL)SQL Server 데이터 정렬 이름(Transact-SQL)을 참조하세요.For a list and more information, see Windows Collation Name (Transact-SQL) and SQL Server Collation Name (Transact-SQL).

COLLATE 절은 char, varchar, ncharnvarchar 데이터 형식의 열에 데이터 정렬을 변경하는 데만 사용할 수 있습니다.The COLLATE clause can be used to change the collations only of columns of the char, varchar, nchar, and nvarchar data types. 사용자 정의 별칭 데이터 형식 열의 데이터 정렬을 변경하려면 별도의 ALTER TABLE 문을 실행하여 열을 SQL ServerSQL Server 시스템 데이터 형식으로 변경하고 해당 데이터 정렬을 변경한 다음 그 열을 별칭 데이터 형식으로 다시 변경해야 합니다.To change the collation of a user-defined alias data type column, you must execute separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type and change its collation, and then change the column back to an alias data type.

다음 조건이 하나 이상 해당되는 경우 ALTER COLUMN으로 데이터 정렬을 변경할 수 없습니다.ALTER COLUMN cannot have a collation change if one or more of the following conditions exist:

  • CHECK 제약 조건, FOREIGN KEY 제약 조건 또는 계산 열이 변경된 열을 참조하는 경우If a CHECK constraint, FOREIGN KEY constraint, or computed columns reference the column changed.
  • 인덱스, 통계 또는 전체 텍스트 인덱스가 열에 생성된 경우.If any index, statistics, or full-text index are created on the column. 변경된 열에 자동으로 만들어진 통계는 열 데이터 정렬이 변경되면 삭제됩니다.Statistics created automatically on the column changed are dropped if the column collation is changed.
  • 스키마 바운드 뷰 또는 함수가 열을 참조하는 경우If a schema-bound view or function references the column.

자세한 내용은 COLLATE(Transact-SQL)를 참조하세요.For more information, see COLLATE (Transact-SQL).

NULL | NOT NULLNULL | NOT NULL
열에 Null 값 허용 여부를 지정합니다.Specifies whether the column can accept null values. Null 값이 허용되지 않는 열은 기본값이 지정된 경우 또는 테이블이 비어 있는 경우에만 ALTER TABLE을 사용하여 추가할 수 있습니다.Columns that do not allow null values can be added with ALTER TABLE only if they have a default specified or if the table is empty. 계산 열에서는 PERSISTED를 지정한 경우에만 NOT NULL을 지정할 수 있습니다.NOT NULL can be specified for computed columns only if PERSISTED is also specified. 새 열이 Null 값을 허용하고 기본값이 지정되어 있지 않으면 테이블에서 각 행의 새 열은 Null 값을 포함합니다.If the new column allows null values and no default is specified, the new column contains a null value for each row in the table. 새 열이 Null 값을 허용하고 해당 열에 기본 정의가 추가되어 있으면 WITH VALUES를 사용하여 테이블에서 기존 행의 새 열에 기본값을 저장할 수 있습니다.If the new column allows null values and a default definition is added with the new column, WITH VALUES can be used to store the default value in the new column for each existing row in the table.

새 열이 Null 값을 허용하지 않고 테이블이 비어 있지 않은 경우에는 DEFAULT 정의가 새 열에 추가되어야 합니다. 그러면 각 기존 행의 새 열에 기본값이 자동으로 로드됩니다.If the new column does not allow null values and the table is not empty, a DEFAULT definition must be added with the new column, and the new column automatically loads with the default value in the new columns in each existing row.

PRIMARY KEY 제약 조건이 있는 열을 제외하고 ALTER COLUMN에 NULL을 지정하여 NOT NULL 열이 Null 값을 허용하도록 강제 설정할 수 있습니다.NULL can be specified in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. 열에 Null 값이 포함되어 있지 않을 경우에만 ALTER COLUMN에 NOT NULL을 지정할 수 있습니다.NOT NULL can be specified in ALTER COLUMN only if the column contains no null values. ALTER COLUMN NOT NULL을 허용하려면 다음과 같이 Null 값을 다른 값으로 업데이트해야 합니다.The null values must be updated to some value before the ALTER COLUMN NOT NULL is allowed, for example:

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL;  
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL;  

CREATE TABLE 또는 ALTER TABLE 문을 사용하여 테이블을 만들거나 변경하는 경우 데이터베이스 및 세션 설정은 열 정의에 사용되는 데이터 형식의 Null 허용 여부에 영향을 주거나 이를 재정의할 가능성이 있습니다.When you create or alter a table with the CREATE TABLE or ALTER TABLE statements, the database and session settings influence and possibly override the nullability of the data type that is used in a column definition. 비계산 열은 항상 NULL 또는 NOT NULL로 명시적으로 정의하는 것이 좋습니다.We recommend that you always explicitly define a column as NULL or NOT NULL for noncomputed columns.

사용자 정의 데이터 형식이 있는 열을 추가할 경우에는 사용자 정의 데이터 형식과 같은 Null 허용 여부를 사용하여 열을 정의하고 열의 기본값을 지정하는 것이 좋습니다.If you add a column with a user-defined data type, we recommend that you define the column with the same nullability as the user-defined data type and specify a default value for the column. 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하세요.For more information, see CREATE TABLE (Transact-SQL).

참고

ALTER COLUMN에 NULL 또는 NOT NULL을 지정할 때는 new_data_type [(precision [, scale ])]도 함께 지정해야 합니다.If NULL or NOT NULL is specified with ALTER COLUMN, new_data_type [(precision [, scale ])] must also be specified. 데이터 형식, 전체 자릿수 및 소수 자릿수가 변경되지 않으면 현재 열 값을 지정합니다.If the data type, precision, and scale are not changed, specify the current column values.

[ {ADD | DROP} ROWGUIDCOL ][ {ADD | DROP} ROWGUIDCOL ]
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

지정된 열에 대해 ROWGUIDCOL 속성을 추가하거나 삭제하도록 지정합니다.Specifies the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL은 열이 행 GUID 열임을 나타냅니다.ROWGUIDCOL indicates that the column is a row GUID column. 테이블당 하나의 uniqueidentifier 열만 ROWGUIDCOL 열로 지정할 수 있고 ROWGUIDCOL 속성은 하나의 uniqueidentifier 열에만 할당할 수 있습니다.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column, and the ROWGUIDCOL property can be assigned only to a uniqueidentifier column. ROWGUIDCOL은 사용자 정의 데이터 형식의 열에 지정할 수 없습니다.ROWGUIDCOL cannot be assigned to a column of a user-defined data type.

ROWGUIDCOL은 열에 저장된 값이 고유하도록 설정하지 않으며 테이블에 삽입된 새 행의 값을 자동으로 생성하지 않습니다.ROWGUIDCOL does not enforce uniqueness of the values that are stored in the column and does not automatically generate values for new rows that are inserted into the table. 각 열에 고유한 값을 생성하려면 INSERT 문에 NEWID 또는 NEWSEQUENTIALID 함수를 사용하거나 열에 대한 기본값으로 NEWID 또는 NEWSEQUENTIALID 함수를 사용하십시오.To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements or specify the NEWID or NEWSEQUENTIALID function as the default for the column.

[ {ADD | DROP} PERSISTED ][ {ADD | DROP} PERSISTED ]
지정된 열에 대해 PERSISTED 속성을 추가하거나 삭제하도록 지정합니다.Specifies that the PERSISTED property is added to or dropped from the specified column. 이 열은 결정적인 식으로 정의된 계산 열이어야 합니다.The column must be a computed column that is defined with a deterministic expression. PERSISTED로 지정된 열인 경우 데이터베이스 엔진Database Engine은 계산된 값을 테이블에 저장하고 계산 열이 종속된 다른 열이 업데이트될 때 해당 값을 업데이트합니다.For columns specified as PERSISTED, the 데이터베이스 엔진Database Engine physically stores the computed values in the table and updates the values when any other columns on which the computed column depends are updated. 계산 열을 PERSISTED로 표시하면 결정적이지만 정확하지는 않은 식에 정의된 계산 열에 인덱스를 만들 수 있습니다.By marking a computed column as PERSISTED, you can create indexes on computed columns defined on expressions that are deterministic, but not precise. 자세한 내용은 Indexes on Computed Columns을 참조하세요.For more information, see Indexes on Computed Columns.

분할된 테이블의 분할 열로 사용되는 계산 열은 명시적으로 PERSISTED로 표시해야 합니다.Any computed column that is used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

복제 에이전트가 삽입 작업을 수행할 때 ID 열의 값이 증가하도록 지정합니다.Specifies that values are incremented in identity columns when replication agents perform insert operations. 이 절은 column_name이 ID 열인 경우에만 지정할 수 있습니다.This clause can be specified only if column_name is an identity column.

SPARSESPARSE
열이 스파스 열임을 나타냅니다.Indicates that the column is a sparse column. 스파스 열의 저장소는 Null 값에 대해 최적화됩니다.The storage of sparse columns is optimized for null values. 스파스 열은 NOT NULL로 지정할 수 없습니다.Sparse columns cannot be designated as NOT NULL. 스파스 열에서 스파스가 아닌 열로 또는 스파스가 아닌 열에서 스파스 열로 열을 변환하면 명령이 실행되는 동안 테이블이 잠깁니다.Converting a column from sparse to nonsparse or from nonsparse to sparse locks the table for the duration of the command execution. 공간을 절약하기 위해 REBUILD 절을 사용해야 할 수 있습니다.You may need to use the REBUILD clause to reclaim any space savings. 추가 제한 사항 및 스파스 열에 대한 자세한 내용은 스파스 열 사용을 참조하세요.For additional restrictions and more information about sparse columns, see Use Sparse Columns.

ADD MASKED WITH ( FUNCTION = ' mask_function ')ADD MASKED WITH ( FUNCTION = ' mask_function ')
적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

동적 데이터 마스크를 지정합니다.Specifies a dynamic data mask. mask_function은 적절한 매개 변수를 포함한 마스킹 함수의 이름 입니다.mask_function is the name of the masking function with the appropriate parameters. 세 함수를 사용할 수 있습니다.Three functions are available:

  • default()default()
  • email()email()
  • partial()partial()
  • random()random()

    마스크를 삭제하려면 DROP MASKED를 사용합니다.To drop a mask, use DROP MASKED. 함수 매개 변수에 대해서는 동적 데이터 마스킹을 참조하세요.For function parameters, see Dynamic Data Masking.

WITH ( ONLINE = ON | OFF) <열 변경에 적용>WITH ( ONLINE = ON | OFF) <as applies to altering a column>
적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

테이블을 사용 가능한 상태로 유지하면서 많은 열 변경 작업을 수행할 수 있게 해줍니다.Allows many alter column actions to be performed while the table remains available. 기본값은 OFF입니다.Default is OFF. 열 변경은 데이터 형식, 열 길이 또는 전체 자릿수, Null 허용 여부, 스파스 및 데이터 정렬과 관련된 열 변경 내용에 대해 온라인으로 수행할 수 있습니다.Alter column can be performed on line for column changes related to data type, column length or precision, nullability, sparseness, and collation.

온라인 열 변경을 통해, 사용자가 만든 통계과 자동 통계가 ALTER COLUMN 작업 기간 동안 변경된 열을 참조할 수 있습니다.Online alter column allows user created and auto statistics to reference the altered column for the duration of the ALTER COLUMN operation. 따라서 평소와 같이 쿼리를 수행할 수 있습니다.This allows queries to perform as usual. 작업 종료 시 열을 참조하는 자동 통계는 삭제되고 사용자가 만든 통계는 무효화됩니다.At the end of the operation, auto-stats that reference the column are dropped and user-created stats are invalidated. 사용자는 작업이 완료된 후 사용자가 생성한 통계를 수동으로 업데이트해야 합니다.The user must manually update user-generated statistics after the operation is completed. 열이 모든 통계나 색인에 대한 필터 식의 일부인 경우 alter 열 작업을 수행할 수 없습니다.If the column is part of a filter expression for any statistics or indexes then you cannot perform an alter column operation.

  • 온라인 열 변경 작업이 실행되고 있는 동안 해당 열(인덱스, 뷰 등)에 대한 종속성을 사용할 수 있는 모든 작업은 차단되거나 적절한 오류가 발생하고 실패합니다.While the online alter column operation is running, all operations that could take a dependency on the column (index, views, etc.) will block or fail with an appropriate error. 따라서 작업이 실행되고 있는 동안 도입된 종속성으로 인해 온라인 열 변경이 실패하지 않습니다.This guarantees that online alter column will not fail because of dependencies introduced while the operation was running.

  • 변경된 열이 비클러스터형 인덱스에서 참조되는 경우 열을 NOT NULL에서 NULL로 변경하는 작업은 온라인 작업으로 지원되지 않습니다.Altering a column from NOT NULL to NULL is not supported as an online operation when the altered column is references by nonclustered indexes.

  • 열이 CHECK 제약 조건에서 참조되고 변경 작업이 열의 전체 자릿수(numeric 또는 datetime)를 제한하는 경우 온라인 변경은 지원되지 않습니다.Online alter is not supported when the column is referenced by a check constraint and the alter operation is restricting the precision of the column (numeric or datetime).

  • WAIT_AT_LOW_PRIORITY 옵션은 온라인 열 변경과 함께 사용할 수 없습니다.The WAIT_AT_LOW_PRIORITY option cannot be used with online alter column.

  • ALTER COLUMN … ADD/DROP PERSISTED는 온라인 열 변경에 지원되지 않습니다.ALTER COLUMN … ADD/DROP PERSISTED is not supported for online alter column.

  • ALTER COLUMN … ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION은 온라인 열 변경으로 영향을 받지 않습니다.ALTER COLUMN … ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION is not affected by online alter column.

  • 온라인 열 변경은 변경 내용 추적이 설정되었거나 병합 복제의 게시자인 테이블 변경을 지원하지 않습니다.Online alter column does not support altering a table where change tracking is enabled or that is a publisher of merge replication.

  • 온라인 열 변경은 CLR 데이터 형식에서의 변경 또는 CLR 데이터 형식으로의 변경을 지원하지 않습니다.Online alter column does not support altering from or to CLR data types.

  • 온라인 열 변경은 현재 스키마 컬렉션과 다른 스키마 컬렉션이 포함된 XML 데이터 형식으로의 변경을 지원하지 않습니다.Online alter column does not support altering to an XML data type that has a schema collection different than the current schema collection.

  • 온라인 열 변경에서는 열을 변경할 수 있는 경우에 대한 제한이 줄어들지 않습니다.Online alter column does not reduce the restrictions on when a column can be altered. 인덱스/통계 등에 의한 참조로 인해 alter가 실패할 수 있습니다.References by index/stats, etc. might cause the alter to fail.

  • 온라인 열 변경은 동시에 둘 이상의 열 변경을 지원하지 않습니다.Online alter column does not support altering more than one column concurrently.

  • 시스템 버전 관리 temporal 테이블에서는 온라인 변경 옵션에 영향을 주지 않습니다.Online alter column has no effect in case of system-versioned temporal table. ONLINE 옵션에 지정된 값과 관계없이 열 변경은 온라인으로 수행되지 않습니다.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

온라인 열 변경의 요구 사항, 제한 및 기능은 온라인 인덱스 다시 작성과 유사합니다.Online alter column has similar requirements, restrictions, and functionality as online index rebuild. 다음을 포함합니다.This includes:

  • 테이블에 레거시 LOB 또는 FILESTREAM 열이 포함되어 있거나 테이블에 columnstore 인덱스가 있는 경우 온라인 인덱스 다시 작성은 지원되지 않습니다.Online index rebuild is not supported when the table contains legacy LOB or filestream columns or when the table has a columnstore index. 동일한 제한이 온라인 열 변경에도 적용됩니다.The same limitations apply for online alter column.

  • 기존 열을 변경하려면 원본 열과 새로 만들어진 숨겨진 열에 대한 공간 할당이 필요하므로 두 배의 공간 할당이 필요합니다.An existing column being altered requires twice the space allocation; for the original column and for the newly created hidden column.

  • 온라인 열 변경 작업 동안 잠금 전략은 온라인 인덱스 작성에 사용되는 것과 동일한 잠금 패턴을 따릅니다.The locking strategy during an alter column online operation follows the same locking pattern used for online index build.

WITH CHECK | WITH NOCHECKWITH CHECK | WITH NOCHECK
새로 추가되거나 다시 설정된 FOREIGN KEY 또는 CHECK 제약 조건에 대해 테이블의 데이터 유효성을 검사할지 여부를 지정합니다.Specifies whether the data in the table is or is not validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. 값을 지정하지 않으면 새 제약 조건에는 WITH CHECK가 지정되고 다시 설정된 제약 조건에는 WITH NOCHECK가 지정된 것으로 간주됩니다.If not specified, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

기존 데이터에 대해 새 CHECK 또는 FOREIGN KEY 제약 조건을 확인하지 않으려면 WITH NOCHECK를 사용합니다.If you do not want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. 이 방법은 꼭 필요한 경우가 아니면 사용하지 않는 것이 좋습니다.We do not recommend doing this, except in rare cases. 새 제약 조건은 나중에 데이터가 업데이트될 때마다 평가됩니다.The new constraint will be evaluated in all later data updates. 따라서 제약 조건이 추가될 때 WITH NOCHECK에 의해 제약 조건 위반이 알려지지 않으면 제약 조건에 맞지 않는 데이터가 있는 행을 업데이트할 경우 업데이트 오류가 발생할 수 있습니다.Any constraint violations that are suppressed by WITH NOCHECK when the constraint is added may cause future updates to fail if they update rows with data that does not comply with the constraint.

쿼리 최적화 프로그램은 WITH NOCHECK가 정의된 제약 조건을 고려하지 않습니다.The query optimizer does not consider constraints that are defined WITH NOCHECK. 이러한 제약 조건은 ALTER TABLE ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL을 사용하여 다시 설정될 때까지 무시됩니다.Such constraints are ignored until they are re-enabled by using ALTER TABLE table WITH CHECK CHECK CONSTRAINT ALL.

ALTER INDEX index_name index_name의 버킷 수가 변경되도록 지정합니다.ALTER INDEX index_name Specifies that the bucket count for index_name is to be changed or altered.

ALTER TABLE ...The syntax ALTER TABLE … ADD/DROP/ALTER INDEX 구문은 메모리 최적화 테이블에만 지원됩니다.ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

참고

ALTER TABLE 문을 사용하지 않을 경우 CREATE INDEX, DROP INDEX, ALTER INDEX 문은 메모리 최적화 테이블의 인덱스로 지원되지 않습니다.Without using an ALTER TABLE statement, the statements CREATE INDEX and DROP INDEX and ALTER INDEX are not supported for indexes on memory-optimized tables.

ADDADD
하나 이상의 열 정의, 계산 열 정의 또는 테이블 제약 조건이 추가되도록 지정하거나 시스템이 시스템 버전 관리에 사용할 열을 지정합니다.Specifies that one or more column definitions, computed column definitions, or table constraints are added, or the columns that the system will use for system versioning. 메모리 최적화 테이블의 경우 인덱스를 추가할 수 있습니다.For memory-optimized tables, an index can be added.

참고

ALTER TABLE 문을 사용하지 않을 경우 CREATE INDEX, DROP INDEX, ALTER INDEX 문은 메모리 최적화 테이블의 인덱스로 지원되지 않습니다.Without using an ALTER TABLE statement, the statements CREATE INDEX and DROP INDEX and ALTER INDEX are not supported for indexes on memory-optimized tables.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )PERIOD FOR SYSTEM_TIME ( system_start_time_column_name, system_end_time_column_name )
적용 대상: SQL Server 2017부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2017 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

시스템에서 레코드가 유효한 기간을 기록하기 위해 사용할 열의 이름을 지정합니다.Specifies the names of the columns that the system will use to record the period for which a record is valid. ADD PERIOD FOR SYSTEM_TIME 인수의 일부로 기존 열을 지정하거나 새 열을 만들 수 있습니다.You can specify existing columns or create new columns as part of the ADD PERIOD FOR SYSTEM_TIME argument. 열의 데이터 형식은 datetime2여야 하며 NOT NULL로 정의해야 합니다.The columns must have the datatype of datetime2 and must be defined as NOT NULL. 기간 열이 NULL로 정의된 경우 오류가 발생됩니다.If a period column is defined as NULL, an error will be thrown. system_start_time 및 system_end_time 열에 대해 column_constraint(Transact-SQL)을 정의하고/또는 열의 기본값을 지정할 수 있습니다.You can define a column_constraint (Transact-SQL) and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. 아래 시스템 버전 관리 예의 예 A에서 system_end_time 열에 기본값을 사용하는 방식을 참조하세요.See Example A in the System Versioning examples below demonstrating the use of a default value for the system_end_time column.

이 인수와 함께 SET SYSTEM_VERSIONING 인수를 사용할 경우 기존 테이블에서 시스템 버전 관리를 수행할 수 있습니다.Use this argument in conjunction with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. 자세한 내용은 Temporal 테이블Azure SQL Database에서 Temporal 테이블 시작하기를 참조하세요.For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

SQL Server 2017에서는 사용자가 하나 또는 두 기간 열에 HIDDEN 플래그를 표시해 이러한 열을 암시적으로 숨김으로써 *SELECT * FROM***<table> 이 이러한 열에 대한 값을 반환하지 않도록 할 수 있습니다.As of SQL Server 2017, users will be able to mark one or both period columns with HIDDEN flag to implicitly hide these columns such that *SELECT * FROM***<table> does not return a value for those columns. 기본적으로 기간 열은 숨겨지지 않습니다.By default, period columns are not hidden. 숨겨진 열을 사용하려면 temporal 테이블을 직접 참조하는 모든 쿼리에 이러한 열을 명시적으로 포함해야 합니다.In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
하나 이상의 열 정의, 계산 열 정의 또는 테이블 제약 조건을 삭제하거나 시스템이 시스템 버전 관리에 사용할 열에 대한 사양을 삭제하도록 지정합니다.Specifies that one or more column definitions, computed column definitions, or table constraints are dropped, or to drop the specification for the columns that the system will use for system versioning.

CONSTRAINT constraint_nameCONSTRAINT constraint_name
테이블에서 constraint_name이 제거되도록 지정합니다.Specifies that constraint_name is removed from the table. 여러 제약 조건을 나열할 수 있습니다.Multiple constraints can be listed.

사용자 정의 또는 시스템 제공 제약 조건 이름은 sys.check_constraint, sys.default_constraints, sys.key_constraints, sys.foreign_keys 카탈로그 뷰를 쿼리하여 확인할 수 있습니다.The user-defined or system-supplied name of the constraint can be determined by querying the sys.check_constraint, sys.default_constraints, sys.key_constraints, and sys.foreign_keys catalog views.

XML 인덱스가 테이블에 있는 경우 PRIMARY KEY 제약 조건을 삭제할 수 없습니다.A PRIMARY KEY constraint cannot be dropped if an XML index exists on the table.

INDEX index_name 테이블에서 index_name이 제거되도록 지정합니다.INDEX index_name Specifies that index_name is removed from the table.

ALTER TABLE ...The syntax ALTER TABLE … ADD/DROP/ALTER INDEX 구문은 메모리 최적화 테이블에만 지원됩니다.ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

참고

ALTER TABLE 문을 사용하지 않을 경우 CREATE INDEX, DROP INDEX, ALTER INDEX 문은 메모리 최적화 테이블의 인덱스로 지원되지 않습니다.Without using an ALTER TABLE statement, the statements CREATE INDEX and DROP INDEX and ALTER INDEX are not supported for indexes on memory-optimized tables.

COLUMN column_nameCOLUMN column_name
테이블에서 constraint_name 또는 column_name이 제거되도록 지정합니다.Specifies that constraint_name or column_name is removed from the table. 여러 열을 나열할 수 있습니다.Multiple columns can be listed.

다음과 같은 열은 삭제할 수 없습니다.A column cannot be dropped when it is:

  • 인덱스에서 키 열 또는 INCLUDE로 사용됩니다.Used in an index, whether as a key column or as an INCLUDE

  • CHECK, FOREIGN KEY, UNIQUE 또는 PRIMARY KEY 제약 조건에 사용되는 열Used in a CHECK, FOREIGN KEY, UNIQUE, or PRIMARY KEY constraint.

  • DEFAULT 키워드로 정의된 기본값과 연결되거나 기본 개체에 바인딩된 열Associated with a default that is defined with the DEFAULT keyword, or bound to a default object.

  • 규칙에 바인딩된 열Bound to a rule.

참고

열을 삭제해도 해당 열의 디스크 공간은 회수되지 않습니다.Dropping a column does not reclaim the disk space of the column. 테이블의 행 크기가 제한에 근접하거나 제한을 초과한 경우에는 삭제된 열의 디스크 공간을 회수해야 할 수도 있습니다.You may have to reclaim the disk space of a dropped column when the row size of a table is near, or has exceeded, its limit. ALTER INDEX를 사용하여 기존 클러스터형 인덱스를 다시 작성하거나 테이블에 클러스터형 인덱스를 생성하면 공간을 회수할 수 있습니다.Reclaim space by creating a clustered index on the table or rebuilding an existing clustered index by using ALTER INDEX. LOB 데이터 형식의 삭제 영향에 대한 자세한 내용은 CSS 블로그 항목을 참조하세요.For information about the impact of dropping LOB data types, see this CSS blog entry.

PERIOD FOR SYSTEM_TIMEPERIOD FOR SYSTEM_TIME
적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

시스템이 시스템 버전 관리에 사용할 열에 대한 사양을 삭제합니다.Drops the specification for the columns that the system will use for system versioning.

WITH <drop_clustered_constraint_option>WITH <drop_clustered_constraint_option>
하나 이상의 클러스터형 제약 조건 삭제 옵션이 설정되도록 지정합니다.Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

작업 중에만 최대 병렬 처리 수준 구성 옵션을 재정의합니다.Overrides the max degree of parallelism configuration option only for the duration of the operation. 자세한 내용은 max degree of parallelism 서버 구성 옵션 구성을 참조하세요.For more information, see Configure the max degree of parallelism Server Configuration Option.

MAXDOP 옵션을 사용하여 병렬 계획 실행에 사용되는 프로세서 수를 제한합니다.Use the MAXDOP option to limit the number of processors used in parallel plan execution. 최대값은 64개입니다.The maximum is 64 processors.

max_degree_of_parallelism은 다음 값 중 하나일 수 있습니다.max_degree_of_parallelism can be one of the following values:

@shouldalert1
병렬 계획이 생성되지 않습니다.Suppresses parallel plan generation.

>1>1
병렬 인덱스 작업에 사용되는 최대 프로세서 수를 지정된 값으로 제한합니다.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0(기본값)0 (default)
현재 시스템 작업에 따라 실제 프로세서 수 이하의 프로세서를 사용합니다.Uses the actual number of processors or fewer based on the current system workload.

자세한 내용은 병렬 인덱스 작업 구성을 참조하세요.For more information, see Configure Parallel Index Operations.

참고

병렬 인덱스 작업은 일부 SQL ServerSQL Server 버전에서 사용할 수 있습니다.Parallel index operations are not available in every edition of SQL ServerSQL Server. 자세한 내용은 SQL Server 2016의 버전과 지원하는 기능을 참조하세요.For more information, see Editions and Supported Features for SQL Server 2016.

ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>ONLINE = { ON | OFF } <as applies to drop_clustered_constraint_option>
인덱스 작업 중 쿼리 및 데이터 수정에 기본 테이블과 관련 인덱스를 사용할 수 있는지 여부를 지정합니다.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. 기본값은 OFF입니다.The default is OFF. REBUILD 작업은 ONLINE 작업으로만 수행할 수 있습니다.REBUILD can be performed as an ONLINE operation.

ONON
인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다.Long-term table locks are not held for the duration of the index operation. 인덱스 작업의 주 단계 중 내재된 공유(IS) 잠금만 원본 테이블에 유지됩니다.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. 따라서 기본 테이블과 인덱스를 계속 쿼리하거나 업데이트할 수 있습니다.This enables queries or updates to the underlying table and indexes to continue. 작업이 시작될 때 아주 짧은 기간 동안 S(공유) 잠금이 원본 개체에 유지됩니다.At the start of the operation, a Shared (S) lock is held on the source object for a very short time. 작업이 끝날 때 짧은 기간 동안 비클러스터형 인덱스가 생성되는 경우에는 원본에 대해 공유(S) 잠금이 획득되고, 온라인 상태에서 클러스터형 인덱스가 생성 또는 삭제될 때와 클러스터형 또는 비클러스터형 인덱스가 다시 작성될 때는 스키마 수정(SCH-M) 잠금이 획득됩니다.At the end of the operation, for a short time, an S (Shared) lock is acquired on the source if a nonclustered index is being created; or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. 로컬 임시 테이블에서 인덱스를 생성하는 경우에는 ONLINE을 ON으로 설정할 수 없습니다.ONLINE cannot be set to ON when an index is being created on a local temporary table. 단일 스레드 힙 다시 작성 작업만 허용됩니다.Only single-threaded heap rebuild operation is allowed.

SWITCH 또는 온라인 인덱스 다시 작성을 위해 DDL을 실행하려면 특정 테이블에서 실행 중인 모든 활성 차단 트랜잭션이 완료되어야 합니다.To execute the DDL for SWITCH or online index rebuild, all active blocking transactions running on a particular table must be completed. 실행하면 SWITCH 또는 다시 작성 작업으로 인해 새 트랜잭션이 시작되지 않고 작업 처리량에 상당한 영향을 주고 일시적으로 기본 테이블에 대한 액세스가 지연될 수 있습니다.When executing, the SWITCH or rebuild operation prevents new transaction from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
인덱스 작업 중에 테이블 잠금이 적용됩니다.Table locks are applied for the duration of the index operation. 클러스터형 인덱스를 생성, 다시 작성 또는 삭제하거나 비클러스터형 인덱스를 다시 작성 또는 삭제하는 오프라인 인덱스 작업을 통해 테이블의 SCH-M(스키마 수정) 잠금을 획득합니다.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. 이 경우 작업 중에 모든 사용자가 기본 테이블에 액세스할 수 없게 됩니다.This prevents all user access to the underlying table for the duration of the operation. 비클러스터형 인덱스를 만드는 오프라인 인덱스 작업을 통해 테이블의 S(공유) 잠금을 획득합니다.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. 따라서 기본 테이블을 업데이트할 수 없지만 SELECT 문과 같은 읽기 작업은 허용됩니다.This prevents updates to the underlying table but allows read operations, such as SELECT statements. 다중 스레드 힙 다시 작성 작업이 허용됩니다.Multi-threaded heap rebuild operations are allowed.

자세한 내용은 온라인 인덱스 작업의 작동 원리를 참조하세요.For more information, see How Online Index Operations Work.

참고

온라인 인덱스 작업은 일부 SQL ServerSQL Server버전에서 사용할 수 있습니다.Online index operations are not available in every edition of SQL ServerSQL Server. 자세한 내용은 SQL Server 2016의 버전과 지원하는 기능을 참조하세요.For more information, see Editions and Supported Features for SQL Server 2016.

MOVE TO { partition_scheme_name ***(** column_name* [ 1 , ... n] ) | filegroup | " default " }MOVE TO { partition_scheme_name ***(** column_name* [ 1 , ... n] ) | filegroup | " default " }
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

현재 클러스터형 인덱스의 리프 수준에 있는 데이터 행을 이동할 위치를 지정합니다.Specifies a location to move the data rows currently in the leaf level of the clustered index. 테이블이 새 위치로 이동됩니다.The table is moved to the new location. 이 옵션은 클러스터형 인덱스를 만드는 제약 조건에만 적용됩니다.This option applies only to constraints that create a clustered index.

참고

이 컨텍스트에서 default는 키워드가 아니라In this context, default is not a keyword. 기본 파일 그룹에 대한 식별자이므로 MOVE TO " default " 또는 MOVE TO [ default ] 와 같이 구분되어야 합니다.It is an identifier for the default filegroup and must be delimited, as in MOVE TO " default " or MOVE TO [ default ]. " default " 를 지정하면 현재 세션의 QUOTED_IDENTIFIER 옵션이 ON이어야 합니다.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. 이 값은 기본 설정입니다.This is the default setting. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하세요.For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

{ CHECK | NOCHECK } CONSTRAINT{ CHECK | NOCHECK } CONSTRAINT
constraint_name의 설정 여부를 지정합니다.Specifies that constraint_name is enabled or disabled. 이 옵션은 FOREIGN KEY 및 CHECK 제약 조건에만 사용할 수 있습니다.This option can only be used with FOREIGN KEY and CHECK constraints. NOCHECK를 지정하면 제약 조건이 해제되고 향후 해당 열에 삽입하거나 해당 열을 업데이트할 때 제약 조건에 대한 유효성 검사가 수행되지 않습니다.When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. DEFAULT, PRIMARY KEY 및 UNIQUE 제약 조건은 해제할 수 없습니다.DEFAULT, PRIMARY KEY, and UNIQUE constraints cannot be disabled.

ALLALL
NOCHECK 옵션을 사용하여 모든 제약 조건을 해제하거나 CHECK 옵션을 사용하여 모든 제약 조건을 설정하도록 지정합니다.Specifies that all constraints are either disabled with the NOCHECK option or enabled with the CHECK option.

{ ENABLE | DISABLE } TRIGGER{ ENABLE | DISABLE } TRIGGER
trigger_name의 설정 여부를 지정합니다.Specifies that trigger_name is enabled or disabled. 트리거를 해제해도 테이블에는 계속 정의되어 있습니다. 그러나 테이블에 대해 INSERT, UPDATE 또는 DELETE 문이 실행되면 트리거가 다시 설정될 때까지 트리거의 동작이 수행되지 않습니다.When a trigger is disabled it is still defined for the table; however, when INSERT, UPDATE, or DELETE statements are executed against the table, the actions in the trigger are not performed until the trigger is re-enabled.

ALLALL
테이블의 모든 트리거를 설정하거나 해제하도록 지정합니다.Specifies that all triggers in the table are enabled or disabled.

trigger_nametrigger_name
설정하거나 해제할 트리거의 이름을 지정합니다.Specifies the name of the trigger to disable or enable.

{ ENABLE | DISABLE } CHANGE_TRACKING{ ENABLE | DISABLE } CHANGE_TRACKING
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

테이블에 대해 변경 내용 추적이 설정되는지 여부를 지정합니다.Specifies whether change tracking is enabled disabled for the table. 기본적으로 변경 내용 추적은 비활성화됩니다.By default, change tracking is disabled.

이 옵션은 데이터베이스에 대해 변경 내용 추적이 설정된 경우에만 사용할 수 있습니다.This option is available only when change tracking is enabled for the database. 자세한 내용은 ALTER DATABASE SET 옵션(Transact-SQL)을 참조하세요.For more information, see ALTER DATABASE SET Options (Transact-SQL).

변경 내용 추적을 설정하려면 테이블에 기본 키가 있어야 합니다.To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

데이터베이스 엔진Database Engine에서 업데이트된 변경 내용 추적 열을 추적하는지 여부를 지정합니다.Specifies whether the 데이터베이스 엔진Database Engine tracks which change tracked columns were updated. 기본값은 OFF입니다.The default value is OFF.

SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

다음 방법 중 하나를 사용하여 데이터 블록을 전환합니다.Switches a block of data in one of the following ways:

  • 테이블의 모든 데이터를 기존의 분할된 테이블에 파티션으로 재할당합니다.Reassigns all data of a table as a partition to an already-existing partitioned table.

  • 분할된 테이블 간에 파티션을 전환합니다.Switches a partition from one partitioned table to another.

  • 분할된 테이블의 한 파티션에 있는 모든 데이터를 기존의 분할되지 않은 테이블에 재할당합니다.Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

table이 분할된 테이블인 경우 source_partition_number_expression을 지정해야 합니다.If table is a partitioned table, source_partition_number_expression must be specified. target_table이 분할된 테이블인 경우 target_partition_number_expression을 지정해야 합니다.If target_table is partitioned, target_partition_number_expression must be specified. 테이블의 데이터를 기존의 분할된 테이블에 파티션으로 재할당하거나 분할된 한 테이블의 파티션을 다른 테이블로 전환하는 경우에는 비어 있는 대상 파티션이 있어야 합니다.If reassigning a table's data as a partition to an already-existing partitioned table, or switching a partition from one partitioned table to another, the target partition must exist and it must be empty.

한 파티션의 데이터를 재할당하여 단일 테이블을 구성하는 경우 비어 있는 대상 테이블이 미리 만들어져 있어야 합니다.If reassigning one partition's data to form a single table, the target table must already be created and it must be empty. 원본 테이블 또는 파티션과 대상 테이블 또는 파티션이 모두 같은 파일 그룹에 있어야 합니다.Both the source table or partition, and the target table or partition, must reside in the same filegroup. 해당하는 인덱스 또는 인덱스 파티션도 같은 파일 그룹에 있어야 합니다.The corresponding indexes, or index partitions, must also reside in the same filegroup. 파티션 전환에는 여러 가지 추가 제한 사항이 적용됩니다.Many additional restrictions apply to switching partitions. tabletarget_table은 동일할 수 없습니다.table and target_table cannot be the same. target_table은 여러 부분으로 구성된 식별자일 수 있습니다.target_table can be a multi-part identifier.

source_partition_number_expressiontarget_partition_number_expression은 변수와 함수를 참조할 수 있는 상수 식입니다.source_partition_number_expression and target_partition_number_expression are constant expressions that can reference variables and functions. 이러한 식은 사용자 정의 형식 변수와 사용자 정의 함수를 포함하며These include user-defined type variables and user-defined functions. Transact-SQLTransact-SQL 식을 참조할 수 없습니다.They cannot reference Transact-SQLTransact-SQL expressions.

클러스터된 columstore 인덱스가 포함된 분할 테이블은 분할된 힙처럼 동작합니다.A partitioned table with a clustered columstore index behaves like a partitioned heap:

  • 기본 키에는 파티션 키가 포함되어야 합니다.The primary key must include the partition key.

  • 고유 인덱스에는 파티션 키가 포함되어야 합니다.A unique index must include the partition key. 기존 고유 인덱스에 파티션 키를 포함할 경우 고유성이 변경될 수 있습니다.Note that including the partition key to an existing unique index can change the uniqueness.

  • 파티션을 전환하려면 클러스터된 모든 인덱스에 파티션 키를 포함해야 합니다.In order to switch partitions, all non-clustered indexes must include the partition key.

복제를 사용할 경우 SWITCH 제한에 대해서는 분할된 테이블 및 인덱스 복제를 참조하세요.For SWITCH restriction when using replication, see Replicate Partitioned Tables and Indexes.

SQL ServerSQL Server 2016 CTP1 및 버전 V12 이전의 SQL Database용으로 구축된 비클러스터형 columnstore 인덱스는 읽기 전용 형식입니다.Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. 비클러스터형 columnstore 인덱스는 PARTITION 연산을 수행하기 전 최신 형식(업데이트 가능)으로 다시 빌드해야 합니다.Nonclustered columnstore indexes must be rebuilt to the current format (which is updatable) before any PARTITION operations can be performed.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.|

FILESTREAM 데이터가 저장되는 위치를 지정합니다.Specifies where FILESTREAM data is stored.

SET FILESTREAM_ON 절이 있는 ALTER TABLE은 테이블에 FILESTREAM 열이 없는 경우에만 성공합니다.ALTER TABLE with the SET FILESTREAM_ON clause will succeed only if the table has no FILESTREAM columns. FILESTREAM 열은 두 번째 ALTER TABLE 문을 사용하여 추가할 수 있습니다.The FILESTREAM columns can be added by using a second ALTER TABLE statement.

partition_scheme_name이 지정되면 CREATE TABLE에 대한 규칙이 적용됩니다.If partition_scheme_name is specified, the rules for CREATE TABLE apply. 테이블은 이미 행 데이터를 위해 분할되어 있어야 하며 테이블의 파티션 구성표는 FILESTREAM 파티션 구성표와 동일한 파티션 함수 및 열을 사용해야 합니다.The table should already be partitioned for row data, and its partition scheme must use the same partition function and columns as the FILESTREAM partition scheme.

filestream_filegroup_name은 FILESTREAM 파일 그룹의 이름입니다.filestream_filegroup_name specifies the name of a FILESTREAM filegroup. 파일 그룹에는 CREATE DATABASE 또는 ALTER DATABASE 문을 사용하여 파일 그룹에 대해 정의된 한 파일이 있어야 하며 그렇지 않으면 오류가 발생합니다.The filegroup must have one file that is defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error is raised.

" default " 는 DEFAULT 속성이 설정된 FILESTREAM 파일 그룹을 지정합니다." default " specifies the FILESTREAM filegroup with the DEFAULT property set. FILESTREAM 파일 그룹이 없으면 오류가 발생합니다.If there is no FILESTREAM filegroup, an error is raised.

" NULL " 은 테이블의 FILESTREAM 파일 그룹에 대한 모든 참조를 제거하도록 지정합니다." NULL " specifies that all references to FILESTREAM filegroups for the table will be removed. All FILESTREAM 열을 먼저 삭제해야 합니다.All FILESTREAM columns must be dropped first. SET FILESTREAM_ON =" NULL " 을 사용하여 테이블과 관련된 모든 FILESTREAM 데이터를 삭제해야 합니다.You must use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that is associated with a table.

SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name .SET ( SYSTEM_VERSIONING = { OFF | ON [ ( HISTORY_TABLE = schema_name . history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] } )
적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

테이블의 시스템 버전 관리를 비활성화하거나 테이블의 시스템 버전 관리를 활성화합니다.Either disables system versioning of a table or enables system versioning of a table. 시스템은 테이블의 시스템 버전 관리를 활성화하기 위해 시스템 버전 관리에 대한 데이터 형식, Null 허용 여부, 기본 키 제약 요구 사항이 충족되었는지 여부를 검증합니다.To enable system versioning of a table, the system verifies that the datatype, nullability constraint, and primary key constraint requirements for system versioning are met. HISTORY_TABLE 인수를 사용하지 않는 경우 시스템에서 현재 테이블의 스키마와 일치하는 새 기록 테이블을 생성하여 두 테이블 간에 링크를 만들고 시스템이 기록 테이블의 현재 테이블에서 각 레코드의 기록을 기록할 수 있도록 합니다.If the HISTORY_TABLE argument is not used, the system generates a new history table matching the schema of the current table, creating a link between the two tables and enables the system to record the history of each record in the current table in the history table. 이 기록 테이블의 이름은 MSSQL_TemporalHistoryFor<primary_table_object_id>가 됩니다.The name of this history table will be MSSQL_TemporalHistoryFor<primary_table_object_id>. HISTORY_TABLE 인수를 사용하여 기존 기록 테이블에 대한 링크를 만들고 해당 테이블을 사용하면 현재 테이블과 지정된 테이블 간에 링크가 생성됩니다.If the HISTORY_TABLE argument is used to create a link to and use an existing history table, the link is created between the current table and the specified table. 기존 기록 테이블에 대한 링크를 만드는 경우 데이터 일관성 검사를 수행하도록 선택할 수 있습니다.When creating a link to an existing history table, you can choose to perform a data consistency check. 이 데이터 일관성 확인을 통해 기존 레코드가 겹치지 않도록 합니다.This data consistency check ensures that existing records do not overlap. 기본값은 데이터 일관성 검사를 수행하는 것입니다.Performing the data consistency check is the default. 자세한 내용은 Temporal Tables을 참조하세요.For more information, see Temporal Tables.

HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} } 적용 대상: Azure SQL 데이터베이스Azure SQL Database.HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} } Applies to: Azure SQL 데이터베이스Azure SQL Database.

temporal 테이블의 기록 데이터에 대한 유한 또는 무한 보존을 지정합니다.Specifies finite or infinte retention for historical data in temporal table. 생략할 경우 무한 보존이 가정됩니다.If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

테이블에 대해 허용되는 잠금 에스컬레이션 방법을 지정합니다.Specifies the allowed methods of lock escalation for a table.

AUTOAUTO
이 옵션을 선택하면 SQL Server 데이터베이스 엔진SQL Server Database Engine에서 테이블 스키마에 적절한 잠금 에스컬레이션 세분성을 선택할 수 있습니다.This option allows SQL Server 데이터베이스 엔진SQL Server Database Engine to select the lock escalation granularity that is appropriate for the table schema.

  • 테이블이 분할되지 않은 경우에는 잠금이 파티션으로 에스컬레이션됩니다.If the table is partitioned, lock escalation will be allowed to partition. 잠금이 파티션 수준으로 에스컬레이션된 후에는 나중에 잠금이 TABLE 세분성으로 에스컬레이션되지 않습니다.After the lock is escalated to the partition level, the lock will not be escalated later to TABLE granularity.

  • 테이블이 분할되지 않은 경우에는 잠금이 TABLE 세분성으로 에스컬레이션됩니다.If the table is not partitioned, the lock escalation will be done to the TABLE granularity.

TABLETABLE
잠금 에스컬레이션은 테이블이 분할되었는지 여부에 관계없이 테이블 수준 세분성으로 수행됩니다.Lock escalation will be done at table-level granularity regardless whether the table is partitioned or not partitioned. 기본값은 TABLE입니다.TABLE is the default value.

DISABLEDISABLE
대부분의 경우 잠금 에스컬레이션이 허용되지 않습니다.Prevents lock escalation in most cases. 테이블 수준 잠금은 부분적으로 허용됩니다.Table-level locks are not completely disallowed. 예를 들어 직렬화 가능 격리 수준에서 클러스터형 인덱스가 없는 테이블을 검색하면 데이터베이스 엔진Database Engine에서 테이블 잠금을 사용하여 데이터 무결성을 보호해야 합니다.For example, when you are scanning a table that has no clustered index under the serializable isolation level, 데이터베이스 엔진Database Engine must take a table lock to protect data integrity.

REBUILDREBUILD
REBUILD WITH 구문을 사용하여 분할된 테이블의 파티션을 포함한 전체 테이블을 다시 작성할 수 있습니다.Use the REBUILD WITH syntax to rebuild an entire table including all the partitions in a partitioned table. 테이블에 클러스터형 인덱스가 포함된 경우 REBUILD 옵션을 사용하면 클러스터형 인덱스가 다시 작성됩니다.If the table has a clustered index, the REBUILD option rebuilds the clustered index. REBUILD 작업은 ONLINE 작업으로만 수행할 수 있습니다.REBUILD can be performed as an ONLINE operation.

REBUILD PARTITION 구문을 사용하여 분할된 테이블의 단일 파티션을 다시 작성할 수 있습니다.Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

파티션 압축 설정을 변경할 때 모든 파티션을 다시 작성합니다.Rebuilds all partitions when changing the partition compression settings.

REBUILD WITH ( <rebuild_option> )REBUILD WITH ( <rebuild_option> )
모든 옵션이 클러스터형 인덱스가 있는 테이블에 적용됩니다.All options apply to a table with a clustered index. 테이블에 클러스터형 인덱스가 없는 경우에는 일부 옵션만 힙 구조에 영향을 줍니다.If the table does not have a clustered index, the heap structure is only affected by some of the options.

REBUILD 작업에 특정 압축 설정이 지정되어 있지 않으면 파티션의 현재 압축 설정이 사용됩니다.When a specific compression setting is not specified with the REBUILD operation, the current compression setting for the partition is used. 현재 설정을 반환하려면 sys.partitions 카탈로그 뷰에서 data_compression 열을 쿼리합니다.To return the current setting, query the data_compression column in the sys.partitions catalog view.

다시 작성 옵션에 대한 자세한 내용은 index_option(Transact-SQL)을 참조하세요.For complete descriptions of the rebuild options, see index_option (Transact-SQL).

DATA_COMPRESSIONDATA_COMPRESSION
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

지정된 테이블, 파티션 번호 또는 파티션 범위에 대한 데이터 압축 옵션을 지정합니다.Specifies the data compression option for the specified table, partition number, or range of partitions. 다음과 같은 옵션이 있습니다.The options are as follows:

없음NONE
테이블 또는 지정된 파티션이 압축되지 않습니다.Table or specified partitions are not compressed. columnstore 테이블에는 적용되지 않습니다.This does not apply to columnstore tables.

ROWROW
테이블 또는 지정된 파티션이 행 압축을 사용하여 압축됩니다.Table or specified partitions are compressed by using row compression. columnstore 테이블에는 적용되지 않습니다.This does not apply to columnstore tables.

PAGEPAGE
테이블 또는 지정된 파티션이 페이지 압축을 사용하여 압축됩니다.Table or specified partitions are compressed by using page compression. columnstore 테이블에는 적용되지 않습니다.This does not apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

columnstore 테이블에만 적용됩니다.Applies only to columnstore tables. COLUMNSTORE에서는 COLUMNSTORE_ARCHIVE 옵션으로 압축된 파티션을 압축 해제하도록 지정합니다.COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. 데이터는 복구될 때 모든 columnstore 테이블에 사용된 columnstore 압축으로 계속 압축됩니다.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

클러스터형 columnstore 인덱스로 저장된 테이블인 columnstore 테이블에만 적용됩니다.Applies only to columnstore tables, which are tables stored with a clustered columnstore index. COLUMNSTORE_ARCHIVE는 지정된 파티션을 보다 작은 크기로 압축합니다.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. 보관하거나 보다 적은 저장소가 필요한 기타 상황에서 사용할 수 있으며 저장 및 검색에 더 많은 시간을 이용할 수 있습니다.This can be used for archival, or for other situations that require less storage and can afford more time for storage and retrieval

여러 파티션을 동시에 다시 작성하려면 index_option(Transact-SQL)을 참조하세요.To rebuild multiple partitions at the same time, see index_option (Transact-SQL). 테이블에 클러스터형 인덱스가 없는 경우 데이터 압축을 변경하면 힙과 비클러스터형 인덱스가 다시 작성됩니다.If the table does not have a clustered index, changing the data compression rebuilds the heap and the nonclustered indexes. 압축에 대한 자세한 내용은 데이터 압축을 참조하세요.For more information about compression, see Data Compression.

ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
인덱스 작업 중 쿼리 및 데이터 수정을 위해 기본 테이블의 단일 파티션 및 관련된 인덱스를 사용할 수 있는지 여부를 지정합니다.Specifies whether a single partition of the underlying tables and associated indexes are available for queries and data modification during the index operation. 기본값은 OFF입니다.The default is OFF. REBUILD 작업은 ONLINE 작업으로만 수행할 수 있습니다.REBUILD can be performed as an ONLINE operation.

ONON
인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다.Long-term table locks are not held for the duration of the index operation. 인덱스 다시 작성을 시작할 때 테이블에 대한 S-잠금이 필요하고 온라인 인덱스 다시 작성을 종료할 때 테이블에 대한 Sch-M 잠금이 필요합니다.A S-lock on the table is required in the beginning of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. 두 잠금 모두 짧은 메타데이터 잠금이지만 특히 Sch-M 잠금은 모든 차단 트랜잭션이 완료될 때까지 기다려야 합니다.Although both locks are short metadata locks, especially the Sch-M lock must wait for all blocking transactions to be completed. 대기 시간 동안 Sch-M 잠금은 동일 테이블에 액세스할 때 이 잠금 뒤에서 기다리는 다른 모든 트랜잭션을 차단합니다.During the wait time the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

참고

온라인 인덱스 다시 작성은 이 섹션의 뒷부분에서 설명하는 low_priority_lock_wait 옵션을 설정할 수 있습니다.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
인덱스 작업 중에 테이블 잠금이 적용됩니다.Table locks are applied for the duration of the index operation. 이 경우 작업 중에 모든 사용자가 기본 테이블에 액세스할 수 없게 됩니다.This prevents all user access to the underlying table for the duration of the operation.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNScolumn_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

열 집합의 이름입니다.Is the name of the column set. 열 집합은 구조화된 출력으로 테이블의 모든 스파스 열을 결합하는 형식화되지 않은 XML 표현입니다.A column set is an untyped XML representation that combines all of the sparse columns of a table into a structured output. 스파스 열을 포함하는 테이블에는 열 집합을 추가할 수 없습니다.A column set cannot be added to a table that contains sparse columns. 열 집합에 대한 자세한 내용은 열 집합 사용을 참조하세요.For more information about column sets, see Use Column Sets.

{ ENABLE | DISABLE } FILETABLE_NAMESPACE{ ENABLE | DISABLE } FILETABLE_NAMESPACE
적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

FileTable에 대한 시스템 정의 제약 조건을 사용하거나 사용하지 않도록 설정합니다.Enables or disables the system-defined constraints on a FileTable. FileTable에서만 사용할 수 있습니다.Can only be used with a FileTable.

SET ( FILETABLE_DIRECTORY = directory_name )SET ( FILETABLE_DIRECTORY = directory_name )
적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

Windows 호환 FileTable 디렉터리 이름을 지정합니다.Specifies the Windows-compatible FileTable directory name. 이 이름은 데이터베이스의 모든 FileTable 디렉터리 이름 중에서 고유해야 합니다.This name should be unique among all the FileTable directory names in the database. 고유성을 비교할 때는 SQL 데이터 정렬 설정과 관계없이 대/소문자가 구분되지 않습니다.Uniqueness comparison is case-insensitive, regardless of SQL collation settings. FileTable에서만 사용할 수 있습니다.Can only be used with a FileTable.

 SET (  
        REMOTE_DATA_ARCHIVE   
        {  
            = ON (  <table_stretch_options> )  
          | = OFF_WITHOUT_DATA_RECOVERY  
          ( MIGRATION_STATE = PAUSED ) | ( <table_stretch_options> [, ...n] )  
        } )  

적용 대상: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

테이블에 Stretch Database를 사용하거나 사용하지 않도록 설정합니다.Enables or disables Stretch Database for a table. 자세한 내용은 Stretch Database를 참조하십시오.For more info, see Stretch Database.

테이블에 대해 Stretch Database 활성화Enabling Stretch Database for a table

ON을 지정하여 테이블에 대해 Stretch를 활성화한 경우 MIGRATION_STATE = OUTBOUND를 지정하여 데이터 마이그레이션을 즉시 시작하거나 MIGRATION_STATE = PAUSED를 지정하여 데이터 마이그레이션을 연기해야 합니다.When you enable Stretch for a table by specifying ON, you also have to specify MIGRATION_STATE = OUTBOUND to begin migrating data immediately, or MIGRATION_STATE = PAUSED to postpone data migration. 기본값은 MIGRATION_STATE = OUTBOUND입니다.The default value is MIGRATION_STATE = OUTBOUND. 테이블의 Stretch 활성화에 대한 자세한 내용은 테이블에 대한 Stretch Database 활성화를 참조하세요.For more info about enabling Stretch for a table, see Enable Stretch Database for a table.

필수 구성 요소.Prerequisites. 테이블에 대해 Stretch를 활성화하기 전에 서버 및 데이터베이스에서 Stretch를 활성화해야 합니다.Before you enable Stretch for a table, you have to enable Stretch on the server and on the database. 자세한 내용은 Enable Stretch Database for a database를 참조하십시오.For more info, see Enable Stretch Database for a database.

사용 권한.Permissions. 데이터베이스 또는 테이블에 대해 Stretch를 활성화하려면 db_owner 권한이 필요합니다.Enabling Stretch for a database or a table requires db_owner permissions. 또한 테이블에 대해 Stretch를 활성화하면 테이블에 대한 ALTER 권한이 필요합니다.Enabling Stretch for a table also requires ALTER permissions on the table.

테이블에서 Stretch Database 비활성화Disabling Stretch Database for a table

테이블에 대한 Stretch를 비활성화할 경우 이미 Azure로 마이그레이션된 원격 데이터에 두 가지 옵션을 사용할 수 있습니다.When you disable Stretch for a table, you have two options for the remote data that has already been migrated to Azure. 자세한 내용은 Stretch Database 비활성화 및 원격 데이터 다시 가져오기를 사용하세요.For more info, see Disable Stretch Database and bring back remote data.

  • 테이블에서 스트레치를 비활성화하고 Azure에서 SQL Server로 테이블에 대한 원격 데이터를 다시 복사하려면 다음 명령을 실행합니다.To disable Stretch for a table and copy the remote data for the table from Azure back to SQL Server, run the following command. 이 명령은 취소할 수 없습니다.This command can't be canceled.

    ALTER TABLE \<table name>
       SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;  
    

    이 작업으로 인해 데이터 전송 비용이 발생하며 이 작업은 취소할 수 없습니다.This operation incurs data transfer costs, and it can't be canceled. 자세한 내용은 데이터 전송 가격 정보를 참조하십시오.For more info, see Data Transfers Pricing Details.

    Azure에서 SQL Server로 모든 원격 데이터를 다시 복사한 후 테이블에서 스트레치가 비활성화됩니다.After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • 테이블에서 스트레치를 비활성화하고 원격 데이터를 중지하려면 다음 명령을 실행합니다.To disable Stretch for a table and abandon the remote data, run the following command.

    ALTER TABLE \<table_name>
       SET ( REMOTE_DATA_ARCHIVE = OFF_WITHOUT_DATA_RECOVERY ( MIGRATION_STATE = PAUSED ) ) ;  
    

    테이블에서 Stretch Database를 비활성화하면 데이터 마이그레이션이 중단되고 쿼리 결과에 원격 테이블의 결과가 더 이상 포함되지 않습니다.After you disable Stretch Database for a table, data migration stops and query results no longer include results from the remote table.

    Stretch를 사용하지 않도록 설정해도 원격 테이블은 제거되지 않습니다.Disabling Stretch does not remove the remote table. 원격 테이블을 삭제하려면 Azure 관리 포털을 사용하여 삭제해야 합니다.If you want to delete the remote table, you have to drop it by using the Azure management portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
적용 대상: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

선택적으로 필터 조건자를 지정하여 기록 및 현재 데이터를 모두 포함하는 테이블에서 마이그레이션할 행을 선택합니다.Optionally specifies a filter predicate to select rows to migrate from a table that contains both historical and current data. 조건자는 결정적 인라인 테이블 반환 함수를 호출해야 합니다.The predicate must call a deterministic inline table-valued function. 자세한 내용은 테이블에 대해 Stretch Database 활성화필터 함수를 사용하여 마이그레이션할 행 선택(Stretch Database)을 참조하세요.For more info, see Enable Stretch Database for a table and Select rows to migrate by using a filter function (Stretch Database).

중요

제대로 수행되지 않는 필터 조건자를 제공하면 데이터 마이그레이션 성능도 저하됩니다.If you provide a filter predicate that performs poorly, data migration also performs poorly. 스트레치 데이터베이스는 CROSS APPLY 연산자를 사용하여 테이블에 필터 조건자를 적용합니다.Stretch Database applies the filter predicate to the table by using the CROSS APPLY operator.

필터 조건자를 지정하지 않으면 전체 테이블이 마이그레이션됩니다.If you don't specify a filter predicate, the entire table is migrated.

필터 조건자를 지정할 경우 MIGRATION_STATE도 지정해야 합니다.When you specify a filter predicate, you also have to specify MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
적용 대상: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

온라인 인덱스 다시 작성에서 이 테이블의 차단 작업을 대기해야 합니다.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY는 온라인 인덱스 작성 작업이 대기하는 동안 다른 작업을 진행할 수 있도록 온라인 인덱스 재작성 작업이 우선 순위가 낮은 잠금을 대기함을 나타냅니다.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. WAIT AT LOW PRIORITY 옵션을 생략하는 것은 WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)와 동일합니다.Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES ]MAX_DURATION = time [MINUTES ]
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

DDL 명령을 실행할 때 SWITCH 또는 온라인 인덱스 다시 작성 잠금이 낮은 우선 순위로 대기하는 시간(분 단위로 지정된 정수 값)입니다.The wait time (an integer value specified in minutes) that the SWITCH or online index rebuild locks will wait with low priority when executing the DDL command. 작업이 MAX_DURATION 시간 동안 차단되면 ABORT_AFTER_WAIT 작업 중 하나가 실행됩니다.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will be executed. MAX_DURATION 시간은 항상 분 단위이며 단어 MINUTES는 생략할 수 있습니다.MAX_DURATION time is always in minutes, and the word MINUTES can be omitted.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

없음NONE
보통(일반) 우선 순위로 잠금을 계속 대기합니다.Continue waiting for the lock with normal (regular) priority.

SELFSELF
어떤 동작도 수행하지 않고 현재 실행 중인 SWITCH 또는 온라인 인덱스 다시 작성 DDL 작업을 종료합니다.Exit the SWITCH or online index rebuild DDL operation currently being executed without taking any action.

BLOCKERSBLOCKERS
작업을 계속할 수 있도록 SWITCH 또는 온라인 인덱스 다시 작성 DDL 작업을 현재 차단하는 모든 사용자 트랜잭션을 종료합니다.Kill all user transactions that block currently the SWITCH or online index rebuild DDL operation so that the operation can continue.

ALTER ANY CONNECTION 권한이 필요합니다.Requires ALTER ANY CONNECTION permission.

IF EXISTSIF EXISTS
적용 대상: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) ~ 현재 버전) 및 Azure SQL 데이터베이스Azure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) through current version) and Azure SQL 데이터베이스Azure SQL Database.

이미 있는 열 또는 제약 조건을 조건부로 삭제합니다.Conditionally drops the column or constraint only if it already exists.

RemarksRemarks

새 데이터 행을 추가하려면INSERT를 사용합니다.To add new rows of data, use INSERT. 데이터 행을 제거하려면 DELETE 또는 TRUNCATE TABLE을 사용합니다.To remove rows of data, use DELETE or TRUNCATE TABLE. 기존 행의 값을 변경하려면 UPDATE를 사용합니다.To change the values in existing rows, use UPDATE.

프로시저 캐시에 테이블을 참조하는 실행 계획이 있는 경우 ALTER TABLE은 다음에 실행할 때 이러한 실행 계획을 다시 컴파일하도록 표시합니다.If there are any execution plans in the procedure cache that reference the table, ALTER TABLE marks them to be recompiled on their next execution.

열 크기 변경Changing the Size of a Column

ALTER COLUMN 절에 열 데이터 형식의 새 크기를 지정하여 열의 길이, 전체 자릿수 또는 소수 자릿수를 변경할 수 있습니다.You can change the length, precision, or scale of a column by specifying a new size for the column data type in the ALTER COLUMN clause. 열에 데이터가 있는 경우 새 크기는 데이터의 최대 크기보다 작을 수 없습니다.If data exists in the column, the new size cannot be smaller than the maximum size of the data. 또한 열이 varchar, nvarchar 또는 varbinary 데이터 형식이고 인덱스가 PRIMARY KEY 제약 조건의 결과가 아닌 경우를 제외하고 열은 인덱스에서 정의될 수 없습니다.Also, the column cannot be defined in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index is not the result of a PRIMARY KEY constraint. 예 16을 참조하세요.See example P.

잠금 및 ALTER TABLELocks and ALTER TABLE

ALTER TABLE에 지정된 변경 내용은 즉시 구현됩니다.The changes specified in ALTER TABLE are implemented immediately. 변경할 때 테이블의 행을 수정해야 하는 경우 ALTER TABLE은 행을 업데이트합니다.If the changes require modifications of the rows in the table, ALTER TABLE updates the rows. ALTER TABLE은 테이블에 대한 스키마 수정 SCH-M 잠금을 획득하여 변경 중에 다른 연결이 테이블의 메타데이터도 참조하지 않도록 합니다. 단, 마지막에 아주 짧은 SCH-M 잠금이 필요한 온라인 인덱스 작업은 예외입니다.ALTER TABLE acquires a schema modify (SCH-M) lock on the table to make sure that no other connections reference even the metadata for the table during the change, except online index operations that require a very short SCH-M lock at the end. ALTER TABLE…SWITCH 작업에서 원본 및 대상 테이블 모두에 대해 잠금이 획득됩니다.In an ALTER TABLE…SWITCH operation, the lock is acquired on both the source and target tables. 테이블의 수정 사항이 기록되며 완전히 복구 가능합니다.The modifications made to the table are logged and fully recoverable. 열 삭제 또는 일부 SQL ServerSQL Server 버전의 경우 기본값이 있는 NOT NULL 열 추가와 같이 매우 큰 테이블의 모든 행에 영향을 주는 변경 작업은 완료하는 데 시간이 오래 걸리고 많은 로그 레코드를 생성할 수 있습니다.Changes that affect all the rows in very large tables, such as dropping a column or, on some editions of SQL ServerSQL Server, adding a NOT NULL column with a default value, can take a long time to complete and generate many log records. 이러한 ALTER TABLE 문은 많은 행에 영향을 주는 INSERT, UPDATE 또는 DELETE 문과 마찬가지로 주의해서 실행해야 합니다.These ALTER TABLE statements should be executed with the same care as any INSERT, UPDATE, or DELETE statement that affects many rows.

온라인 작업으로 NOT NULL 열 추가Adding NOT NULL Columns as an Online Operation

SQL Server 2012(11.x)SQL Server 2012 (11.x) 엔터프라이즈 버전부터는 기본값이 포함된 NOT NULL 열을 추가하는 작업은 기본값이 런타임 상수인 경우 온라인 작업입니다.Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x) Enterprise Edition, adding a NOT NULL column with a default value is an online operation when the default value is a runtime constant. 이는 테이블의 행 수에 관계없이 작업이 거의 즉시 완료된다는 의미입니다.This means that the operation is completed almost instantaneously regardless of the number of rows in the table. 작업 중에 테이블의 기존 행은 업데이트되지 않고 대신 기본값이 테이블의 메타데이터에만 저장되고 이러한 행에 액세스하는 쿼리에 필요한 경우 해당 값이 조회되기 때문입니다.This is because the existing rows in the table are not updated during the operation; instead, the default value is stored only in the metadata of the table and the value is looked up as needed in queries that access these rows. 이 동작은 자동이므로 온라인 작업을 구현하는 데 ADD COLUMN 구문 이상의 추가 구문이 필요하지 않습니다.This behavior is automatic; no additional syntax is required to implement the online operation beyond the ADD COLUMN syntax. 런타임 상수는 테이블의 각 행에 대해 해당 결정성과 관계없이 런타임에 동일한 값을 생성하는 식입니다.A runtime constant is an expression that produces the same value at runtime for each row in the table regardless of its determinism. 예를 들어 상수 식 "My temporary data" 또는 시스템 함수 GETUTCDATETIME()은 런타임 상수입니다.For example, the constant expression "My temporary data", or the system function GETUTCDATETIME() are runtime constants. 이와 달리 NEWID() 또는 NEWSEQUENTIALID() 함수는 테이블의 각 행에 대해 고유 값이 생성되므로 런타임 상수가 아닙니다.In contrast, the functions NEWID() or NEWSEQUENTIALID() are not runtime constants because a unique value is produced for each row in the table. 기본값이 포함된 런타임 상수가 아닌 NOT NULL 열을 추가하는 작업은 항상 오프라인으로 수행되며 작업 기간에 배타적 SCH-M 잠금이 획득됩니다.Adding a NOT NULL column with a default value that is not a runtime constant is always performed offline and an exclusive (SCH-M) lock is acquired for the duration of the operation.

기존 행은 메타데이터에 저장된 값을 참조하는 반면, 기본값은 새로 삽입되는 행에 대한 새 행에 저장되고 열에 대한 다른 값을 지정하지 않습니다.While the existing rows reference the value stored in metadata, the default value is stored on the row for any new rows that are inserted and do not specify another value for the column. 메타데이터에 저장된 기본값은 행이 업데이트될 때(UPDATE 문에 실제 행이 지정되어 있지 않는 경우에도 동일) 또는 테이블이나 클러스터형 인덱스를 다시 작성하는 경우 기존 행으로 이동됩니다.The default value stored in metadata is moved to an existing row when the row is updated (even if the actual column is not specified in the UPDATE statement), or if the table or clustered index is rebuilt.

varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography 형식 또는 CLR UDTS의 열은 온라인 작업에 추가할 수 없습니다.Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, cannot be added in an online operation. 열을 온라인으로 추가할 수 없으며, 온라인으로 추가하면 최대로 가능한 행 크기가 8,060바이트 제한을 초과합니다.A column cannot be added online if doing so causes the maximum possible row size to exceed the 8,060 byte limit. 이러한 경우 열은 오프라인 작업으로 추가됩니다.The column is added as an offline operation in this case.

병렬 계획 실행Parallel Plan Execution

Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise 이상에서 하나의 ALTER TABLE ADD(인덱스 기반) CONSTRAINT 또는 DROP(클러스터형 인덱스) CONSTRAINT 문을 실행하는 데 사용되는 프로세서 수는 max degree of parallelism 구성 옵션 및 현재 작업에 따라 결정됩니다.In Microsoft SQL Server 2012 EnterpriseMicrosoft SQL Server 2012 Enterprise and higher, the number of processors employed to run a single ALTER TABLE ADD (index based) CONSTRAINT or DROP (clustered index) CONSTRAINT statement is determined by the max degree of parallelism configuration option and the current workload. 데이터베이스 엔진Database Engine이 시스템에서 진행 중인 작업이 많음을 감지하면 작업의 병렬 처리 수준은 문 실행 시작 전에 자동으로 감소됩니다.If the 데이터베이스 엔진Database Engine detects that the system is busy, the degree of parallelism of the operation is automatically reduced before statement execution starts. MAXDOP 옵션을 지정하여 문을 실행하는 데 사용되는 프로세서 수를 수동으로 구성할 수 있습니다.You can manually configure the number of processors that are used to run the statement by specifying the MAXDOP option. 자세한 내용은 max degree of parallelism 서버 구성 옵션 구성을 참조하세요.For more information, see Configure the max degree of parallelism Server Configuration Option.

분할된 테이블Partitioned Tables

ALTER TABLE을 사용하면 분할된 테이블과 관련된 SWITCH 작업을 수행할 수 있을 뿐만 아니라 분할된 테이블의 열, 제약 조건 및 트리거의 상태를 분할되지 않은 테이블에 사용되는 것처럼 변경할 수 있습니다.In addition to performing SWITCH operations that involve partitioned tables, ALTER TABLE can be used to change the state of the columns, constraints, and triggers of a partitioned table just like it is used for nonpartitioned tables. 그러나 이 문을 사용하여 테이블 자체가 분할되는 방식을 변경할 수는 없습니다.However, this statement cannot be used to change the way the table itself is partitioned. 분할된 테이블을 재분할하려면 ALTER PARTITION SCHEMEALTER PARTITION FUNCTION을 사용합니다.To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. 또한 분할된 테이블의 열 데이터 형식을 변경할 수 없습니다.Additionally, you cannot change the data type of a column of a partitioned table.

스키마 바운드 뷰가 있는 테이블의 제한 사항Restrictions on Tables with Schema-Bound Views

스키마 바운드 뷰가 있는 테이블에서 ALTER TABLE 문에 적용되는 제한은 단순 인덱스가 있는 테이블을 수정할 때 현재 적용되는 제한과 같습니다.The restrictions that apply to ALTER TABLE statements on tables with schema-bound views are the same as the restrictions currently applied when modifying tables with a simple index. 즉, 열을 추가할 수는 있지만Adding a column is allowed. 스키마 바운드 뷰에 포함된 열을 제거하거나 변경하는 것은 허용되지 않습니다.However, removing or changing a column that participates in any schema-bound view is not allowed. ALTER TABLE 문으로 스키마 바운드 뷰에 사용된 열을 변경해야 할 경우에는 ALTER TABLE이 실패하고 데이터베이스 엔진Database Engine에서 오류 메시지가 나타납니다.If the ALTER TABLE statement requires changing a column used in a schema-bound view, ALTER TABLE fails and the 데이터베이스 엔진Database Engine raises an error message. 스키마 바인딩 및 인덱싱된 뷰에 대한 자세한 내용은 CREATE VIEW(Transact-SQL)를 참조하세요.For more information about schema binding and indexed views, see CREATE VIEW (Transact-SQL).

기본 테이블을 참조하는 스키마 바운드 뷰를 만들어도 해당 테이블에서 트리거를 추가하거나 제거하는 데 영향을 주지 않습니다.Adding or removing triggers on base tables is not affected by creating a schema-bound view that references the tables.

인덱스 및 ALTER TABLEIndexes and ALTER TABLE

제약 조건의 일부로 만들어진 인덱스는 제약 조건을 삭제하면 같이 삭제됩니다.Indexes created as part of a constraint are dropped when the constraint is dropped. CREATE INDEX로 만든 인덱스는 DROP INDEX를 사용하여 삭제해야 합니다.Indexes that were created with CREATE INDEX must be dropped with DROP INDEX. ALTER INDEX 문을 사용하면 제약 조건 정의의 인덱스 부분을 다시 작성할 수 있습니다. 이때 ALTER TABLE을 사용하여 제약 조건을 다시 삭제하거나 추가할 필요가 없습니다.The ALTER INDEX statement can be used to rebuild an index part of a constraint definition; the constraint does not have to be dropped and added again with ALTER TABLE.

열을 제거하려면 먼저 해당 열을 기반으로 하는 인덱스와 제약 조건을 모두 제거해야 합니다.All indexes and constraints based on a column must be removed before the column can be removed.

클러스터형 인덱스를 만든 제약 조건이 삭제되면 클러스터형 인덱스의 리프 수준에 저장된 데이터 행이 비클러스터형 테이블에 저장됩니다.When a constraint that created a clustered index is deleted, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. 클러스터형 인덱스를 삭제하고 MOVE TO 옵션을 지정하여 결과 테이블을 단일 트랜잭션으로 다른 파일 그룹이나 파티션 구성표로 이동할 수 있습니다.You can drop the clustered index and move the resulting table to another filegroup or partition scheme in a single transaction by specifying the MOVE TO option. MOVE TO 옵션에는 다음과 같은 제한 사항이 있습니다.The MOVE TO option has the following restrictions:

  • 인덱싱된 뷰나 비클러스터형 인덱스에는 MOVE TO를 사용할 수 없습니다.MOVE TO is not valid for indexed views or nonclustered indexes.
  • 파티션 구성표 또는 파일 그룹이 이미 있어야 합니다.The partition scheme or filegroup must already exist.
  • MOVE TO를 지정하지 않으면 테이블이 클러스터형 인덱스에 대해 정의된 것과 같은 파티션 구성표 또는 파일 그룹에 있게 됩니다.If MOVE TO is not specified, the table will be located in the same partition scheme or filegroup as was defined for the clustered index.

클러스터형 인덱스를 삭제할 때 ONLINE = ON 옵션을 지정하여 DROP INDEX 트랜잭션이 기본 데이터 및 관련된 비클러스터형 인덱스에 대한 쿼리와 수정 사항을 차단하지 않도록 할 수 있습니다.When you drop a clustered index, you can specify ONLINE = ON option so the DROP INDEX transaction does not block queries and modifications to the underlying data and associated nonclustered indexes.

ONLINE = ON에는 다음과 같은 제한 사항이 있습니다.ONLINE = ON has the following restrictions:

  • ONLINE = ON은 비활성화된 클러스터형 인덱스에 사용할 수 없습니다.ONLINE = ON is not valid for clustered indexes that are also disabled. 비활성 인덱스는 ONLINE = OFF를 사용하여 삭제해야 합니다.Disabled indexes must be dropped by using ONLINE = OFF.
  • 한 번에 하나의 인덱스만 삭제할 수 있습니다.Only one index at a time can be dropped.
  • ONLINE = ON은 로컬 임시 테이블의 인덱싱된 뷰, 비클러스터형 인덱스에 사용할 수 없습니다.ONLINE = ON is not valid for indexed views, nonclustered indexes or indexes on local temp tables.
  • ONLINE = ON은 columnstore 인덱스에 대해 유효하지 않습니다.ONLINE = ON is not valid for columnstore indexes.

클러스터형 인덱스를 삭제하려면 기존 클러스터형 인덱스와 크기가 같은 임시 디스크 공간이 필요합니다.Temporary disk space equal to the size of the existing clustered index is required to drop a clustered index. 이 추가 공간은 작업이 완료되면 바로 해제됩니다.This additional space is released as soon as the operation is completed.

참고

<drop_clustered_constraint_option> 아래에 나열된 옵션은 테이블의 클러스터형 인덱스에 적용되며 뷰의 클러스터형 인덱스 또는 비클러스터형 인덱스에 적용할 수 없습니다.The options listed under <drop_clustered_constraint_option> apply to clustered indexes on tables and cannot be applied to clustered indexes on views or nonclustered indexes.

스키마 변경 내용 복제Replicating Schema Changes

기본적으로 SQL ServerSQL Server 게시자에 게시된 테이블에 대해 ALTER TABLE을 실행하면 모든 SQL ServerSQL Server 구독자에 변경 내용이 전파됩니다.By default, when you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, that change is propagated to all SQL ServerSQL Server Subscribers. 이 기능에는 몇 가지 제한이 있으며 해제할 수 있습니다.This functionality has some restrictions and can be disabled. 자세한 내용은 게시 데이터베이스의 스키마 변경을 참조하세요.For more information, see Make Schema Changes on Publication Databases.

Data CompressionData Compression

시스템 테이블에는 압축을 사용할 수 없습니다.System tables cannot be enabled for compression. 테이블이 힙인 경우 ONLINE 모드의 다시 작성 작업은 단일 스레드 작업이 됩니다.If the table is a heap, the rebuild operation for ONLINE mode will be single threaded. 다중 스레드 힙 다시 작성 작업에는 OFFLINE 모드를 사용하세요.Use OFFLINE mode for a multi-threaded heap rebuild operation. 데이터 압축에 대한 자세한 내용은 데이터 압축을 참조하세요.For a more information about data compression, seeData Compression.

압축 상태를 변경할 경우 테이블, 인덱스 또는 파티션에 어떤 영향을 주는지 확인하려면 sp_estimate_data_compression_savings 저장 프로시저를 사용합니다.To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

다음은 분할된 테이블에 적용되는 제한 사항입니다.The following restrictions apply to partitioned tables:

  • 테이블에 정렬되지 않은 인덱스가 있으면 단일 파티션의 압축 설정을 변경할 수 없습니다.You cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • ALTER TABLE <table> REBUILD PARTITION ... 구문은 지정된 파티션을 다시 작성합니다.The ALTER TABLE <table> REBUILD PARTITION ... syntax rebuilds the specified partition.
  • ALTER TABLE <table> REBUILD WITH ... 구문은 모든 파티션을 다시 작성합니다.The ALTER TABLE <table> REBUILD WITH ... syntax rebuilds all partitions.

NTEXT 열 삭제Dropping NTEXT Columns

NTEXT 열을 삭제할 때 삭제된 데이터의 정리는 모든 행에서 직렬화된 작업으로 발생합니다.When dropping NTEXT columns, the cleanup of the deleted data occurs as a serialized operation on all rows. 여기에는 상당한 시간이 필요할 수 있습니다.This can require a substantial time. 행이 많이 포함된 테이블에서 NTEXT 열을 삭제하는 경우 먼저 NTEXT 열을 NULL 값으로 업데이트한 다음 열을 삭제합니다.When dropping an NTEXT column in a table with a large number rows, update the NTEXT column to NULL value first, then drop the column. 이 작업은 병렬 작업으로 훨씬 빠르게 수행할 수 있습니다.This can be performed with parallel operations and can be much faster.

온라인 인덱스 다시 작성Online Index Rebuild

온라인 인덱스 다시 작성을 위해 DDL 문을 실행하려면 특정 테이블에서 실행 중인 모든 활성 차단 트랜잭션이 완료되어야 합니다.In order to execute the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. 온라인 인덱스 다시 작성이 실행되면 이 테이블에서 실행을 시작할 준비가 되어 있는 모든 새로운 트랜잭션이 차단됩니다.When the online index rebuild executes, it blocks all new transactions that are ready to start execution on this table. 온라인 인덱스 다시 작성에 대한 잠금 기간은 매우 짧지만 특정 테이블에서 열려 있는 모든 트랜잭션이 완료될 때까지 기다리고 새로운 트랜잭션이 시작되지 않도록 차단하기 위해서는 처리량에 상당한 영향을 주어 작업 속도가 느려지거나 시간 초과가 발생할 수 있으며, 기본 테이블에 대한 액세스가 크게 제한될 수 있습니다.Although the duration of the lock for online index rebuild is very short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput, causing a workload slow down or timeout, and significantly limit access to the underlying table. DBA는 WAIT_AT_LOW_PRIORITY 옵션을 사용해서 온라인 인덱스 다시 작성에 필요한 S-잠금 및 Sch-M 잠금을 관리할 수 있으며, 3개 옵션 중 하나를 선택할 수 있습니다.The WAIT_AT_LOW_PRIORITY option allows DBA's to manage the S-lock and Sch-M locks required for online index rebuilds and allows them to select one of 3 options. 세 가지 경우 모두, 대기 시간((MAX_DURATION =n [minutes])) 중에 차단 활동이 없으면 대기 없이 온라인 인덱스 다시 작성이 즉시 실행되고 DDL 문이 완료됩니다.In all 3 cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is executed immediately without waiting and the DDL statement is completed.

호환성 지원Compatibility Support

ALTER TABLE 문에는 두 부분(schema.object)으로 구성된 테이블 이름만 허용됩니다.The ALTER TABLE statement allows only two-part (schema.object) table names. SQL Server 2017SQL Server 2017에서는 다음 형식을 사용하여 테이블 이름을 지정하면 컴파일 시 오류 117이 발생합니다.In SQL Server 2017SQL Server 2017, specifying a table name using the following formats fails at compile time with error 117.

  • server.database.schema.tableserver.database.schema.table
  • .database.schema.table.database.schema.table
  • ..schema.table..schema.table

이전 버전에서는 server.database.schema.table 형식을 지정할 경우 오류 4902가 반환되었습니다.In earlier versions specifying the format server.database.schema.table returned error 4902. 그러나 .database.schema.table 또는 ..schema.table 형식을 지정하면 작업이 성공했습니다.Specifying the format .database.schema.table or the format ..schema.table succeeded.

이 문제를 해결하려면 네 부분으로 구성된 접두사를 사용하지 않아야 합니다.To resolve the problem, remove the use of a 4-part prefix.

PermissionsPermissions

테이블에 대한 ALTER 사용 권한이 필요합니다.Requires ALTER permission on the table.

ALTER TABLE 권한은 ALTER TABLE SWITCH 문과 관련된 두 테이블에 모두 적용됩니다.ALTER TABLE permissions apply to both tables involved in an ALTER TABLE SWITCH statement. 전환된 데이터는 모두 대상 테이블의 보안을 상속합니다.Any data that is switched inherits the security of the target table.

ALTER TABLE 문의 열을 CLR(공용 언어 런타임) 사용자 정의 형식 또는 별칭 데이터 형식으로 정의하면 해당 형식에 대한 REFERENCES 사용 권한이 필요합니다.If any columns in the ALTER TABLE statement are defined to be of a common language runtime (CLR) user-defined type or alias data type, REFERENCES permission on the type is required.

테이블의 행을 업데이트하는 열을 추가하려면 테이블에 대한 UPDATE 권한이 있어야 합니다.Adding a column that updates the rows of the table requires UPDATE permission on the table. 예를 들어 테이블이 비어 있지 않은 경우 NOT NULL 열을 기본값으로 추가하거나 ID 열을 추가합니다.For example, adding a NOT NULL column with a default value or adding an identity column when the table is not empty.

Examples

범주Category 중요한 구문 요소Featured syntax elements
열 및 제약 조건 추가Adding columns and constraints ADD • 인덱스 옵션이 있는 PRIMARY KEY • 스파스 열 및 열 집합 •ADD • PRIMARY KEY with index options • sparse columns and column sets •
열 및 제약 조건 삭제Dropping columns and constraints DROPDROP
열 정의 변경Altering a column definition 데이터 형식 변경 • 열 크기 변경 • 데이터 정렬change data type • change column size • collation
테이블 정의 변경Altering a table definition DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • 변경 내용 추적DATA_COMPRESSION • SWITCH PARTITION • LOCK ESCALATION • change tracking
제약 조건 및 트리거 해제/설정Disabling and enabling constraints and triggers CHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGERCHECK • NO CHECK • ENABLE TRIGGER • DISABLE TRIGGER

열 및 제약 조건 추가Adding Columns and Constraints

이 섹션의 예에서는 테이블에 열 및 제약 조건을 추가하는 방법을 보여 줍니다.Examples in this section demonstrate adding columns and constraints to a table.

1.A. 새 열 추가Adding a new column

다음 예에서는 Null 값을 허용하고 DEFAULT 정의를 통해 제공된 값이 없는 열을 추가합니다.The following example adds a column that allows null values and has no values provided through a DEFAULT definition. 새 열의 각 행 값은 NULL입니다.In the new column, each row will have NULL.

CREATE TABLE dbo.doc_exa (column_a INT) ;  
GO  
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;  
GO  

2.B. 제약 조건이 있는 열 추가Adding a column with a constraint

다음 예에서는 UNIQUE 제약 조건이 있는 새 열을 추가합니다.The following example adds a new column with a UNIQUE constraint.

CREATE TABLE dbo.doc_exc (column_a INT) ;  
GO  
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL   
    CONSTRAINT exb_unique UNIQUE ;  
GO  
EXEC sp_help doc_exc ;  
GO  
DROP TABLE dbo.doc_exc ;  
GO  

3.C. 기존 열에 확인되지 않은 CHECK 제약 조건 추가Adding an unverified CHECK constraint to an existing column

다음 예에서는 테이블의 기존 열에 제약 조건을 추가합니다.The following example adds a constraint to an existing column in the table. 이 열에 제약 조건을 위반하는 값이 있습니다.The column has a value that violates the constraint. 따라서 기존 행에서 제약 조건이 위반되지 않도록 하고 제약 조건을 추가할 수 있도록 WITH NOCHECK를 사용합니다.Therefore, WITH NOCHECK is used to prevent the constraint from being validated against existing rows, and to allow for the constraint to be added.

CREATE TABLE dbo.doc_exd ( column_a INT) ;  
GO  
INSERT INTO dbo.doc_exd VALUES (-1) ;  
GO  
ALTER TABLE dbo.doc_exd WITH NOCHECK   
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;  
GO  
EXEC sp_help doc_exd ;  
GO  
DROP TABLE dbo.doc_exd ;  
GO  

4.D. 기존 열에 DEFAULT 제약 조건 추가Adding a DEFAULT constraint to an existing column

다음 예에서는 두 개의 열이 있는 테이블을 만들어 첫 번째 열에 값을 삽입하고 다른 열은 NULL로 유지합니다.The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. 그런 다음 DEFAULT 제약 조건이 두 번째 열에 추가됩니다.A DEFAULT constraint is then added to the second column. 기본값이 적용되었는지 확인하기 위해 다른 값이 첫 번째 열에 삽입되고 테이블이 쿼리됩니다.To verify that the default is applied, another value is inserted into the first column, and the table is queried.

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;  
GO  
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;  
GO  
ALTER TABLE dbo.doc_exz  
ADD CONSTRAINT col_b_def  
DEFAULT 50 FOR column_b ;  
GO  
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;  
GO  
SELECT * FROM dbo.doc_exz ;  
GO  
DROP TABLE dbo.doc_exz ;  
GO  

5.E. 제약 조건이 있는 여러 열 추가Adding several columns with constraints

다음 예에서는 제약 조건이 정의된 여러 열을 새로 추가합니다.The following example adds several columns with constraints defined with the new column. 첫 번째 새 열은 IDENTITY 속성을 가집니다.The first new column has an IDENTITY property. 테이블에서 각 행의 ID 열에는 새 증분 값이 있습니다.Each row in the table has new incremental values in the identity column.

CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;  
GO  
ALTER TABLE dbo.doc_exe ADD   

-- Add a PRIMARY KEY identity column.  
column_b INT IDENTITY  
CONSTRAINT column_b_pk PRIMARY KEY,   

-- Add a column that references 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 telephone number format.  
column_d VARCHAR(16) NULL   
CONSTRAINT column_d_chk  
CHECK   
(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 dbo.doc_exe ;  
GO  

6.F. 기본값이 있는 Null 허용 열 추가Adding a nullable column with default values

다음 예에서는 DEFAULT 정의가 있는 Null 허용 열을 추가하고 WITH VALUES를 사용하여 테이블의 각 기존 행에 대한 값을 제공합니다.The following example adds a nullable column with a DEFAULT definition, and uses WITH VALUES to provide values for each existing row in the table. WITH VALUES를 사용하지 않으면 각 행에서 새 열의 값은 NULL이 됩니다.If WITH VALUES is not used, each row has the value NULL in the new column.

CREATE TABLE dbo.doc_exf ( column_a INT) ;  
GO  
INSERT INTO dbo.doc_exf VALUES (1) ;  
GO  
ALTER TABLE dbo.doc_exf   
ADD AddDate smalldatetime NULL  
CONSTRAINT AddDateDflt  
DEFAULT GETDATE() WITH VALUES ;  
GO  
DROP TABLE dbo.doc_exf ;  
GO  

7.G. 인덱스 옵션을 설정하여 PRIMARY KEY 제약 조건 만들기Creating a PRIMARY KEY constraint with index options

다음 예에서는 PRIMARY KEY 제약 조건 PK_TransactionHistoryArchive_TransactionID를 만들고 FILLFACTOR, ONLINEPAD_INDEX 옵션을 설정합니다.The following example creates the PRIMARY KEY constraint PK_TransactionHistoryArchive_TransactionID and sets the options FILLFACTOR, ONLINE, and PAD_INDEX. 결과 클러스터형 인덱스의 이름은 제약 조건 이름과 같습니다.The resulting clustered index will have the same name as the constraint.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

USE AdventureWorks2012;  
GO  
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK   
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)  
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);  
GO  

8.H. 스파스 열 추가Adding a sparse column

다음 예에서는 T1 테이블의 스파스 열 추가 및 수정을 보여 줍니다.The following examples show adding and modifying sparse columns in table T1. T1 테이블을 만들기 위한 코드는 다음과 같습니다.The code to create table T1 is as follows.

CREATE TABLE T1  
(C1 int PRIMARY KEY,  
C2 varchar(50) SPARSE NULL,  
C3 int SPARSE NULL,  
C4 int ) ;  
GO  

추가 스파스 열 C5를 추가하려면 다음 문을 실행합니다.To add an additional sparse column C5, execute the following statement.

ALTER TABLE T1  
ADD C5 char(100) SPARSE NULL ;  
GO  

스파스가 아닌 열 C4를 스파스 열로 변환하려면 다음 문을 실행합니다.To convert the C4 non-sparse column to a sparse column, execute the following statement.

ALTER TABLE T1  
ALTER COLUMN C4 ADD SPARSE ;  
GO  

C4스파스 열을 스파스가 아닌 열로 변환하려면 다음 명령문을 실행합니다.To convert the C4 sparse column to a nonsparse column, execute the following statement.

ALTER TABLE T1  
ALTER COLUMN C4 DROP SPARSE;  
GO  

9.I. 열 집합 추가Adding a column set

다음 예에서는 T2 테이블에 열을 추가하는 방법을 보여 줍니다.The following examples show adding a column to table T2. 스파스 열이 이미 포함되어 있는 테이블에는 열 집합을 추가할 수 없습니다.A column set cannot be added to a table that already contains sparse columns. T2 테이블을 만들기 위한 코드는 다음과 같습니다.The code to create table T2 is as follows.

CREATE TABLE T2  
(C1 int PRIMARY KEY,  
C2 varchar(50) NULL,  
C3 int NULL,  
C4 int ) ;  
GO  

다음 3개의 문은 CS라는 열 집합을 추가한 다음, C2C3 열을 SPARSE로 수정합니다.The following three statements add a column set named CS, and then modify columns C2 and C3 to SPARSE.

ALTER TABLE T2  
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;  
GO  

ALTER TABLE T2  
ALTER COLUMN C2 ADD SPARSE ;   
GO  

ALTER TABLE T2  
ALTER COLUMN C3 ADD SPARSE ;  
GO  

10.J. 암호화 열 추가Adding an encrypted column

다음 명령문은 PromotionCode라는 암호화 열을 추가합니다.The following statement adds an encrypted column named PromotionCode.

ALTER TABLE Customers ADD  
    PromotionCode nvarchar(100)   
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,  
    ENCRYPTION_TYPE = RANDOMIZED,  
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') ;  

열 및 제약 조건 삭제Dropping Columns and Constraints

이 섹션의 예에서는 열 및 제약 조건을 삭제하는 방법을 보여 줍니다.The examples in this section demonstrate dropping columns and constraints.

1.A. 열 삭제Dropping a column or columns

첫 번째 예에서는 테이블을 수정하여 열을 제거합니다.The first example modifies a table to remove a column. 두 번째 예에서는 여러 열을 제거합니다.The second example removes multiple columns.

CREATE TABLE dbo.doc_exb   
    (column_a INT  
     ,column_b VARCHAR(20) NULL  
     ,column_c datetime  
     ,column_d int) ;  
GO  
-- Remove a single column.  
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;  
GO  
-- Remove multiple columns.  
ALTER TABLE dbo.doc_exb DROP COLUMN column_c, column_d;  

2.B. 제약 조건 및 열 삭제Dropping constraints and columns

첫 번째 예에서는 테이블에서 UNIQUE 제약 조건을 제거합니다.The first example removes a UNIQUE constraint from a table. 두 번째 예에서는 제약 조건 두 개와 열 하나를 제거합니다.The second example removes two constraints and a single column.

CREATE TABLE dbo.doc_exc ( column_a int NOT NULL CONSTRAINT my_constraint UNIQUE) ;  
GO  

-- Example 1. Remove a single constraint.  
ALTER TABLE dbo.doc_exc DROP my_constraint ;  
GO  

DROP TABLE dbo.doc_exc;  
GO  

CREATE TABLE dbo.doc_exc ( column_a int    
                          NOT NULL CONSTRAINT my_constraint UNIQUE  
                          ,column_b int   
                          NOT NULL CONSTRAINT my_pk_constraint PRIMARY KEY) ;  
GO  

-- Example 2. Remove two constraints and one column  
-- The keyword CONSTRAINT is optional. The keyword COLUMN is required.  
ALTER TABLE dbo.doc_exc   

    DROP CONSTRAINT CONSTRAINT my_constraint, my_pk_constraint, COLUMN column_b ;  
GO  

3.C. ONLINE 모드에서 PRIMARY KEY 제약 조건 삭제Dropping a PRIMARY KEY constraint in the ONLINE mode

다음 예에서는 ONLINE 옵션이 ON으로 설정된 PRIMARY KEY 제약 조건을 삭제합니다.The following example deletes a PRIMARY KEY constraint with the ONLINE option set to ON.

ALTER TABLE Production.TransactionHistoryArchive  
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID  
WITH (ONLINE = ON);  
GO  

4.D. FOREIGN KEY 제약 조건 추가 및 삭제Adding and dropping a FOREIGN KEY constraint

다음 예에서는 ContactBackup 테이블을 만든 다음 FOREIGN KEY 테이블을 참조하는 Person.Person 제약 조건을 추가했다가 다시 FOREIGN KEY 제약 조건을 삭제하여 테이블을 변경합니다.The following example creates the table ContactBackup, and then alters the table, first by adding a FOREIGN KEY constraint that references the table Person.Person, then by dropping the FOREIGN KEY constraint.

CREATE TABLE Person.ContactBackup  
    (ContactID int) ;  
GO  

ALTER TABLE Person.ContactBackup  
ADD CONSTRAINT FK_ContactBackup_Contact FOREIGN KEY (ContactID)  
    REFERENCES Person.Person (BusinessEntityID) ;  
GO  

ALTER TABLE Person.ContactBackup  
DROP CONSTRAINT FK_ContactBackup_Contact ;  
GO  

DROP TABLE Person.ContactBackup ;  

맨 위 링크와 함께 사용되는 화살표 아이콘 Arrow icon used with Back to Top link Examples

열 정의 변경Altering a Column Definition

1.A. 열의 데이터 형식 변경Changing the data type of a column

다음 예에서는 테이블의 열을 INT에서 DECIMAL로 변경합니다.The following example changes a column of a table from INT to DECIMAL.

CREATE TABLE dbo.doc_exy (column_a INT ) ;  
GO  
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;  
GO  
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;  
GO  
DROP TABLE dbo.doc_exy ;  
GO  

2.B. 열 크기 변경Changing the size of a column

다음 예에서는 varchar 열의 크기와 decimal 열의 전체 자릿수 및 소수 자릿수를 늘립니다.The following example increases the size of a varchar column and the precision and scale of a decimal column. 열에 데이터가 포함되어 있으므로 열 크기는 늘리기만 가능합니다.Because the columns contain data, the column size can only be increased. 또한 col_a는 고유 인덱스에 정의됩니다.Also notice that col_a is defined in a unique index. 데이터 형식이 varchar이고 인덱스가 PRIMARY KEY 제약 조건의 결과가 아니므로 col_a의 크기를 늘릴 수 있습니다.The size of col_a can still be increased because the data type is a varchar and the index is not the result of a PRIMARY KEY constraint.

-- Create a two-column table with a unique index on the varchar column.  
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));  
GO  
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);  
GO  
-- Verify the current column size.  
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale  
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');  
GO  
-- Increase the size of the varchar column.  
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);  
GO  
-- Increase the scale and precision of the decimal column.  
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);  
GO  
-- Insert a new row.  
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;  
GO  
-- Verify the current column size.  
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale  
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');  

3.C. 열 데이터 정렬 변경Changing column collation

다음 예에서는 열의 데이터 정렬을 변경하는 방법을 보여 줍니다.The following example shows how to change the collation of a column. 먼저 기본 사용자 데이터 정렬을 사용하여 테이블을 만듭니다.Frist, a table is created table with the default user collation.

CREATE TABLE T3  
(C1 int PRIMARY KEY,  
C2 varchar(50) NULL,  
C3 int NULL,  
C4 int ) ;  
GO  

그런 다음 C2 열 데이터 정렬을 Latin1_General_BIN으로 변경합니다.Next, column C2 collation is changed to Latin1_General_BIN. 데이터 형식은 변경하지 않더라도 필요합니다.Note that the data type is required, even though it is not changed.

ALTER TABLE T3  
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN;  
GO  

테이블 정의 변경Altering a Table Definition

이 섹션의 예에서는 테이블 정의를 변경하는 방법을 보여 줍니다.The examples in this section demonstrate how to alter the definition of a table.

1.A. 테이블을 수정하여 압축 변경Modifying a table to change the compression

다음 예에서는 분할되지 않은 테이블의 압축을 변경합니다.The following example changes the compression of a nonpartitioned table. 힙 또는 클러스터형 인덱스는 다시 작성됩니다.The heap or clustered index will be rebuilt. 테이블이 힙인 경우에는 모든 비클러스터형 인덱스가 다시 작성됩니다.If the table is a heap, all nonclustered indexes will be rebuilt.

ALTER TABLE T1   
REBUILD WITH (DATA_COMPRESSION = PAGE);  

다음 예에서는 분할된 테이블의 압축을 변경합니다.The following example changes the compression of a partitioned table. REBUILD PARTITION = 1 구문은 파티션 번호 1만 다시 작성합니다.The REBUILD PARTITION = 1 syntax causes only partition number 1 to be rebuilt.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE PartitionTable1   
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  NONE) ;  
GO  

다음과 같은 대체 구문을 사용하여 같은 작업을 실행하면 테이블의 모든 파티션이 다시 작성됩니다.The same operation using the following alternate syntax causes all partitions in the table to be rebuilt.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE PartitionTable1   
REBUILD PARTITION = ALL   
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1) ) ;  

데이터 압축 예제를 더 보려면 데이터 압축을 참조하세요.For additional data compression examples, see Data Compression.

2.B. columnstore 테이블을 수정하여 보관 압축 변경Modifying a columnstore table to change archival compression

다음 예에서는 추가 압축 알고리즘을 적용하여 columnstore 테이블 파티션을 보다 더 압축합니다.The following example further compresses a columnstore table partition by applying an additional compression algorithm. 그러면 테이블 크기는 보다 작아지지만 저장 및 검색에 필요한 시간은 증가합니다.This reduces the table to a smaller size, but also increases the time required for storage and retrieval. 보관하거나 보다 적은 저장소가 필요한 기타 상황에서 사용할 수 있으며 저장 및 검색에 더 많은 시간을 이용할 수 있습니다.This is useful for archiving or for situations that require less space and can afford more time for storage and retrieval.

적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE PartitionTable1   
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  COLUMNSTORE_ARCHIVE) ;  
GO  

다음 예에서는 COLUMNSTORE_ARCHIVE 옵션으로 압축된 columnstore 테이블 파티션을 압축 해제합니다.The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. 데이터는 복구될 때 모든 columnstore 테이블에 사용된 columnstore 압축으로 계속 압축됩니다.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore tables.

적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE PartitionTable1   
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  COLUMNSTORE) ;  
GO  

3.C. 테이블 간 파티션 전환Switching partitions between tables

다음 예에서는 분할된 테이블을 만들고 파티션 구성표 myRangePS1을 데이터베이스에 이미 만들었다고 가정합니다.The following example creates a partitioned table, assuming that partition scheme myRangePS1 is already created in the database. 그런 다음 분할되지 않은 테이블이 분할된 테이블과 같은 구조로 PARTITION 2 테이블의 PartitionTable와 같은 파일 그룹에 만들어집니다.Next, a non-partitioned table is created with the same structure as the partitioned table and on the same filegroup as PARTITION 2 of table PartitionTable. 그러면 PARTITION 2 테이블의 PartitionTable 데이터가 NonPartitionTable 테이블로 전환됩니다.The data of PARTITION 2 of table PartitionTable is then switched into table NonPartitionTable.

CREATE TABLE PartitionTable (col1 int, col2 char(10))  
ON myRangePS1 (col1) ;  
GO  
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))  
ON test2fg ;  
GO  
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;  
GO  

4.D. 분할된 테이블의 잠금 에스컬레이션 허용Allowing lock escalation on partitioned tables

다음 예에서는 분할된 테이블의 파티션 수준에 대한 잠금 에스컬레이션을 활성화합니다.The following example enables lock escalation to the partition level on a partitioned table. 테이블이 분할되지 않은 경우 잠금 에스컬레이션은 TABLE 수준에서 설정됩니다.If the table is not partitioned, lock escalation is set at the TABLE level.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);  
GO  

5.E. 테이블에 변경 내용 추적 구성Configuring change tracking on a table

다음 예에서는 Person.Person 테이블에 대해 변경 내용 추적을 사용하도록 설정합니다.The following example enables change tracking on the Person.Person table.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

USE AdventureWorks2012;  
ALTER TABLE Person.Person  
ENABLE CHANGE_TRACKING;  

다음 예에서는 변경 내용 추적을 활성화하고 변경 중에 업데이트되는 열을 추적하도록 설정합니다.The following example enables change tracking and enables the tracking of the columns that are updated during a change.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE AdventureWorks2012;  
GO  
ALTER TABLE Person.Person  
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON)  

다음 예에서는 Person.Person 테이블에 대해 변경 내용 추적을 사용하지 않도록 설정합니다.The following example disables change tracking on the Person.Person table.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

USE AdventureWorks2012;  
Go  
ALTER TABLE Person.Person  
DISABLE CHANGE_TRACKING;  

제약 조건 및 트리거 해제/설정Disabling and Enabling Constraints and Triggers

1.A. 제약 조건 해제 및 다시 설정Disabling and re-enabling a constraint

다음 예에서는 데이터에 허용되는 급여를 제한하는 제약 조건을 비활성화합니다.The following example disables a constraint that limits the salaries accepted in the data. NOCHECK CONSTRAINTALTER TABLE를 사용하면 제약 조건이 비활성화되어 일반적으로 해당 제약 조건을 위반하는 삽입을 허용합니다.NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and allow for an insert that would typically violate the constraint. CHECK CONSTRAINT는 제약 조건을 재설정합니다.CHECK CONSTRAINT re-enables the constraint.

CREATE TABLE dbo.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 dbo.cnst_example VALUES (1,'Joe Brown',65000);  
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);  

-- This insert violates the constraint.  
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);  

-- Disable the constraint and try again.  
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;  
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);  

-- Re-enable the constraint and try another insert; this will fail.  
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;  
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;  

2.B. 트리거 해제 및 다시 설정Disabling and re-enabling a trigger

다음 예에서는 DISABLE TRIGGERALTER TABLE 옵션을 사용하여 트리거를 해제하고 일반적으로 트리거를 위반하는 삽입을 허용합니다.The following example uses the DISABLE TRIGGER option of ALTER TABLE to disable the trigger and allow for an insert that would typically violate the trigger. 그런 다음 ENABLE TRIGGER를 사용하여 트리거를 재설정합니다.ENABLE TRIGGER is then used to re-enable the trigger.

CREATE TABLE dbo.trig_example   
(id INT,   
name VARCHAR(12),  
salary MONEY) ;  
GO  
-- Create the trigger.  
CREATE TRIGGER dbo.trig1 ON dbo.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  
-- Try an insert that violates the trigger.  
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;  
GO  
-- Disable the trigger.  
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;  
GO  
-- Try an insert that would typically violate the trigger.  
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;  
GO  
-- Re-enable the trigger.  
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;  
GO  
-- Try an insert that violates the trigger.  
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;  
GO  

온라인 작업Online Operations

1.A. 낮은 우선 순위 대기 옵션을 사용한 온라인 인덱스 다시 작성Online index rebuild using low priority wait options

다음 예에서는 낮은 우선 순위 대기 옵션을 지정하여 온라인 인덱스 다시 작성을 수행하는 방법을 보여 줍니다.The following example shows how to perform an online index rebuild specifying the low priority wait options.

적용 대상: SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2014(12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

ALTER TABLE T1   
REBUILD WITH   
(  
    PAD_INDEX = ON,  
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, 
                                         ABORT_AFTER_WAIT = BLOCKERS ) )  
)  
;  

2.B. 온라인 열 변경Online Alter Column

다음 예에서는 ONLINE 옵션을 사용하여 열 변경 작업을 수행하는 방법을 보여 줍니다.The following example shows how to perform an alter column operation with the ONLINE option.

적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

CREATE TABLE dbo.doc_exy (column_a INT ) ;  
GO  
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;  
GO  
ALTER TABLE dbo.doc_exy   
    ALTER COLUMN column_a DECIMAL (5, 2) WITH (ONLINE = ON);  
GO  
sp_help doc_exy;  
DROP TABLE dbo.doc_exy ;  
GO  

행 버전 관리System Versioning

다음 4개 예에서 시스템 버전 관리를 이용한 구문에 대해 잘 알아 볼 수 있습니다.The following four examples will help you become familiar with the syntax for using system versioning. 추가 지원을 받으려면 시스템 버전 관리 Temporal 테이블 시작을 참조하세요.For additional assistance, see Getting Started with System-Versioned Temporal Tables.

적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

1.A. 기존 테이블에 시스템 버전 관리 추가Add System Versioning to Existing Tables

다음 예는 기존 테이블에 시스템 버전 관리를 추가하고 나중에 기록 테이블을 만드는 방법을 보여줍니다.The following example shows how to add system versioning to an existing table and create a future history table. 이 예에서는 InsurancePolicy라는 기본 키가 정의된 기존 테이블이 있는 경우를 가정합니다.This example assumes that there is an existing table called InsurancePolicy with a primary key defined. 시작 및 끝 시간 값은 null이 될 수 없으므로 이 예는 시작 및 끝 시간의 기본값을 사용하여 시스템 버전 관리에 대해 새로 생성된 기간 열을 채웁니다.This example populates the newly created period columns for system versioning using default values for the start and end times because these values cannot be null. 이 예는 현재 테이블과 상호 작용하는 기존 응용 프로그램에 영향을 미치지 않도록 HIDDEN 절을 사용합니다.This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. 또한 SQL DatabaseSQL Database에서만 사용할 수 있는 HISTORY_RETENTION_PERIOD를 사용합니다.It also uses HISTORY_RETENTION_PERIOD that is available on SQL DatabaseSQL Database only.

--Alter non-temporal table to define periods for system versioning  
ALTER TABLE InsurancePolicy  
ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime),   
SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL 
    DEFAULT GETUTCDATE(),   
SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL 
    DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999');  
--Enable system versioning with 1 year retention for historical data
ALTER TABLE InsurancePolicy 
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 1 YEAR));  

2.B. 시스템 버전 관리를 사용하기 위해 기존 솔루션 마이그레이션Migrate An Existing Solution to Use System Versioning

다음 예는 temporal 지원을 모방하기 위해 트리거를 사용하는 솔루션에서 시스템 버전 관리로 마이그레이션하는 방법을 보여줍니다.The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. 이 예는 ProjectTaskCurrent 테이블 및 ProjectTaskHistory 테이블을 사용하는 기존 솔루션이 있고, 이 솔루션이 기간에 대해 변경된 날짜 및 수정된 날짜 열을 사용하며, 이러한 기간 열은 datetime2 데이터 형식을 사용하지 않고 ProjectTaskCurrent 테이블에 기본 키가 정의된 경우를 가정합니다.The example assumes there is an existing solution that uses a ProjectTaskCurrent table and a ProjectTaskHistory table for its existing solution, that is uses the Changed Date and Revised Date columns for its periods, that these period columns do not use the datetime2 datatype and that the ProjectTaskCurrent table has a primary key defined.

-- Drop existing trigger  
DROP TRIGGER ProjectTaskCurrent_Trigger;  
-- Adjust the schema for current and history table  
-- Change data types for existing period columns  
ALTER TABLE ProjectTaskCurrent ALTER COLUMN [Changed Date] datetime2 NOT NULL;  
ALTER TABLE ProjectTaskCurrent ALTER COLUMN [Revised Date] datetime2 NOT NULL;  

ALTER TABLE ProjectTaskHistory ALTER COLUMN [Changed Date] datetime2 NOT NULL;  
ALTER TABLE ProjectTaskHistory ALTER COLUMN [Revised Date] datetime2 NOT NULL;  

-- Add SYSTEM_TIME period and set system versioning with linking two existing tables  
-- (a certain set of data checks happen in the background)  
ALTER TABLE ProjectTaskCurrent  
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])  

ALTER TABLE ProjectTaskCurrent  
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProjectTaskHistory, DATA_CONSISTENCY_CHECK = ON))  

3.C. 테이블 스키마를 변경하기 위해 시스템 버전 관리 해제/재활성화Disabling and Re-Enabling System Versioning to Change Table Schema

이 예는 Department 테이블에 시스템 버전 관리를 비활성화고 열을 추가하며 시스템 버전 관리를 재활성화하는 방법을 보여줍니다.This example shows how to disable system versioning on the Department table, add a column, and re-enable system versioning. 테이블 스키마를 수정하려면 시스템 버전 관리를 비활성화해야 합니다.Disabling system versioning is required in order to modify the table schema. 테이블 스키마를 업데이트하는 동안 두 테이블이 업데이트되지 않도록 트랜잭션 안에서 다음 단계를 수행하면 시스템 버전 관리를 재활성화할 때 데이터 일관성 확인을 건너뛰고 성능 이점을 얻는 DBA가 활성화됩니다.Perform these steps within a transaction to prevent updates to both tables while updating the table schema, which enables the DBA to skip the data consistency check when re-enabling system versioning and gain a performance benefit. 통계 생성, 파티션 전환, 하나 또는 두 테이블에 대한 압축 적용 등의 작업을 수행할 때 시스템 버전 관리를 비활성화하지 않아도 됩니다.Note that tasks such as creating statistics, switching partitions or applying compression to one or both tables does not require disabling system versioning.

BEGIN TRAN  
/* Takes schema lock on both tables */  
ALTER TABLE Department  
    SET (SYSTEM_VERSIONING = OFF);  
/* expand table schema for temporal table */  
ALTER TABLE Department  
     ADD Col5 int NOT NULL DEFAULT 0;  
/* Expand table schema for history table */  
ALTER TABLE DepartmentHistory  
    ADD Col5 int NOT NULL DEFAULT 0;  
/* Re-establish versioning again  */
ALTER TABLE Department  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.DepartmentHistory, 
                                 DATA_CONSISTENCY_CHECK = OFF));  
COMMIT   

4.D. 시스템 버전 관리 제거Removing System Versioning

이 예는 Department 테이블에서 시스템 버전 관리를 완전히 제거하고 DepartmentHistory 테이블을 삭제하는 방법을 보여줍니다.This example shows how to completely remove system versioning from the Department table and drop the DepartmentHistory table. 또는 시스템에서 사용하는 기간 열을 삭제하여 시스템 버전 관리 정보를 기록할 수 있습니다.Optionally, you might also want to drop the period columns used by the system to record system versioning information. 시스템 버전 관리가 활성화된 동안에는 Department 또는 DepartmentHistory 테이블을 삭제할 수 없습니다.Note that you cannot drop either the Department or the DepartmentHistory tables while system versioning is enabled.

ALTER TABLE Department  
    SET (SYSTEM_VERSIONING = OFF);  
ALTER TABLE Department  
DROP PEROD FOR SYSTEM_TIME;  
DROP TABLE DepartmentHistory;  

예제: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data WarehouseExamples: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

다음의 예 A ~ C는 AdventureWorksPDW2012AdventureWorksPDW2012 데이터베이스의 FactResellerSales 테이블을 사용합니다.The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

1.A. 테이블이 분할되었는지 여부 확인Determining if a table is partitioned

다음 쿼리는 FactResellerSales 테이블이 분할된 경우 하나 이상의 행을 반환합니다.The following query returns one or more rows if the table FactResellerSales is partitioned. 테이블이 분할되지 않은 경우 행이 반환되지 않습니다.If the table is not partitioned, no rows are returned.

SELECT * FROM sys.partitions AS p  
JOIN sys.tables AS t  
    ON  p.object_id = t.object_id  
WHERE p.partition_id IS NOT NULL  
    AND t.name = 'FactResellerSales';  

2.B. 분할된 테이블에 대한 경계 값 확인Determining boundary values for a partitioned table

다음 쿼리는 FactResellerSales 테이블의 각 파티션에 대해 경계 값을 반환합니다.The following query returns the boundary values for each partition in the FactResellerSales table.

SELECT t.name AS TableName, i.name AS IndexName, p.partition_number, 
    p.partition_id, i.data_space_id, f.function_id, f.type_desc, 
    r.boundary_id, r.value AS BoundaryValue   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE t.name = 'FactResellerSales' AND i.type <= 1  
ORDER BY p.partition_number;  

3.C. 분할된 테이블의 파티션 열 확인Determining the partition column for a partitioned table

다음 쿼리는 테이블에 대한 분할 열의 이름을 반환합니다.The following query returns the name of the partitioning column for table. FactResellerSales을 참조하세요.FactResellerSales.

SELECT t.object_id AS Object_ID, t.name AS TableName, 
    ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.columns AS c  
    ON t.object_id = c.object_id  
JOIN sys.partition_schemes AS ps  
    ON ps.data_space_id = i.data_space_id  
JOIN sys.index_columns AS ic  
    ON ic.object_id = i.object_id 
    AND ic.index_id = i.index_id AND ic.partition_ordinal > 0  
WHERE t.name = 'FactResellerSales'  
AND i.type <= 1  
AND c.column_id = ic.column_id;  

4.D. 두 파티션 병합Merging two partitions

다음 예는 테이블에서 두 파티션을 병합합니다.The following example merges two partitions on a table.

Customer 테이블에는 다음 정의가 있습니다.The Customer table has the following definition:

CREATE TABLE Customer (  
    id int NOT NULL,  
    lastName varchar(20),  
    orderCount int,  
    orderDate date)  
WITH   
    ( DISTRIBUTION = HASH(id),  
    PARTITION ( orderCount RANGE LEFT  
    FOR VALUES (1, 5, 10, 25, 50, 100)));  

다음 명령은 10 및 25개의 파티션 경계를 결합합니다.The following command combines the 10 and 25 partition boundaries.

ALTER TABLE Customer MERGE RANGE (10);  

테이블의 새 DDL은 다음과 같습니다.The new DDL for the table is:

CREATE TABLE Customer (  
    id int NOT NULL,  
    lastName varchar(20),  
    orderCount int,  
    orderDate date)  
WITH   
    ( DISTRIBUTION = HASH(id),  
    PARTITION ( orderCount RANGE LEFT  
    FOR VALUES (1, 5, 25, 50, 100)));  

5.E. 파티션 분할Splitting a partition

다음 예는 테이블의 파티션을 분할합니다.The following example splits a partition on a table.

Customer 테이블에는 다음과 같은 DDL이 있습니다.The Customer table has the following DDL:

DROP TABLE Customer;  

CREATE TABLE Customer (  
    id int NOT NULL,  
    lastName varchar(20),  
    orderCount int,  
    orderDate date)  
WITH   
    ( DISTRIBUTION = HASH(id),  
    PARTITION ( orderCount RANGE LEFT  
    FOR VALUES (1, 5, 10, 25, 50, 100 )));  

다음 명령은 50과 100 사이의 값 75로 새 파티션 경계를 만듭니다.The following command creates a new partition bound by the value 75, between 50 and 100.

ALTER TABLE Customer SPLIT RANGE (75);  

테이블의 새 DDL은 다음과 같습니다.The new DDL for the table is:

CREATE TABLE Customer (  
   id int NOT NULL,  
   lastName varchar(20),  
   orderCount int,  
   orderDate date)  
   WITH DISTRIBUTION = HASH(id),  
   PARTITION ( orderCount (RANGE LEFT  
      FOR VALUES (1, 5, 10, 25, 50, 75, 100 )));  

6.F. SWITCH를 사용하여 파티션을 기록 테이블로 이동Using SWITCH to move a partition to a history table

다음 예는 Orders 테이블의 파티션에 있는 데이터를 OrdersHistory 테이블의 파티션으로 이동합니다.The following example moves the data in a partition of the Orders table to a partition in the OrdersHistory table.

Orders 테이블에는 다음과 같은 DDL이 있습니다.The Orders table has the following DDL:

CREATE TABLE Orders (  
    id INT,  
    city VARCHAR (25),  
    lastUpdateDate DATE,  
    orderDate DATE )  
WITH   
    (DISTRIBUTION = HASH ( id ),  
    PARTITION ( orderDate RANGE RIGHT   
    FOR VALUES ('2004-01-01', '2005-01-01', '2006-01-01', '2007-01-01' )));  

이 예에서는 Orders 테이블에 다음과 같은 파티션이 있습니다.In this example, the Orders table has the following partitions. 각 파티션에는 데이터가 포함되어 있습니다.Each partition contains data.

PartitionPartition 데이터 유무Has data? 경계 범위Boundary range
@shouldalert1 사용자 계정 컨트롤Yes OrderDate < '2004-01-01'OrderDate < '2004-01-01'
22 사용자 계정 컨트롤Yes '2004-01-01' <= OrderDate < '2005-01-01''2004-01-01' <= OrderDate < '2005-01-01'
33 사용자 계정 컨트롤Yes '2005-01-01' <= OrderDate< '2006-01-01''2005-01-01' <= OrderDate< '2006-01-01'
44 사용자 계정 컨트롤Yes '2006-01-01'<= OrderDate < '2007-01-01''2006-01-01'<= OrderDate < '2007-01-01'
55 사용자 계정 컨트롤Yes '2007-01-01' <= OrderDate'2007-01-01' <= OrderDate
  • 파티션 1 (데이터 있음): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • 파티션 2 (데이터 있음): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • 파티션 3 (데이터 있음): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • 파티션 4 (데이터 있음): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • 파티션 5 (데이터 있음): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

OrdersHistory 테이블에 Orders 테이블과 열 및 열 이름이 동일한 다음과 같은 DDL이 있습니다.The OrdersHistory table has the following DDL, which has identical columns and column names as the Orders table. 두 테이블 모두 id 열에서 해시 분산되어 있습니다.Both are hash-distributed on the id column.

CREATE TABLE OrdersHistory (  
   id INT,  
   city VARCHAR (25),  
   lastUpdateDate DATE,  
   orderDate DATE )  
WITH   
    (DISTRIBUTION = HASH ( id ),  
    PARTITION ( orderDate RANGE RIGHT   
    FOR VALUES ( '2004-01-01' )));  

열과 열 이름이 동일해야 하지만 파티션 경계는 동일하지 않아도 됩니다.Although the columns and column names must be the same, the partition boundaries do not need to be the same. 이 예에서 OrdersHistory 테이블에는 다음과 같은 두 파티션이 있고 두 파티션 모두 비어 있습니다.In this example, the OrdersHistory table has the following two partitions and both partitions are empty:

  • 파티션 1 (데이터 없음): OrderDate < '2004-01-01'Partition 1 (no data): OrderDate < '2004-01-01'
  • 파티션 2 (비어 있음): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

이전 두 테이블의 경우 다음 명령은 OrderDate < '2004-01-01'인 모든 행을 Orders 테이블에서 OrdersHistory 테이블로 이동합니다.For the previous two tables, the following command moves all rows with OrderDate < '2004-01-01' from the Orders table to the OrdersHistory table.

ALTER TABLE Orders SWITCH PARTITION 1 TO OrdersHistory PARTITION 1;  

그 결과 Orders의 첫 번째 파티션은 비어 있고 OrdersHistory의 첫 번째 파티션에는 데이터가 있습니다.As a result, the first partition in Orders is empty and the first partition in OrdersHistory contains data. 이제 테이블이 다음과 같이 나타납니다.The tables now appear as follows:

Orders 테이블Orders table

  • 파티션 1 (비어 있음): OrderDate < '2004-01-01'Partition 1 (empty): OrderDate < '2004-01-01'
  • 파티션 2 (데이터 있음): '2004-01-01' <= OrderDate < '2005-01-01'Partition 2 (has data): '2004-01-01' <= OrderDate < '2005-01-01'
  • 파티션 3 (데이터 있음): '2005-01-01' <= OrderDate< '2006-01-01'Partition 3 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • 파티션 4 (데이터 있음): '2006-01-01'<= OrderDate < '2007-01-01'Partition 4 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • 파티션 5 (데이터 있음): '2007-01-01' <= OrderDatePartition 5 (has data): '2007-01-01' <= OrderDate

    OrdersHistory 테이블OrdersHistory table

  • 파티션 1 (데이터 있음): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'

  • 파티션 2 (비어 있음): '2004-01-01' <= OrderDatePartition 2 (empty): '2004-01-01' <= OrderDate

Orders 테이블을 지우려면 파티션 1과 2를 다음과 같이 병합해 빈 파티션을 제거합니다.To clean up the Orders table, you can remove the empty partition by merging partitions 1 and 2 as follows:

ALTER TABLE Orders MERGE RANGE ('2004-01-01');  

병합 후에는 Orders 테이블에 다음과 같은 파티션이 포함됩니다.After the merge, the Orders table has the following partitions:

Orders 테이블Orders table

  • 파티션 1 (데이터 있음): OrderDate < '2005-01-01'Partition 1 (has data): OrderDate < '2005-01-01'
  • 파티션 2 (데이터 있음): '2005-01-01' <= OrderDate< '2006-01-01'Partition 2 (has data): '2005-01-01' <= OrderDate< '2006-01-01'
  • 파티션 3 (데이터 있음): '2006-01-01'<= OrderDate < '2007-01-01'Partition 3 (has data): '2006-01-01'<= OrderDate < '2007-01-01'
  • 파티션 4 (데이터 있음): '2007-01-01' <= OrderDatePartition 4 (has data): '2007-01-01' <= OrderDate

또 한 해가 지나고 2005년도를 보관할 준비가 된 경우를 가정하겠습니다.Suppose another year passes and you are ready to archive the year 2005. 다음과 같이 빈 파티션을 분할하여 OrdersHistory 테이블에서 2005년도에 대한 빈 파티션을 할당할 수 있습니다.You can allocate an empty partition for the year 2005 in the OrdersHistory table by splitting the empty partition as follows:

ALTER TABLE OrdersHistory SPLIT RANGE ('2005-01-01');  

분할 후에는 OrdersHistory 테이블에 다음과 같은 파티션이 포함됩니다.After the split, the OrdersHistory table has the following partitions:

OrdersHistory 테이블OrdersHistory table

  • 파티션 1 (데이터 있음): OrderDate < '2004-01-01'Partition 1 (has data): OrderDate < '2004-01-01'
  • 파티션 2 (비어 있음): '2004-01-01' < '2005-01-01'Partition 2 (empty): '2004-01-01' < '2005-01-01'
  • 파티션 3 (비어 있음): '2005-01-01' <= OrderDatePartition 3 (empty): '2005-01-01' <= OrderDate

참고 항목See Also

sys.tables(Transact-SQL) sys.tables (Transact-SQL)
sp_rename(Transact-SQL) sp_rename (Transact-SQL)
CREATE TABLE(Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TABLE(Transact-SQL) DROP TABLE (Transact-SQL)
sp_help(Transact-SQL) sp_help (Transact-SQL)
ALTER PARTITION SCHEME(Transact-SQL) ALTER PARTITION SCHEME (Transact-SQL)
ALTER PARTITION FUNCTION(Transact-SQL) ALTER PARTITION FUNCTION (Transact-SQL)
EVENTDATA(Transact-SQL)EVENTDATA (Transact-SQL)