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

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

列と制約を変更、追加、または削除して、テーブルの定義を変更します。Modifies a table definition by altering, adding, or dropping columns and constraints. また、ALTER TABLE では、パーティションを再割り当ておよび再構築したり、制約とトリガーを無効化および有効化したりもします。ALTER TABLE also reassigns and rebuilds partitions, or disables and enables constraints and triggers.

構文表記規則の詳細については、「Transact-SQL 構文表記規則」を参照してください。For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

重要

ALTER TABLE の構文は、ディスク ベース テーブルとメモリ最適化テーブルで異なります。The syntax for ALTER TABLE is different for disk-based tables and memory-optimized tables. 次のリンクから、テーブル型の適切な構文ブロックと、適切な構文の例に直接移動することができます。Use the following links to take you directly to the appropriate syntax block for your table types and to the appropriate syntax examples:

ディスク ベース テーブルの構文Syntax for disk-based tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_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 } )
}

メモリ最適化テーブルの構文Syntax for memory-optimized tables

ALTER TABLE { database_name.schema_name.table_name | schema_name.table_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 Analytics Platform System

ALTER TABLE { database_name.schema_name.source_table_name | schema_name.source_table_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 = 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
テーブルが作成されたデータベースの名前です。The name of the database in which the table was created.

schema_nameschema_name
テーブルが属しているスキーマの名前です。The name of the schema to which the table belongs.

table_nametable_name
変更するテーブルの名前です。The name of the table to be altered. テーブルが現在のデータベースにないか、現在のユーザーが所有するスキーマに含まれていない場合は、データベースとスキーマを明示的に指定する必要があります。If the table isn't in the current database or contained by the schema owned by the current user, you must explicitly specify the database and schema.

ALTER COLUMNALTER COLUMN
名前指定された列に変更を加えるように指定します。Specifies that the named column is to be changed or altered.

変更された列を次にすることはできません。The modified column can't be:

  • timestamp データ型の列。A column with a timestamp data type.

  • テーブルの ROWGUIDCOL。The ROWGUIDCOL for the table.

  • 計算列、または計算列の中で使用される列。A computed column or used in a computed column.

  • CREATE STATISTICS ステートメントで作成した統計内で使用する。Used in statistics generated by the CREATE STATISTICS statement. 列が varcharnvarchar、またはvarbinary データ型でない限り、データ型は変更されません。Unless the column is a varchar, nvarchar, or varbinary data type, the data type isn't changed. また、新しいサイズは古いサイズと同じか、それより大きくなります。And, the new size is equal to or greater than the old size. または、列が null 値以外から null 値に変更された場合です。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 制約の中で使用されている可変長列の長さを変更することはできます。But, changing the length of a variable-length column used in a CHECK or UNIQUE constraint is allowed.

  • 既定の定義に関連付けられている列。Associated with a default definition. ただし、データ型が変更されない場合は、列の長さ、有効桁数、または小数点以下桁数を変更できます。However, the length, precision, or scale of a column can be changed if the data type isn't changed.

textntextimage のデータ型の列は、次の方法でのみ変更できます。The data type of text, ntext, and image columns can be changed only in the following ways:

  • textvarchar(max)nvarchar(max) 、または xmltext to varchar(max), nvarchar(max), or xml
  • ntextvarchar(max)nvarchar(max) 、または xmlntext to varchar(max), nvarchar(max), or xml
  • imagevarbinary(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, might cause the conversion of extended characters. 詳しくは、「CAST および CONVERT」をご覧ください。For more information, see CAST and CONVERT. 列の有効桁数または小数点以下桁数を減らすと、データが切り捨てられる可能性があります。Reducing the precision or scale of a column can cause data truncation.

注意

パーティション テーブルの列のデータ型は変更できません。The data type of a column of a partitioned table can't be changed.

列が varcharnvarchar、または varbinary データ型で、かつ新しいサイズが前のサイズと同じかそれよりも小さい場合を除いて、インデックスに含まれている列のデータ型は変更できません。The data type of columns included in an index can't 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, can't be changed from NOT NULL to NULL.

(セキュア エンクレーブなしの) Always Encrypted を使用している場合、変更する列が 'ENCRYPTED WITH' を使用して暗号化されている場合は、データ型を互換性のあるデータ型に変更すること (INT から BIGINT など) はできますが、暗号化設定を変更することはできません。When using Always Encrypted (without secure enclaves), if the column being modified is encrypted with 'ENCRYPTED WITH', you can change the datatype to a compatible datatype (such as INT to BIGINT), but you can't change any encryption settings.

セキュア エンクレーブを使用する Always Encrypted を使用しているとき、列を保護する列暗号化キー (および、キーを変更している場合は新しい列暗号化キー) によってエンクレーブ計算がサポートされている (エンクレーブ対応の列マスター キーで暗号化される) 場合は、すべての暗号化設定を変更できます。When using Always Encrypted with secure enclaves, you can change any encryption setting, if the column encryption key protecting the column (and the new column encryption key, if you're changing the key) support enclave computations (encrypted with enclave-enabled column master keys). 詳細については、「Always Encrypted with secure enclaves」(セキュリティで保護されたエンクレーブが設定された Always Encrypted) を参照してください。For details, see Always Encrypted with secure enclaves.

column_namecolumn_name
変更、追加、または削除する列の名前です。The name of the column to be altered, added, or dropped. column_name の最大値は 128 文字です。The column_name maximum is 128 characters. 新しい列の場合、timestamp データ型を使って作成した列の column_name は省略できます。For new columns, you can omit column_name for columns created with a timestamp data type. timestamp データ型の列に column_name を指定していない場合は、timestamp という名前が使われます。The name timestamp is used if you don't specify column_name for a timestamp data type column.

[ type_schema_name .[ type_schema_name. ] type_name] type_name
変更する列の新しいデータ型、または追加する列のデータ型です。The new data type for the altered column, or the data type for the added column. パーティション テーブルの既存の列に type_name を指定することはできません。You can't specify type_name for existing columns of partitioned tables. type_name には次の型のいずれかを指定できます。type_name can be any one of the following types:

  • 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 ステートメントを使って別名データ型を作成した後、それらをテーブル定義で使用できます。You create alias data types 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. CREATE TYPE ステートメントを使ってユーザー定義型を作成した後、それらをテーブル定義で使用できます。You create user-defined types 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 can't be timestamp.
  • ANSI_NULL の既定値は ALTER COLUMN に対して常にオンです。指定しなかった場合、列では NULL 値が許容されます。ANSI_NULL defaults are always on for ALTER COLUMN; if not specified, the column is nullable.
  • ANSI_PADDING の埋め込みは、ALTER COLUMN に対して常に 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 isn't specified, changing the data type of a column causes a collation change to the default collation of the database.

有効桁数 (precision)precision
指定したデータ型の有効桁数です。The precision for the specified data type. 有効桁数の詳細については、「有効桁数、小数点以下桁数、および長さ (Transact-SQL)」を参照してください。For more information about valid precision values, see Precision, Scale, and Length.

scalescale
指定したデータ型の小数点以下桁数です。The scale for the specified data type. 有効な小数点以下桁数の詳細については、「有効桁数、小数点以下桁数、および長さ (Transact-SQL)」を参照してください。For more information about valid scale values, see Precision, Scale, and Length.

maxmax
データ型 varcharnvarcharvarbinary だけに適用され、2^31-1 バイトの文字データ、バイナリ データ、および Unicode データが格納されます。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 ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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, you first create the schema collection 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 照合順序名 」および「SQL Server 照合順序名」をご覧ください。For a list and more information, see Windows Collation Name and SQL Server Collation Name.

COLLATE 句で照合順序を変更できるのは、charvarcharncharnvarchar データ型の列のみです。The COLLATE clause changes 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, use separate ALTER TABLE statements to change the column to a SQL ServerSQL Server system data type. 次に、その照合順序を変更し、列を別名データ型に戻します。Then, change its collation and change the column back to an alias data type.

次の条件の 1 つ以上に該当する場合、ALTER COLUMN で照合順序を変更することはできません。ALTER COLUMN can't 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」をご覧ください。For more information, see COLLATE.

NULL | NOT NULLNULL | NOT NULL
列に null 値を使用できるかどうかを指定します。Specifies whether the column can accept null values. null 値が許容されない列は、既定値が指定されているか、テーブルが空の場合にのみ、ALTER TABLE で追加できます。Columns that don't allow null values are added with ALTER TABLE only if they have a default specified or if the table is empty. 計算列に対する NOT NULL は、PERSISTED も指定している場合にのみ指定できます。You can specify NOT NULL for computed columns only if you've also specified PERSISTED. 新しい列で null 値が許容され、既定値を指定しない場合、テーブル内の各行の新しい列に null 値が追加されます。If the new column allows null values and you don't specify a default, the new column contains a null value for each row in the table. 新しい列で null 値が許容され、新しい列と共に既定の定義を追加した場合は、WITH VALUES を使用して、テーブル内にある各行の新しい列に既定値を格納できます。If the new column allows null values and you add a default definition with the new column, you can use WITH VALUES to store the default value in the new column for each existing row in the table.

新しい列で null 値が許容されず、テーブルが空でない場合は、新しい列と共に DEFAULT 定義を追加する必要があります。If the new column doesn't allow null values and the table isn't empty, you have to add a DEFAULT definition with the new column. また、新しい列は、既存の各行の新しい列に既定値と共に自動で読み込まれます。And, the new column automatically loads with the default value in the new columns in each existing row.

ALTER COLUMN に NULL を指定して、強制的に NOT NULL 列が null 値を許容するようにできます。ただし、PRIMARY KEY 制約の列は除きます。You can specify NULL in ALTER COLUMN to force a NOT NULL column to allow null values, except for columns in PRIMARY KEY constraints. ALTER COLUMN に NOT NULL を指定できるのは、列に null 値が含まれていない場合のみです。You can specify NOT NULL 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's used in a column definition. 計算列でない場合は、必ず常に明示的に NULL または NOT NULL として列を定義します。Be sure 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, be sure to define the column with the same nullability as the user-defined data type. また、列の既定値を指定します。And, specify a default value for the column. 詳細については、「CREATE TABLE」を参照してください。For more information, see CREATE TABLE.

注意

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 ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

指定した列に対する ROWGUIDCOL プロパティの追加または削除を指定します。Specifies that the ROWGUIDCOL property is added to or dropped from the specified column. ROWGUIDCOL は、列が行の GUID 列であることを示します。ROWGUIDCOL indicates that the column is a row GUID column. 1 つのテーブルにつき、1 つの uniqueidentifier 列だけを ROWGUIDCOL 列として設定できます。You can set only one uniqueidentifier column per table as the ROWGUIDCOL column. また、ROWGUIDCOL プロパティは uniqueidentifier 列にだけ割り当てることができます。And, you can only assign the ROWGUIDCOL property to a uniqueidentifier column. ROWGUIDCOL をユーザー定義データ型の列に割り当てることはできません。You can't assign ROWGUIDCOL to a column of a user-defined data type.

ROWGUIDCOL では列に一意な値が格納されるわけではなく、またテーブルに挿入される新しい行に対して値が自動的に生成されるわけではありません。ROWGUIDCOL doesn't enforce uniqueness of the values stored in the column and doesn't automatically generate values for new rows that are inserted into the table. 各列に対して一意な値を生成するには、INSERT ステートメント上で NEWID、NEWSEQUENTIALID 関数のどちらかを使用します。To generate unique values for each column, either use the NEWID or NEWSEQUENTIALID function on INSERT statements. または、列の既定値として NEWID か NEWSEQUENTIALID 関数を指定します。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's 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. 詳細については、「 計算列のインデックス」を参照してください。For more information, see Indexes on Computed Columns.

パーティション テーブルのパーティション分割列として使用する計算列には、明示的に PERSISTED とマークする必要があります。Any computed column that's used as a partitioning column of a partitioned table must be explicitly marked PERSISTED.

DROP NOT FOR REPLICATIONDROP NOT FOR REPLICATION
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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 carry out insert operations. この句は column_name が ID 列の場合にのみ指定できます。You can specify this clause 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 として設定することはできません。You can't set sparse columns 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 ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( 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. 3 つの関数を使用できます。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 ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( 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 carried out while the table remains available. 既定値は OFF です。Default is OFF. データ型、列の長さまたは有効桁数、NULL 値の許容、スパースかどうか、および照合順序に関連する列の変更のために、列の変更をオンラインで実行できます。You can run alter column online for column changes related to data type, column length or precision, nullability, sparseness, and collation.

オンラインでの列の変更では、ユーザー作成の統計と自動統計で ALTER COLUMN 操作の実行中に変更された列を参照することができます。これにより、通常どおりクエリを実行できます。Online alter column allows user created and autostatistics to reference the altered column for the duration of the ALTER COLUMN operation, which allows queries to run as usual. 操作の最後に、列を参照する自動統計は削除され、ユーザー作成の統計は無効になります。At the end of the operation, autostats 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. 統計やインデックス用のフィルター式の中でその列が使われている場合は、列の変更操作は実行できません。If the column is part of a filter expression for any statistics or indexes then you can't 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, and so on.) block or fail with an appropriate error. この動作により、操作の実行中に依存関係が導入されたためにオンラインでの列の変更が失敗しないようになります。This behavior guarantees that online alter column won't fail because of dependencies introduced while the operation was running.
  • 変更された列が非クラスター化インデックスによって参照される場合、NOT NULL から NULL への列の変更は、オンライン操作としてサポートされません。Altering a column from NOT NULL to NULL isn't supported as an online operation when the altered column is referenced by nonclustered indexes.
  • 列がチェック制約によって参照されていて、かつ変更操作が列の精度 (数値または datetime) を制限している場合、オンラインでの変更はサポートされません。Online alter isn't 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 can't be used with online alter column.
  • オンラインでの列の変更では、ALTER COLUMN ... ADD/DROP PERSISTED はサポートされていません。ALTER COLUMN ... ADD/DROP PERSISTED isn't supported for online alter column.
  • ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION は、オンラインでの列の変更の影響を受けません。ALTER COLUMN ... ADD/DROP ROWGUIDCOL/NOT FOR REPLICATION isn't affected by online alter column.
  • 変更の追跡が有効になっているか、テーブルがマージ レプリケーションのパブリッシャーである場合、オンラインでの列の変更ではテーブルの変更がサポートされません。Online alter column doesn't support altering a table where change tracking is enabled or that's a publisher of merge replication.
  • オンラインでの列の変更は、CLR データ型との変更をサポートしていません。Online alter column doesn't support altering from or to CLR data types.
  • オンラインでの列の変更では、現在のスキーマ コレクションとは異なるスキーマ コレクションを持つ XML データ型への変更はサポートされていません。Online alter column doesn't support altering to an XML data type that has a schema collection different than the current schema collection.
  • オンラインでの列の変更で、列を変更できるタイミングに関する制限が軽減されるわけではありません。Online alter column doesn't reduce the restrictions on when a column can be altered. インデックスまたは統計などでの参照は、変更が失敗する原因となる可能性があります。References by index/stats, and so on, might cause the alter to fail.
  • オンラインでの列の変更では、複数の列を同時に変更することはできません。Online alter column doesn't support altering more than one column concurrently.
  • システムでバージョン管理されたテンポラル テーブルの場合、オンラインでの列の変更による影響はありません。Online alter column has no effect in a system-versioned temporal table. ONLINE オプションに指定された値に関係なく、ALTER 列はオンラインとしては実行されません。ALTER column isn't run as online regardless of which value was specified for ONLINE option.

オンラインでの列の変更には、オンライン インデックスの再構築と同様の、次のような要件、制限、および機能があります。Online alter column has similar requirements, restrictions, and functionality as online index rebuild, which includes:

  • オンラインでのインデックスの再構築は、従来の LOB または filestream 列がテーブルに含まれている場合、またはテーブルに列ストア インデックスがある場合はサポートされません。Online index rebuild isn't 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.
  • 変更される既存の列には、元の列と新しく作成される非表示の列のために、2 倍の領域の割り当てが必要です。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 isn't validated against a newly added or re-enabled FOREIGN KEY or CHECK constraint. 指定しない場合、WITH CHECK は新しい制約用と見なされ、WITH NOCHECK は再有効化された制約用と見なされます。If you don't specify, WITH CHECK is assumed for new constraints, and WITH NOCHECK is assumed for re-enabled constraints.

既存のデータに対して新しい CHECK または FOREIGN KEY 制約を検証しない場合は、WITH NOCHECK を使用します。If you don't want to verify new CHECK or FOREIGN KEY constraints against existing data, use WITH NOCHECK. ごくわずかな例外を除き、これの実行は推奨されません。We don't recommend doing this, except in rare cases. 新しい制約は、それ以降にデータが更新されるたびに評価されます。The new constraint is 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 doesn't follow the constraint.

注意

クエリ オプティマイザーでは、WITH NOCHECK が定義されている制約は考慮されません。The query optimizer doesn't consider constraints that are defined WITH NOCHECK. このような制約は、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_nameALTER INDEX index_name
index_name のバケット数が変更されることを指定します。Specifies that the bucket count for index_name is to be changed or altered.

構文 ALTER TABLE ...ADD/DROP/ALTER INDEX は、メモリ最適化テーブルでのみサポートされます。The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

重要

ALTER TABLE ステートメントを使用しない場合、メモリ最適化テーブルのインデックスに対してステートメント CREATE INDEXDROP INDEXALTER INDEXPAD_INDEX を使用することはできません。Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

ADDADD
1 つ以上の列定義、計算列定義、またはテーブル制約を追加します。Specifies that one or more column definitions, computed column definitions, or table constraints are added. または、システムがシステムのバージョン管理用に使う列が追加されます。Or, the columns that the system uses for system versioning are added. メモリ最適化テーブルでは、インデックスを追加することができます。For memory-optimized tables, you can add an index.

重要

ALTER TABLE ステートメントを使用しない場合、メモリ最適化テーブル上のインデックスに対してステートメント CREATE INDEXDROP INDEXALTER INDEXPAD_INDEX を使用することはできません。Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX aren't 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 ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

レコードが有効になる時間の長さを記録するためにシステムによって使用される列の名前を指定します。Specifies the names of the columns that the system uses to record the period of time 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 として定義します。Set up the columns with the datatype of datetime2 and define them as NOT NULL. 期間列を NULL として定義した場合、エラーが発生します。If you define a period column as NULL, an error results. system_start_time 列と system_end_time 列の column_constraint を定義し、列の既定値を指定することができます。You can define a column_constraint and/or Specify Default Values for Columns for the system_start_time and system_end_time columns. system_end_time 列の既定値の使用方法については、後述する「システムのバージョン管理」の例 A を参照してください。See Example A in the following System Versioning examples that demonstrates using a default value for the system_end_time column.

SET SYSTEM_VERSIONING 引数と共にこの引数を使用して、既存のテーブル上でシステムのバージョン管理を有効にします。Use this argument with the SET SYSTEM_VERSIONING argument to enable system versioning on an existing table. 詳細については、「テンポラル テーブル」と「Azure SQL Database のテンポラル テーブルの概要」を参照してください。For more information, see Temporal Tables and Getting Started with Temporal Tables in Azure SQL Database.

SQL Server 2017 (14.x)SQL Server 2017 (14.x) の時点では、ユーザーは一方または両方の期間列を HIDDEN フラグを使ってマークし、これらの列を暗黙的に非表示にすることで、SELECT * FROM <table_name> からその列の値が返されないようにすることが可能です。As of SQL Server 2017 (14.x)SQL Server 2017 (14.x), users can mark one or both period columns with HIDDEN flag to implicitly hide these columns such that SELECT * FROM <table_name> doesn't return a value for the columns. 既定では、期間の列は非表示ではありません。By default, period columns aren't hidden. 非表示の列を使用するためには、テンポラル テーブルを直接参照するすべてのクエリで明示的に含める必要があります。In order to be used, hidden columns must be explicitly included in all queries that directly reference the temporal table.

DROPDROP
1 つ以上の列の定義、計算列の定義、またはテーブルの制約の削除、または、システムがシステムのバージョン管理用に使う列の仕様の削除を指定します。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 uses 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_constraintsys.default_constraintssys.key_constraints、および sys.foreign_keys カタログ ビューに対してクエリを実行することにより確認できます。You can determine the user-defined or system-supplied name of the constraint 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 can't be dropped if an XML index exists on the table.

INDEX index_nameINDEX index_name
index_name がテーブルから削除されることを指定します。Specifies that index_name is removed from the table.

構文 ALTER TABLE ...ADD/DROP/ALTER INDEX は、メモリ最適化テーブルでのみサポートされます。The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

重要

ALTER TABLE ステートメントを使用しない場合、メモリ最適化テーブルのインデックスに対してステートメント CREATE INDEXDROP INDEXALTER INDEXPAD_INDEX を使用することはできません。Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_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 can't be dropped when it's:

  • キー列または 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's defined with the DEFAULT keyword, or bound to a default object.
  • ルールにバインドされます。Bound to a rule.

注意

列を削除しても、列のディスク領域は回収されません。Dropping a column doesn't 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.

FOR SYSTEM_TIME の期間PERIOD FOR SYSTEM_TIME
適用対象: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( 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>
1 つ以上の削除クラスター化制約オプションを設定します。Specifies that one or more drop clustered constraint options are set.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

操作中は、max degree of parallelism 構成オプションをオーバーライドします。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:

11
並列プラン生成を抑制します。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 aren't available in every edition of SQL ServerSQL Server. 詳細については、SQL Server 2016 の各エディションとサポートされている機能に関するセクションと SQL Server 2017 の各エディションとサポートされている機能に関するページを参照してください。For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

ONLINE = { ON | OFF } <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 操作として実行できます。You can run REBUILD as an ONLINE operation.

ONON
長期のテーブル ロックは、インデックス操作の間は保持されません。Long-term table locks aren't 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 behavior 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 short time. 操作の最後に、短時間、非クラスター化インデックスを作成する場合はソース上で S (共有) ロックが取得されます。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. または、クラスター化インデックスをオンラインで作成または削除する場合、およびクラスター化または非クラスター化インデックスを再構築する場合、SCH-M (スキーマ修正) ロックが取得されます。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 can't 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 run 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 transactions from starting and might significantly affect the workload throughput and temporarily delay access to the underlying table.

OFFOFF
テーブル ロックは、インデックス操作の期間に適用されます。Table locks apply 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 lock 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 lock 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 の各エディションとサポートされている機能に関するセクションと SQL Server 2017 の各エディションとサポートされている機能に関するページを参照してください。For more information, see Editions and Supported Features for SQL Server 2016, and Editions and Supported Features for SQL Server 2017.

MOVE TO { partition_scheme_name ( column_name [ 1 , ... n] ) | filegroup | " default " }MOVE TO { partition_scheme_name(column_name [ 1 , ... n] ) | filegroup | " default " }
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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 isn't 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」をご覧ください。For more information, see SET QUOTED_IDENTIFIER.

{ 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 can't 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. トリガーを無効にした場合、それはまだテーブルに対して定義されています。When a trigger is disabled, it's still defined for the table. ただし、テーブルに対して INSERT、UPDATE、または DELETE ステートメントを実行すると、トリガーが再度有効化されるまでトリガー内のアクションは実行されません。However, when INSERT, UPDATE, or DELETE statements run against the table, the actions in the trigger aren't carried out 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 ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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 オプション」をご覧ください。For more information, see ALTER DATABASE SET Options.

変更の追跡を有効にするには、テーブルに主キーが必要です。To enable change tracking, the table must have a primary key.

WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )WITH ( TRACK_COLUMNS_UPDATED = { ON | OFF } )
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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 .SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ]] target_table [ PARTITION target_partition_number_expression ]
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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.
  • 1 つのパーティション テーブルから別のパーティション テーブルに、パーティションを切り替えます。Switches a partition from one partitioned table to another.
  • パーティション テーブルの 1 つのパーティションにあるすべてのデータを、既存の非パーティション テーブルに再度割り当てます。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, you must specify source_partition_number_expression. target_table がパーティション分割されている場合、target_partition_number_expression を指定する必要があります。If target_table is partitioned, you must specify target_partition_number_expression. テーブルのデータを、既に存在するパーティション テーブルのパーティションとして再度割り当てる場合、または 1 つのパーティション テーブルから別のものにパーティションを切り替える場合は、対象のパーティションが存在し、空になっている必要があります。When 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.

1 つのパーティションのデータを再度割り当てて単一のテーブルを作成する場合は、対象テーブルが既に作成されており、空になっている必要があります。When reassigning one partition's data to form a single table, the target table must already exist and it must be empty. ソース テーブルまたはパーティションと、対象テーブルまたはパーティションは、両方とも同じファイル グループに存在する必要があります。Both the source table or partition, and the target table or partition, must be located in the same filegroup. また、対応するインデックスまたはインデックス パーティションも、同じファイル グループに存在する必要があります。The corresponding indexes, or index partitions, must also be located in the same filegroup. 切り替えるパーティションには、多くの追加の制限が適用されます。Many additional restrictions apply to switching partitions. tabletarget_table を同じにすることはできません。table and target_table can't 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 can't reference Transact-SQLTransact-SQL expressions.

クラスター化された列ストア インデックスを備えたパーティション テーブルは、パーティション分割されたヒープのように動作します。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. ただし、既存の一意なインデックスを含むパーティション キーを含めると、一意性が変更される場合があることに注意してください。But, including the partition key with an existing unique index can change the uniqueness.
  • パーティションを切り替えるには、すべての非クラスター化インデックスにパーティション キーを含める必要があります。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 用に構築された非クラスター化列ストア インデックスは、読み取り専用形式でした。Nonclustered columnstore indexes built for SQL ServerSQL Server 2016 CTP1, and for SQL Database before version V12 were in a read-only format. あらゆる PARTITION 操作を実行する前に、非クラスター化列ストア インデックスを現在の形式に再構築する必要があります (これは更新可能です)。You must rebuild Nonclustered columnstore indexes to the current format (which is updatable) before any PARTITION operations can be run.

SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " } )SET ( FILESTREAM_ON = { partition_scheme_name | filestream_filegroup_name | " default " | " NULL " })
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 まで)。Applies to: SQL ServerSQL Server ( SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017). Azure SQL データベースAzure SQL Database FILESTREAM をサポートしていません。doesn't support FILESTREAM.

FILESTREAM データの格納場所を指定します。Specifies where FILESTREAM data is stored.

SET FILESTREAM_ON 句を指定した ALTER TABLE は、テーブルに FILESTREAM 列がない場合にのみ成功します。ALTER TABLE with the SET FILESTREAM_ON clause succeeds only if the table has no FILESTREAM columns. FILESTREAM 列は、2 番目の ALTER TABLE ステートメントを使うことで追加できます。You can add FILESTREAM columns by using a second ALTER TABLE statement.

partition_scheme_name を指定すると、CREATE TABLE のルールが適用されます。If you specify partition_scheme_name, the rules for CREATE TABLE apply. テーブルが行データ用に既にパーティション分割されていることを確認します。また、そのパーティション構成では、FILESTREAM パーティション構成と同じパーティション関数とパーティション列を使用する必要があります。Be sure the table is already partitioned for row data, and its partition scheme uses 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 ステートメントを使って、ファイル グループ用に定義されたファイルが 1 つ含まれている必要があります。それ以外の場合はエラーが発生します。The filegroup must have one file that's defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement, or an error results.

" default " には、DEFAULT プロパティ セットを含む FILESTREAM ファイル グループを指定します。" default " specifies the FILESTREAM filegroup with the DEFAULT property set. FILESTREAM ファイル グループがない場合は、エラーが発生します。If there's no FILESTREAM filegroup, an error results.

" NULL " を指定すると、テーブルの FILESTREAM ファイル グループへの参照がすべて削除されます。" NULL " specifies that all references to FILESTREAM filegroups for the table are removed. 最初にすべての FILESTREAM 列を削除する必要があります。All FILESTREAM columns must be dropped first. テーブルに関連付けられている FILESTREAM データをすべて削除するには、SET FILESTREAM_ON =" NULL " を使用します。Use SET FILESTREAM_ON =" NULL " to delete all FILESTREAM data that's 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 ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

テーブルに関するシステムのバージョン管理を無効または有効にします。Either disables 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 引数を使用しない場合、システムによって現在のテーブルのスキーマに一致する履歴テーブルが生成され、2 つのテーブル間のリンクが作成され、システムが現在のテーブルにある各レコードの履歴を履歴テーブルに記録できるようになります。If you don't use the HISTORY_TABLE argument, the system generates a new history table matching the schema of the current table, creates 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 you use the HISTORY_TABLE argument to create a link to and use an existing history table, the system creates a link between the current table and the specified table. 既存の履歴テーブルへのリンクを作成する場合は、データの整合性チェックを行うよう選択できます。When creating a link to an existing history table, you can choose to do a data consistency check. このデータの整合性チェックにより、既存のレコードが重複しないようになります。This data consistency check ensures that existing records don't overlap. 既定ではデータの整合性チェックを実行します。Running 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} }HISTORY_RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS} }
適用対象: SQL Server 2017 (14.x)SQL Server 2017 (14.x) および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2017 (14.x)SQL Server 2017 (14.x) and Azure SQL データベースAzure SQL Database.

テンポラル テーブルに履歴データ用の有限または無限のリテンション期間を指定します。Specifies finite or infinite retention for historical data in a temporal table. 省略すると、無限のリテンション期間が使用されます。If omitted, infinite retention is assumed.

SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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's appropriate for the table schema.

  • テーブルがパーティション分割されている場合は、ロックのエスカレーションをパーティション分割できます。If the table is partitioned, lock escalation is allowed to partition. ロックがパーティション レベルにエスカレートされたら、ロックが後で TABLE 細分性にエスカレートされることはありません。After the lock is escalated to the partition level, the lock won't be escalated later to TABLE granularity.
  • テーブルがパーティション分割されていない場合、TABLE 細分性に対してロックのエスカレーションが実行されます。If the table isn't partitioned, the lock escalation is done to the TABLE granularity.

TABLETABLE
テーブルがパーティション分割されているかパーティション分割されていないかに関係なく、ロックのエスカレーションはテーブルレベルの細分性で実行されます。Lock escalation is done at table-level granularity whether the table is partitioned or not partitioned. TABLE は既定値です。TABLE is the default value.

DISABLEDISABLE
ほとんどの場合でロック エスカレーションを禁止します。Prevents lock escalation in most cases. テーブルレベルのロックは完全には禁止されません。Table-level locks aren't completely disallowed. たとえば、SERIALIZABLE 分離レベルでクラスター化インデックスがないテーブルをスキャンしている場合、データベース エンジンDatabase Engine ではテーブル ロックを実行して、データ整合性を保護する必要があります。For example, when you're 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 run as an ONLINE operation.

パーティション テーブル内の 1 つのパーティションを再構築するには、REBUILD PARTITION 構文を使用します。Use the REBUILD PARTITION syntax to rebuild a single partition in a partitioned table.

PARTITION = ALLPARTITION = ALL
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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 doesn't have a clustered index, the heap structure is only affected by some of the options.

REBUILD 操作で特定の圧縮設定を指定しないと、パーティション用の現在の圧縮設定が使用されます。When a specific compression setting isn't 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」をご覧ください。For complete descriptions of the rebuild options, see index_option.

DATA_COMPRESSIONDATA_COMPRESSION
適用対象: SQL ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL 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: テーブルまたは指定したパーティションが圧縮されません。NONE Table or specified partitions aren't compressed. このオプションは列ストア テーブルには適用されません。This option doesn't apply to columnstore tables.

ROW: 行の圧縮を使用して、テーブルまたは指定したパーティションが圧縮されます。ROW Table or specified partitions are compressed by using row compression. このオプションは列ストア テーブルには適用されません。This option doesn't apply to columnstore tables.

PAGE: ページの圧縮を使用して、テーブルまたは指定したパーティションが圧縮されます。PAGE Table or specified partitions are compressed by using page compression. このオプションは列ストア テーブルには適用されません。This option doesn't apply to columnstore tables.

COLUMNSTORECOLUMNSTORE
適用対象: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

列ストア テーブルにのみ適用されます。Applies only to columnstore tables. COLUMNSTORE は、COLUMNSTORE_ARCHIVE オプションで圧縮されたパーティションを解凍するように指定します。COLUMNSTORE specifies to decompress a partition that was compressed with the COLUMNSTORE_ARCHIVE option. 復元されるデータは、すべての列ストア テーブルに使用される列ストア圧縮を使用して引き続き圧縮されます。When the data is restored, it continues to be compressed with the columnstore compression that's used for all columnstore tables.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE
適用対象: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

クラスター化列ストア インデックスを使用して格納されているテーブルである、列ストア テーブルのみに適用されます。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. このオプションは、保存用や、ストレージの使用量を減らす必要があり、しかも保存と取得により時間をかける余裕があるその他の状況用に使用します。Use this option for archival or other situations that require less storage and can afford more time for storage and retrieval.

複数のパーティションを同時に再構築するには、「index_option」をご覧ください。To rebuild multiple partitions at the same time, see index_option. テーブルにクラスター化インデックスが含まれていない場合、データ圧縮を変更するとヒープと非クラスター化インデックスが再構築されます。If the table doesn't 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 } <single_partition_rebuild_option に適用する場合>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_option>
基となるテーブルの 1 つのパーティションと関連するインデックスを、インデックス操作中のクエリとデータ変更用に利用できるかどうかを指定します。Specifies whether a single partition of the underlying tables and associated indexes is available for queries and data modification during the index operation. 既定値は OFF です。The default is OFF. REBUILD は ONLINE 操作として実行できます。You can run REBUILD as an ONLINE operation.

ONON
長期のテーブル ロックは、インデックス操作の間は保持されません。Long-term table locks aren't held for the duration of the index operation. インデックスの再構築を開始するときにテーブル上の S ロックが必要であり、オンライン インデックス再構築を終了するときにテーブルの Sch-M ロックが必要です。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, 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 ServerSQL Server (SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

列セットの名前です。The name of the column set. 列セットは、型指定されていない XML 表記であり、テーブルのすべてのスパース列を 1 つにまとめて構造化した出力です。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 can't 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 ServerSQL Server (SQL Server 2012 (11.x)SQL Server 2012 (11.x) から SQL Server 2017SQL Server 2017)。Applies to: SQL ServerSQL Server ( 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 ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) から SQL Server 2017SQL Server 2017Applies to: SQL ServerSQL Server ) SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017. Azure SQL データベースAzure SQL Database FILETABLE をサポートしていません。doesn't support FILETABLE.

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, despite the 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 ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) から SQL Server 2017SQL Server 2017 まで)。Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

テーブルに対して Stretch Database を有効または無効にします。Enables or disables Stretch Database for a table. 詳細については、「Stretch Database」を参照してください。For more information, 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 を有効にする方法については、「Enable Stretch Database for a table」を参照してください。For more information 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 information, see Enable Stretch Database for a database.

権限:Permissions. データベースまたはテーブルの Stretch を有効にするには、db_owner アクセス許可が必要です。Enabling Stretch for a database or a table requires db_owner permissions. テーブルの拡張を有効にすると、テーブルに対する ALTER 権限も必要になります。Enabling Stretch for a table also requires ALTER permissions on the table.

テーブルに対して Stretch Database を無効にするDisabling Stretch Database for a table

テーブルの Stretch を無効にすると、既に Azure に移行されているリモート データには 2 つの選択肢があります。When you disable Stretch for a table, you have two options for the remote data that's already been migrated to Azure. 詳細については、「Stretch Database を無効にして、リモート データを戻す」を参照してください。For more information, see Disable Stretch Database and bring back remote data.

  • テーブルに対する Stretch を無効にして、テーブルのリモート データを 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 information, see Data Transfers Pricing Details.

すべてのリモート データが Azure から SQL Server にコピーして戻されると、テーブルに対する Stretch は無効になります。After all the remote data has been copied from Azure back to SQL Server, Stretch is disabled for the table.

  • テーブルに対する Stretch を無効にして、リモート データを破棄するには、次のコマンドを実行します。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 doesn't remove the remote table. リモート テーブルを削除する場合は、Azure portal を使用して削除します。If you want to delete the remote table, you drop it by using the Azure portal.

[ FILTER_PREDICATE = { null | predicate } ][ FILTER_PREDICATE = { null | predicate } ]
適用対象: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) から SQL Server 2017SQL Server 2017 まで)。Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through 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 を有効にする」および「フィルター関数を使用して移行する行を選択する」をご覧ください。For more information, 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. Stretch Database では、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 ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) から SQL Server 2017SQL Server 2017 まで)。Applies to: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) through SQL Server 2017SQL Server 2017).

  • SQL Server から Azure にデータを移行するには OUTBOUND を指定します。Specify OUTBOUND to migrate data from SQL Server to Azure.

  • Azure から SQL Server にテーブルのリモート データをコピーして戻し、テーブルに対する Stretch を無効にするには、INBOUND を指定します。Specify INBOUND to copy the remote data for the table from Azure back to SQL Server and to disable Stretch for the table. 詳細については、「Stretch Database を無効にして、リモート データを戻す」を参照してください。For more information, see Disable Stretch Database and bring back remote data.

    この操作によりデータ転送コストが発生し、取り消すことはできません。This operation incurs data transfer costs, and it can't be canceled.

  • データの移行を一時停止または延期するには PAUSED を指定します。Specify PAUSED to pause or postpone data migration. 詳しくは、「データ移行の一時停止と再開 - Stretch Database」をご覧ください。For more information, see Pause and resume data migration - Stretch Database.

WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY
適用対象: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( 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 waits for low-priority locks, allowing other operations to carry on 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 the same as WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = time [MINUTES]MAX_DURATION = time [MINUTES ]
適用対象: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017) and Azure SQL データベースAzure SQL Database.

SWITCH またはオンライン インデックス再構築のロックが、DDL コマンドの実行時に低優先度で待機する時間 (分単位で指定した整数値) です。The wait time, which is an integer value specified in minutes, that the SWITCH or online index rebuild locks wait with low priority when running 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 run. MAX_DURATION の期間は常に分単位で、MINUTES という単語は省略できます。MAX_DURATION time is always in minutes, and you can omit the word MINUTES.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
適用対象: SQL ServerSQL Server (SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( 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 run without taking any action.

BLOCKERSBLOCKERS
現在 SWITCH またはオンライン インデックス再構築の DDL 操作をブロックしているすべてのユーザー トランザクションを中止して、操作を続行できるようにします。Kill all user transactions that currently block 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) から SQL Server 2017SQL Server 2017) と Azure SQL データベースAzure SQL DatabaseApplies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017) 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

列のデータ型の新しいサイズを指定すると、列の長さ、有効桁数、または小数点以下桁数を変更できます。You can change the length, precision, or scale of a column by specifying a new size for the column data type. ALTER COLUMN 句を使います。Use the ALTER COLUMN clause. 列内にデータが存在する場合は、新しいサイズをデータの最大サイズより小さくすることはできません。If data exists in the column, the new size can't be smaller than the maximum size of the data. また、インデックス内で列を定義することはできません。ただし、その列のデータ型が varcharnvarchar、または varbinary であり、インデックスが PRIMARY KEY 制約の結果として生じたものでない場合は除きます。Also, you can't define the column in an index, unless the column is a varchar, nvarchar, or varbinary data type and the index isn't the result of a PRIMARY KEY constraint. 列定義を変更する」というタイトルの短いセクションにある例をご覧ください。See the example in the short section titled Altering a Column Definition.

ロックと ALTER TABLELocks and ALTER TABLE

ALTER TABLE で指定した変更はすぐに実装されます。Changes you specify in ALTER TABLE implement 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 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 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 ステートメントと同じ注意を払って実行します。Run these ALTER TABLE statements 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) Enterprise Edition 以降では、既定値を持つ 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 despite the number of rows in the table. なぜなら、操作中にテーブル内の既存の行が更新されないためです。Because, the existing rows in the table aren't 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. この動作は自動的に行われます。This behavior is automatic. ADD COLUMN 構文以外に、オンライン操作を実装するための追加の構文は必要ありません。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 despite 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() aren't 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's not a runtime constant is always run 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 don't specify another value for the column. メタデータに格納された既定値は、行が更新されるか (UPDATE ステートメントで実際の列が指定されなくても)、テーブルまたはクラスター化インデックスが再構築された場合、既存の行に移動されます。The default value stored in metadata moves to an existing row when the row is updated (even if the actual column isn't specified in the UPDATE statement), or if the table or clustered index is rebuilt.

varchar(max)nvarchar(max)varbinary(max)xmltextntextimagehierarchyidgeometrygeography、または CLR UDTS の列をオンライン操作で追加することはできません。Columns of type varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image, hierarchyid, geometry, geography, or CLR UDTS, can't be added in an online operation. 行の最大サイズが 8,060 バイトの制限を超える場合は、列をオンラインで追加することはできません。A column can't 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

パーティション テーブルを対象にした SWITCH 操作を実行するだけでなく、ALTER TABLE を使って、非パーティション テーブルに対して使われる場合と同様に、パーティション テーブルの列、制約、トリガーの状態を変更します。In addition to performing SWITCH operations that involve partitioned tables, use ALTER TABLE to change the state of the columns, constraints, and triggers of a partitioned table just like it's used for nonpartitioned tables. ただし、このステートメントを使用して、テーブル自体のパーティション分割方法を変更することはできません。However, this statement can't be used to change the way the table itself is partitioned. パーティション テーブルを再びパーティション分割するには、ALTER PARTITION SCHEME および ALTER PARTITION FUNCTION を使用します。To repartition a partitioned table, use ALTER PARTITION SCHEME and ALTER PARTITION FUNCTION. また、パーティション テーブルの列のデータ型を変更することはできません。Additionally, you can't 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 isn't 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」をご覧ください。For more information about schema binding and indexed views, see CREATE VIEW.

ベース テーブルに対するトリガーの追加や削除は、そのテーブルを参照するスキーマ バインド ビューを作成しても影響を受けません。Adding or removing triggers on base tables isn't 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 を使って制約を削除して再び追加する必要はありません。Use The ALTER INDEX statement to rebuild an index part of a constraint definition; the constraint doesn't 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 you delete a constraint that created a clustered index, the data rows that were stored in the leaf level of the clustered index are stored in a nonclustered table. MOVE TO オプションを指定すると、1 つのトランザクションで、クラスター化インデックスを削除し、その結果生成されたテーブルを別のファイル グループまたはパーティション構成に移動できます。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 isn't valid for indexed views or nonclustered indexes.
  • パーティション構成またはファイル グループは、既に存在している必要があります。The partition scheme or filegroup must already exist.
  • MOVE TO を指定しない場合、テーブルは、クラスター化インデックス用に定義されたものと同じパーティション構成またはファイル グループに配置されます。If MOVE TO isn't specified, the table is 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, specify the ONLINE = ON option so the DROP INDEX transaction doesn't block queries and modifications to the underlying data and associated nonclustered indexes.

ONLINE = ON には次の制限があります。ONLINE = ON has the following restrictions:

  • ONLINE = ON は、無効化されたクラスター化インデックスに対しては有効ではありません。ONLINE = ON isn't valid for clustered indexes that are also disabled. 無効化されたインデックスは、ONLINE = OFF を使って削除する必要があります。Disabled indexes must be dropped by using ONLINE = OFF.
  • 一度に 1 つのインデックスのみを削除できます。Only one index at a time can be dropped.
  • ONLINE = ON は、インデックス付きビュー、非クラスター化インデックス、またはローカル一時テーブル上のインデックスに対しては有効ではありません。ONLINE = ON isn't valid for indexed views, nonclustered indexes, or indexes on local temp tables.
  • ONLINE = ON は、列ストア インデックスに対しては有効ではありません。ONLINE = ON isn't 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 can't be applied to clustered indexes on views or nonclustered indexes.

スキーマ変更のレプリケートReplicating Schema Changes

SQL ServerSQL Server パブリッシャーでパブリッシュされたテーブルに ALTER TABLE を実行すると、既定では、すべての SQL ServerSQL Server サブスクライバーにその変更が反映されます。When you run ALTER TABLE on a published table at a SQL ServerSQL Server Publisher, by default, that change propagates to all SQL ServerSQL Server Subscribers. この機能にはいくつか制限事項があります。This functionality has some restrictions. これは無効にできます。You can disable it. 詳細については、「パブリケーション データベースでのスキーマの変更」を参照してください。For more information, see Make Schema Changes on Publication Databases.

Data CompressionData Compression

システム テーブルで圧縮を有効にすることはできません。System tables can't 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:

  • 固定されていないインデックスがテーブルにある場合、その 1 つのパーティションの圧縮設定を変更できません。You can't 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. クリーンアップは多大な時間を必要とする場合があります。The cleanup can require a large amount of time. 多数の行を含むテーブルの NTEXT 列を削除する場合は、最初に NTEXT 列を NULL 値に更新し、次に列を削除します。When dropping an NTEXT column in a table with lots of rows, update the NTEXT column to NULL value first, then drop the column. このオプションを並列操作で実行し、より高速にすることができます。You can run this option with parallel operations and make it much faster.

オンラインでのインデックス再構築Online Index Rebuild

オンライン インデックス再構築の DDL ステートメントを実行するには、特定のテーブルで実行されているすべてのアクティブなブロック トランザクションが完了する必要があります。To run 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 launches, it blocks all new transactions that are ready to start running on this table. オンライン インデックス再構築のロックの期間は短いですが、特定のテーブル上の開いているトランザクションがすべて完了するまで待機し、新しいトランザクションの開始をブロックすることで、スループットに大きな影響を与える場合があります。Although the duration of the lock for online index rebuild is short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput. これは、ワークロードの低速化やタイムアウトの原因となり、基になるテーブルへのアクセスを大幅に制限する可能性があります。This can cause a workload slow-down or timeout and significantly limit access to the underlying table. WAIT_AT_LOW_PRIORITY オプションを使うと、オンライン インデックス再構築に必要な S ロックおよび Sch-M ロックを DBA が管理できるようにし、3 つのオプションのいずれかを選択できるようにすることが可能です。The WAIT_AT_LOW_PRIORITY option allows DBAs to manage the S-lock and Sch-M locks required for online index rebuilds and lets them to select one of three options. 3 つのいずれのケースでも、待機時間 ((MAX_DURATION =n [minutes])) 中にブロックするアクティビティがない場合は、オンライン インデックス再構築が待機なしですぐに実行され、DDL ステートメントが完了します。In all three cases, if during the wait time ( (MAX_DURATION =n [minutes]) ) there are no blocking activities, the online index rebuild is run immediately without waiting and the DDL statement is completed.

互換性サポートCompatibility Support

ALTER TABLE ステートメントでは、2 部構成 (schema.object) のテーブル名だけを使用できます。The ALTER TABLE statement supports 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.

この問題を解決するには、4 部構成のプレフィックスの使用を削除します。To resolve the problem, remove the use of a four-part prefix.

アクセス許可Permissions

テーブルに対する 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's switched inherits the security of the target table.

ALTER TABLE ステートメント内の任意の列を、共通言語ランタイム (CLR) ユーザー定義型または別名データ型として定義している場合は、その型に対する REFERENCES 権限が必要です。If you've defined any columns in the ALTER TABLE statement 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 isn't 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.

A.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

B.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

C.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

D.D. 既存の列に DEFAULT 制約を追加するAdding a DEFAULT constraint to an existing column

次の例では、2 つの列を含んだテーブルを作成し、最初の列には値を挿入し、もう 1 つの列は NULL のままにします。The following example creates a table with two columns and inserts a value into the first column, and the other column remains NULL. 2 番目の列には 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

E.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

F.F. null 許容列を既定値と共に追加するAdding a nullable column with default values

次の例では、NULL 値を許容する列を DEFAULT 定義と共に追加し、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 isn't 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

G.G. PRIMARY KEY 制約をインデックス オプションまたはデータ圧縮オプションと共に作成するCreating a PRIMARY KEY constraint with index or data compression options

次の例では、PRIMARY KEY 制約 PK_TransactionHistoryArchive_TransactionID を作成し、オプション FILLFACTORONLINE、および PAD_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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

USE AdventureWorks;
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

このような例では、クラスター化された主キーの適用中にページの圧縮が適用されます。This similar example applies page compression while applying the clustered primary key.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (DATA_COMPRESSION = PAGE);
GO

H.H. スパース列を追加するAdding a sparse column

次の例では、テーブル T1 にスパース列を追加する方法と、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

I.I. 列セットを追加するAdding a column set

次の例では、テーブル T2 に列を追加する方法を示します。The following examples show adding a column to table T2. 既にスパース列が含まれるテーブルには列セットを追加できません。A column set can't 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 という列セットが追加され、列 C2 および C3SPARSE に変更されます。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

J.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.

A.A. 1 つまたは複数の列を削除するDropping a column or columns

最初の例では、テーブルを変更して列を削除します。The first example modifies a table to remove a column. 2 番目の例では、複数の列を削除します。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;

B.B. 制約と列を削除するDropping constraints and columns

最初の例では、テーブルから UNIQUE 制約を削除します。The first example removes a UNIQUE constraint from a table. 2 番目の例では、2 つの制約と 1 つの列を削除します。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 my_constraint, my_pk_constraint, COLUMN column_b ;
GO

C.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

D.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

A.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

B.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. col_a のサイズは引き続き拡張できます。データ型が varchar 型であり、インデックスが PRIMARY KEY 制約の結果ではないためです。The size of col_a can still be increased because the data type is a varchar and the index isn't 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');

C.C. 列の照合順序を変更するChanging column collation

次の例では、列の照合順序を変更する方法を示します。The following example shows how to change the collation of a column. まず、既定のユーザー照合順序でテーブルを作成します。First, 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. データ型は変更されませんが、必須です。The data type is required, even though it isn't changed.

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

D.D. 列の暗号化Encrypting a column

次の例では、セキュア エンクレーブを使用する Always Encrypted を使用して列を暗号化する方法を示します。The following example shows how to encrypt a column using Always Encrypted with secure enclaves.

最初に、暗号化された列のないテーブルが作成されます。First, a table is created without any encrypted columns.

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

次に、CEK1 という名前の列暗号化キーとランダム化された暗号化を使用して列 'C2' が暗号化されます。Next, column 'C2' is encrypted with a column encryption key, named CEK1, and randomized encryption. 次のステートメントが成功するには:For the following statement to succeed:

  • 列暗号化キーがエンクレーブ対応である必要があります。The column encryption key must be enclave-enabled. つまり、これはエンクレーブ計算を許可する列マスター キーを使用して暗号化する必要があります。Meaning, it must be encrypted with a column master key that allows enclave computations.
  • ターゲットの SQL Server インスタンスでは、セキュア エンクレーブを使用する Always Encrypted がサポートされている必要があります。The target SQL Server instance must support Always Encrypted with secure enclaves.
  • ステートメントは、セキュア エンクレーブを使用する Always Encrypted 用に設定された接続経由で、サポートされているクライアント ドライバーを使用して発行される必要があります。The statement must be issued over a connection set up for Always Encrypted with secure enclaves, and using a supported client driver.
  • 呼び出し元のアプリケーションでは、CEK1 を保護する列マスター キーへのアクセスが必要です。The calling application must have access to the column master key, protecting CEK1.
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL;
GO

テーブル定義を変更するAltering a Table Definition

このセクションの例では、テーブルの定義を変更する方法を示します。The examples in this section demonstrate how to alter the definition of a table.

A.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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL 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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL 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.

B.B. 列ストア テーブルを修正してアーカイブ圧縮を変更するModifying a columnstore table to change archival compression

次の例では、追加の圧縮アルゴリズムを適用することで、列ストア テーブル パーティションをさらに圧縮します。The following example further compresses a columnstore table partition by applying an additional compression algorithm. この圧縮によってテーブルのサイズは小さくなりますが、保存と取得に必要な時間が増加します。This compression 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 2017 および Azure SQL データベースAzure SQL DatabaseApplies 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 オプションを使って圧縮された列ストア テーブル パーティションを解凍します。The following example decompresses a columnstore table partition that was compressed with COLUMNSTORE_ARCHIVE option. 復元されるデータは、すべての列ストア テーブルに使用された列ストア圧縮を使用して引き続き圧縮されます。When the data is restored, it will continue to be compressed with the columnstore compression that's used for all columnstore tables.

適用対象: SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies 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

C.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

D.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 isn't partitioned, lock escalation is set at the TABLE level.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

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

E.E. テーブルに変更の追跡を構成するConfiguring change tracking on a table

次の例では、Person.Person テーブルの変更の追跡を有効にします。The following example enables change tracking on the Person.Person table.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

USE AdventureWorks;
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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE AdventureWorks;
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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

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

制約およびトリガーを無効および有効にするDisabling and Enabling Constraints and Triggers

A.A. 制約を無効化および再有効化するDisabling and re-enabling a constraint

次の例では、データ内で許容される給与を制限する制約を無効にします。The following example disables a constraint that limits the salaries accepted in the data. ここでは、NOCHECK CONSTRAINT と共に ALTER 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) ;

B.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

A.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 2017 および Azure SQL データベースAzure SQL DatabaseApplies 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 ) )
)
;

B.B. オンラインでの列の変更Online Alter Column

次の例では、ONLINE オプションを使用して列の変更操作を実行する方法を示します。The following example shows how to run an alter column operation with the ONLINE option.

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies 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. 詳細については、「システム バージョン管理されたテンポラル テーブルの概要」を参照してください。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 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

A.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's 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 can't be null. この例では、HIDDEN 句を使用して、現在のテーブルと対話している既存のアプリケーションに影響を与えないようにしています。This example uses the HIDDEN clause to ensure no impact on existing applications interacting with the current table. SQL データベースSQL Database 上でのみ利用できる HISTORY_RETENTION_PERIOD も使用しています。It also uses HISTORY_RETENTION_PERIOD that's available on SQL データベースSQL 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 SYSUTCDATETIME(),
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));

B.B. システム バージョン管理を使用するように、既存のソリューションを移行するMigrate An Existing Solution to Use System Versioning

次の例では、一時的なサポートを再現するトリガーを使用したソリューションから、システム バージョン管理に移行する方法を示します。The following example shows how to migrate to system versioning from a solution that uses triggers to mimic temporal support. この例では、既存のソリューション用に ProjectTask テーブルと ProjectTaskHistory テーブルを使い、その期間用に Changed DateRevised Date 列を使い、これらの期間列で datetime2 データ型が使われず、ProjectTask テーブルに主キーが定義されているような既存のソリューションが存在することを前提としています。The example assumes there's an existing solution that uses a ProjectTask table and a ProjectTaskHistory table for its existing solution, that's uses the Changed Date and Revised Date columns for its periods, that these period columns don't use the datetime2 datatype and that the ProjectTask table has a primary key defined.

-- Drop existing trigger
DROP TRIGGER ProjectTask_HistoryTrigger;

-- Adjust the schema for current and history table
-- Change data types for existing period columns
ALTER TABLE ProjectTask ALTER COLUMN [Changed Date] datetime2 NOT NULL;
ALTER TABLE ProjectTask 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 ProjectTask
ADD PERIOD FOR SYSTEM_TIME ([Changed Date], [Revised Date])

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

C.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 to modify the table schema. トランザクション内で次の手順を実行し、テーブルのスキーマの更新中に両方のテーブルが更新されるのを回避します。これにより、DBA は、もう一度システムのバージョン管理を有効にするときにデータの整合性チェックをスキップでき、パフォーマンス上の利点を得ることができます。Do 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. 統計の作成、パーティションの切り替え、1 つまたは両方のテーブルに対する圧縮の適用などのタスクでは、システムのバージョン管理を無効にする必要はありません。Tasks such as creating statistics, switching partitions, or applying compression to one or both tables doesn't 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

D.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. システムのバージョン管理が有効な場合は、DepartmentDepartmentHistory のいずれかのテーブルを削除できません。You can't drop either the Department or the DepartmentHistory tables while system versioning is enabled.

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

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

次の例 A から C では、AdventureWorksPDW2012AdventureWorksPDW2012 データベースの FactResellerSales テーブルを使用しています。The following examples A through C use the FactResellerSales table in the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. テーブルがパーティション分割されているかどうかを調べるDetermining if a table is partitioned

次のクエリでは、テーブル FactResellerSales がパーティション分割されている場合、1 つ以上の行が返されます。The following query returns one or more rows if the table FactResellerSales is partitioned. テーブルがパーティション分割されていない場合は、行が返されません。If the table isn't 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';

B.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;

C.C. パーティション テーブルのパーティション列を調べるDetermining the partition column for a partitioned table

次のクエリでは、テーブルのパーティション分割列の名前を返します。The following query returns the name of the partitioning column for table. FactResellerSalesFactResellerSales.

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;

D.D. 2 つのパーティションをマージするMerging two partitions

次の例では、テーブル上の 2 つのパーティションをマージします。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)));

E.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 )));

F.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.

パーティションPartition データがあるHas data? 境界の範囲Boundary range
11 はい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 don't need to be the same. この例では、OrdersHistory テーブルに次の 2 つのパーティションがあり、両方のパーティションが空です。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

これら 2 つのテーブルの場合、次のコマンドで、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

もう 1 年が経過し、2005 年をアーカイブする準備が整ったとします。Suppose another year passes and you're ready to archive the year 2005. 空のパーティションを次のように分割して、2005 年の空のパーティションを OrdersHistory テーブルに割り当てることができます。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