ALTER TABLE (Transact-SQL)

Изменения: 15 сентября 2007 г.

Изменяет определение таблицы путем изменения, добавления или удаления столбцов и ограничений, переназначения секций, а также отключения или включения ограничений и триггеров.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
        [ type_schema_name. ] type_name [ ( { precision [ , scale ] 
            | max | xml_schema_collection } ) ] 
        [ COLLATE collation_name ] 
        [ NULL | NOT NULL ] 
    | {ADD | DROP } { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION}
    } 
    | [ WITH { CHECK | NOCHECK } ] ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
    } [ ,...n ]
    | DROP 
    { 
        [ CONSTRAINT ] constraint_name 
        [ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
        | COLUMN column_name 
    } [ ,...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 ]
}
[ ; ]

<drop_clustered_constraint_option> ::=  
    { 
        MAXDOP = max_degree_of_parallelism
      | ONLINE = {ON | OFF }
      | MOVE TO { partition_scheme_name ( column_name ) | filegroup
          | "default"}
    }

Аргументы

  • database_name
    Имя базы данных, в которой создана таблица.
  • schema_name
    Имя схемы, которой принадлежит таблица.
  • table_name
    Имя таблицы, подлежащей изменению. Если таблицы нет в текущей базе данных или она не содержится в схеме, которой владеет текущий пользователь, то и база данных, и схема должны быть явно указаны.
  • ALTER COLUMN
    Указывает, что именованный столбец подлежит изменению. Инструкция ALTER COLUMN не разрешена, если значение уровня совместимости равно или ниже 65. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).

    Нельзя изменять следующие столбцы.

    • Столбец с типом данных timestamp.
    • Свойство ROWGUIDCOL для таблицы.
    • Вычисляемый столбец или используемый в вычисляемом столбце.
    • Используется в индексе, если столбец не принадлежит к типу данных varchar, nvarchar или varbinary, тип данных не изменяется и новый размер больше старого или равен ему.
    • Используемый в статистике, сформированной инструкцией CREATE STATISTICS. Во-первых, удалите статистику, используя инструкцию DROP STATISTICS. Статистика, автоматически сформированная оптимизатором запросов, автоматически удаляется инструкцией ALTER COLUMN.
    • Используемый в ограничении REFERENCES аргумента PRIMARY KEY или [FOREIGN KEY].
    • Используемый в ограничениях CHECK или UNIQUE. Однако допустимо изменение длины столбца изменяемой длины, используемого в ограничении CHECK или UNIQUE.
    • Связано с определением по умолчанию. Однако, если тип данных не изменен, то длина, точность или масштаб столбца могут быть изменены.
      Тип данных столбцов text, ntext и image может быть изменен только следующими способами:
      • text на varchar(max), nvarchar(max) или xml
      • ntext на varchar(max), nvarchar(max) или xml
      • image в varbinary(max)
        Некоторые изменения типов данных могут повлечь за собой изменения в данных. Например, изменение столбца типа nchar или типа nvarchar на char или varchar может вызвать преобразование расширенных символов. Дополнительные сведения см. в разделе Функции CAST и CONVERT (Transact-SQL). Снижение точности или масштаба столбца может привести к усечению данных.
        Нельзя изменять тип данных столбца секционированной таблицы.
  • column_name
    Имя столбца, подлежащего изменению, добавлению или удалению. Аргумент column_name может содержать максимум 128 символов. При создании новых столбцов свойство column_name может быть опущено для столбцов, созданных с типом данных timestamp. Имя timestamp используется, если аргумент column_name не был указан для столбца с типом данных timestamp.
  • [ type_schema_name**.** ] type_name
    Новый тип данных для измененного столбца или тип данных для добавленного столбца. Невозможно указать аргумент type_name для существующих столбцов секционированных таблиц. Аргумент type_name может быть одним из следующих:

    • Системным типом данных SQL Server 2005.
    • Псевдонимом типа данных, основанным на системном типе данных SQL Server. Псевдонимы типов данных создаются при помощи инструкции CREATE TYPE, прежде чем их можно будет использовать в определении таблицы.
    • Определяемым пользователем типом .NET Framework и схемой, к которой он принадлежит. Перед использованием в определении таблицы определяемые пользователем типы .NET Framework создаются при помощи инструкции CREATE TYPE.

    Ниже приведены критерии для аргумента type_name изменяемого столбца:

    • Предыдущие типы данных должны быть неявно преобразуемыми в новый тип данных.
    • Аргумент type_name не может принадлежать к типу timestamp.
    • По умолчанию для аргумента ANSI_NULL инструкции ALTER COLUMN всегда установлено значение ON; если не указано иное, столбец может содержать значения NULL.
    • Аргумент заполнения ANSI_PADDING для инструкции ALTER COLUMN всегда принимает значение ON.
    • Если изменяемый столбец является столбцом идентификаторов, то аргумент new_data_type должен быть типом данных, который поддерживает свойство идентификатора.
    • Текущая установка для аргумента SET ARITHABORT пропускается. Инструкция ALTER TABLE функционирует аналогично случаю, когда для аргумента ARITHABORT установлено значение ON.
    ms190273.note(ru-ru,SQL.90).gifПримечание.
    Если предложение COLLATE не указывается, то изменение типа данных столбца вызовет изменение параметров сортировки на параметры сортировки базы данных по умолчанию.
  • max
    Применим только к типам данных varchar, nvarchar и varbinary для хранения 2^31-1 байт символов, двоичных данных и данных Юникода.
  • xml_schema_collection
    Применим только к данным типа xml, чтобы поставить XML-схему в соответствие с этим типом. Перед вводом столбца xml в коллекцию схемы необходимо при помощи CREATE XML SCHEMA COLLECTION создать коллекцию схемы в базе данных.
  • COLLATE < collation_name >
    Задает новые параметры сортировки для изменяемого столбца. Если значение этого аргумента не установлено, то столбцу назначаются параметры сортировки базы данных по умолчанию. Именем параметров сортировки может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. Список и дополнительные сведения см. в разделах Имя параметров сортировки Windows (Transact-SQL) и Имя параметров сортировки SQL (Transact-SQL).

    Предложение COLLATE может быть использовано для изменения параметров сортировки только для столбцов типов char, varchar, nchar и nvarchar. Чтобы изменить параметры сортировки столбца пользовательского псевдонима типа данных, необходимо выполнить отдельные инструкции ALTER TABLE, чтобы изменить столбец на системный тип данных SQL Server, изменить параметры сортировки, а затем снова перевести столбец в псевдоним типа данных.

    Инструкция ALTER COLUMN не может изменить параметры сортировки, если выполняется одно или несколько из следующих условий:

    • Если изменены ограничение CHECK, ограничение FOREIGN KEY или ссылки на вычисляемые столбцы, связанные с данным столбцом.
    • Если в столбце создается какой-нибудь индекс, статистика или полнотекстовый индекс. Статистика, автоматически создаваемая в изменяемом столбце, удаляется, если изменяются параметры сортировки столбца.
    • Если связанное со схемой представление или функция ссылаются на столбец.

    Дополнительные сведения см. в разделе COLLATE (Transact-SQL).

  • NULL | NOT NULL
    Указывает, может ли столбец принимать значения NULL. Столбцы, не допускающие значения NULL, могут быть добавлены инструкцией ALTER TABLE только в том случае, если для них указаны значения по умолчанию или если таблица пуста. Значение NOT NULL может быть указано для вычисляемых столбцов только в том случае, если одновременно указан аргумент PERSISTED. Если новый столбец допускает значения NULL, а значение по умолчанию не задано, то новый столбец содержит значение NULL для каждой строки в таблице. Если новый столбец допускает значение NULL, а определение по умолчанию добавляется с новым столбцом, то инструкция WITH VALUES может использоваться для хранения значений по умолчанию в новом столбце для каждой существующей строки в таблице.

    Если новый столбец не допускает значение NULL и таблица не пуста, то определение DEFAULT должно быть добавлено с новым столбцом. Новый столбец автоматически загружается со значениями по умолчанию в каждой существующей строке нового столбца.

    Значение NULL может указываться в инструкции ALTER COLUMN, чтобы принудить столбец NOT NULL допускать значения NULL, за исключением столбцов в ограничениях PRIMARY KEY. Значение NOT NULL может быть указано в инструкции ALTER COLUMN, только если столбец не содержит значения NULL. Значения NULL следует обновить, присвоив некоторые значения, прежде чем разрешить инструкцию ALTER COLUMN NOT NULL, например:

    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 для типа данных, используемого в определении столбца. Рекомендуется всегда явно определять столбец как NULL или NOT NULL для невычисляемых столбцов или, если используется пользовательский тип данных, разрешать, чтобы в столбец использовалось по умолчанию разрешение принимать значение NULL для этого типа данных. Дополнительные сведения см. в разделе CREATE TABLE (Transact-SQL).

    ms190273.note(ru-ru,SQL.90).gifПримечание.
    Если в инструкции ALTER COLUMN указано значение NULL или NOT NULL, то необходимо также указать параметры new_data_type [(precision [, scale ])]. Если тип данных, точность или масштаб не изменялись, укажите текущие значения столбца.
  • [ {ADD | DROP} ROWGUIDCOL ]
    Указывает свойство ROWGUIDCOL, добавленное к указанному столбцу или удаленное из него. Свойство ROWGUIDCOL указывает, что данный столбец является столбцом идентификатора GUID для строки. Только один столбец в таблице uniqueidentifier может быть выделен как столбец ROWGUIDCOL и свойство ROWGUIDCOL может присваиваться только столбцу uniqueidentifier. Нельзя присваивать свойство ROWGUIDCOL столбцу пользовательского типа данных.

    Свойство ROWGUIDCOL не обеспечивает уникальности значений, хранимых в столбце, и не формирует автоматически значения для новых строк, вставляемых в таблицу. Для формирования уникальных значений для каждого столбца можно использовать функцию NEWID в инструкциях INSERT или определить функцию NEWID как значение по умолчанию для столбца.

  • [ {ADD | DROP} PERSISTED ]
    Указывает, что свойство PERSISTED добавлено к указанному столбцу или удалено из него. Столбец должен быть вычисляемым столбцом, который задается при помощи детерминированных выражений. Для столбцов, указанных как PERSISTED, компонент SQL Server 2005 Database Engine физически хранит вычисляемые значения в таблице и обновляет значения при обновлении любого столбца, от которого зависит вычисляемый столбец. Если пометить вычисляемый столбец как PERSISTED, можно создавать индексы по вычисляемым столбцам, которые заданы, являются детерминированными, но не точными выражениями. Дополнительные сведения см. в разделе Создание индексов вычисляемых столбцов.

    Любой вычисляемый столбец, используемый как столбец секционирования секционированной таблицы, должен быть явно помечен PERSISTED.

  • WITH CHECK | WITH NOCHECK
    Указывает, удовлетворяют ли данные в таблице недавно добавленному или повторно включенному ограничению FOREIGN KEY или CHECK. Если не указано иное, для новых ограничений предполагается использовать WITH CHECK, а для повторно включенных ограничений — WITH NOCHECK.

    Если проверка новых ограничений CHECK или FOREIGN KEY относительно существующих данных не нужна, используйте WITH NOCHECK. За исключением редких случаев, делать это не рекомендуется. Новое ограничение будет проверяться во всех дальнейших обновлениях данных. Любые нарушения ограничений, подавляемые WITH NOCHECK во время добавления ограничения, могут вызвать сбой будущих обновлений, если они обновляют строки данными, не соответствующими ограничениям.

    Оптимизатор запросов не рассматривает ограничения, которые определены WITH NOCHECK. Такие ограничения не учитываются до тех пор, пока они не будут повторно включены с использованием инструкции ALTER TABLE table CHECK CONSTRAINT ALL.

  • ADD
    Указывает, что добавляется одно или несколько определений столбца, определений вычисляемого столбца или ограничений таблиц.
  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    Указывает, что из таблицы удалено ограничение constraint_name или column_name. Может быть перечислено несколько столбцов и ограничений. Инструкция DROP COLUMN не разрешена, если значение уровня совместимости равно или ниже 65. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).

    Пользовательское имя ограничения или имя ограничения, предоставленное системой, можно определить с помощью запросов к представлениям каталога sys.check_constraint, sys.default_constraints, sys.key_constraints и sys.foreign_keys.

    Невозможно удалить ограничение PRIMARY KEY, если в таблице существует XML-индекс.

    Невозможно удалить столбец, если он:

    • Используется в индексе.
    • Используется в ограничениях CHECK, FOREIGN KEY, UNIQUE или PRIMARY KEY.
    • Связан со значением по умолчанию, определенным ключевым словом DEFAULT, или привязан к объекту по умолчанию.
    • Привязан к правилу.
    ms190273.note(ru-ru,SQL.90).gifПримечание.
    При удалении столбца пространство на диске не освобождается. В том случае, если размер строк таблицы приближается к пределу или превышает его, возможен возврат места, занятого на диске удаленным столбцом. Возврат пространства осуществляется путем создания кластеризованных индексов в таблице или перестроения существующего кластеризованного индекса при помощи ALTER INDEX.
  • WITH <drop_clustered_constraint_option>
    Указывает, что установлен один или несколько параметров удаления кластеризованного ограничения.
  • MAXDOP = max_degree_of_parallelism
    Переопределяет параметр конфигурации максимальная степень параллелизма только на время операции. Дополнительные сведения см. в разделе Параметр max degree of parallelism.

    Для ограничения числа процессоров, применяемых при выполнении параллельных планов, используйте аргумент MAXDOP. Максимально допустимое количество — 64 процессора.

    Аргумент max_degree_of_parallelism может иметь одно из следующих значений.

    • 1
      Подавляет создание параллельных планов.
    • >1
      Ограничивает указанным значением максимальное число процессоров, используемых для параллельных операций с индексами.
    • 0 (по умолчанию)
      В зависимости от текущей рабочей нагрузки системы использует имеющиеся на настоящий момент или меньшее число процессоров.

    Дополнительные сведения см. в разделе Настройка параллельных индексных операций.

    ms190273.note(ru-ru,SQL.90).gifПримечание.
    Параллельные операции с индексами доступны только в выпуске SQL Server 2005 Enterprise Edition.
  • ONLINE = { ON | OFF }
    Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами. Значение по умолчанию — OFF.

    • ON
      Во время операций с индексами долгосрочные блокировки таблиц не поддерживаются. В течение основной фазы операции с индексами для исходной таблицы поддерживается только блокировка с намерением коллективного доступа (IS). Это обеспечивает продолжение выполнения запросов или обновлений для базовых таблиц и индексов. В начале операции совмещаемая блокировка (S) исходного объекта поддерживается в течение очень короткого времени. Если создается некластеризованный индекс, то в завершение операции на короткое время запрашивается блокировка типа S (совмещаемая) для источника. Блокировка типа SCH-M (модификация схемы) запрашивается, когда кластеризованный индекс создается или удаляется в интерактивном режиме и когда происходит перестроение кластеризованного или некластеризованного индекса. При создании индекса для временной локальной таблицы параметр ONLINE не может принимать значение ON.
    • OFF
      Блокировки таблиц применяются во время выполнения операций с индексами. Блокировку изменения схемы (Sch-M) в таблице получает автономная индексная операция, которая создает, перестраивает или удаляет кластеризованный индекс либо перестраивает или удаляет некластеризованный индекс. Это предотвращает доступ к базовой таблице всех пользователей во время операции. Автономная индексная операция, создающая некластеризованный индекс, получает коллективную блокировку (S) в таблице. Это запрещает поводить обновление базовой таблицы, но разрешает выполнять операции чтения, например инструкции SELECT.

    Дополнительные сведения см. в разделе Об оперативных действиях над индексом. Дополнительные сведения о блокировках см. в разделе Режимы блокировки.

    ms190273.note(ru-ru,SQL.90).gifПримечание.
    Фоновые операции с индексами доступны только в выпуске SQL Server 2005 Enterprise Edition.
  • MOVE TO ( partition_scheme_name ( column_name [ 1**,** ... n] ) | filegroup | "default"}
    Указывает месторасположение для текущего перемещения строк данных на конечный уровень кластеризованного индекса. Таблица перемещается на новое место.

    ms190273.note(ru-ru,SQL.90).gifПримечание.
    В данном контексте слово «default» не является ключевым. Это идентификатор файловой группы по умолчанию, который должен быть с разделителями, как в MOVE TO "default" или MOVE TO [default]. Если указывается параметр «default», то параметр QUOTED_IDENTIFIER для текущего сеанса должен иметь значение ON. Это установки по умолчанию. Дополнительные сведения см. в разделе SET QUOTED_IDENTIFIER (Transact-SQL).
  • { CHECK | NOCHECK } CONSTRAINT
    Указывает, включено или отключено ограничение constraint_name. Данный параметр может использоваться только с ограничениями FOREIGN KEY и CHECK. Если указан параметр NOCHECK, то ограничение отключено и будущие вставки или обновления столбца не проверяются относительно условий ограничений. Невозможно отключить ограничения DEFAULT, PRIMARY KEY и UNIQUE.
  • ALL
    Указывает, что все ограничения отключаются при помощи аргумента NOCHECK или включаются при помощи аргумента CHECK.
  • { ENABLE | DISABLE } TRIGGER
    Указывает, включен или отключен параметр trigger_name. Отключенный триггер остается определенным для таблицы; однако при выполнении инструкций INSERT, UPDATE или DELETE относительно таблицы действия в триггере не выполняются до тех пор, пока он не будет включен повторно.
  • ALL
    Указывает, что все триггеры в таблице включены или отключены.
  • trigger_name
    Указывает имя триггера, подлежащего включению или отключению.
  • SWITCH [ PARTITION source_partition_number_expression ] TO target_table [ PARTITION цель_ partition_number_expression ]
    Переключает блок данных одним из следующих способов:

    • Переназначает все табличные данные как секцию в уже существующей секционированной таблице.
    • Переключает секции из одной секционированной таблицы в другую.
    • Переназначает все данные одной секции секционированной таблицы в уже существующую несекционированную таблицу.

    Если таблица table является секционированной, то необходимо указать аргумент source_partition_number_expression. Если таблица target_table секционирована, то должен быть указан аргумент target_partition_number_expression. Если происходит переназначение данных таблицы как секции в уже существующую секционированную таблицу или переключение секции с одной секционированной таблицы на другую, то конечная секция уже должна существовать и быть пустой.

    Если происходит переназначение данных одной секции для формирования одиночной таблицы, то уже должна быть создана пустая целевая таблица. И исходная таблица или секция, и целевая таблица или секция должны располагаться в одной файловой группе. Соответствующие индексы или секции индексов также должны располагаться в одной и той же файловой группе. К переключаемым секциям применяются многие дополнительные ограничения. Дополнительные сведения см. в разделе Эффективная передача данных с использованием переключения секций. Значения table и target_table не могут быть одинаковыми. Параметр target_table может быть составным идентификатором.

    Аргументы source_partition_number_expression и target_partition_number_expression являются постоянными выражениями, которые могут ссылаться на переменные и функции. В их число входят переменные определяемого пользователем типа и пользовательские функции. Они не могут ссылаться на выражения языка Transact-SQL.

    ms190273.note(ru-ru,SQL.90).gifПримечание.
    Инструкцию SWITCH нельзя использовать в реплицируемых таблицах.

Замечания

Чтобы добавить новые строки данных, используйте INSERT. Чтобы удалить строки данных, используйте DELETE или TRUNCATE TABLE. Чтобы изменить значения в существующих строках, используйте UPDATE.

При наличии в кэше процедур каких-либо планов выполнения, ссылающихся на таблицу, инструкция ALTER TABLE помечает их как подлежащие перекомпиляции в их следующем выполнении.

Изменение размера столбца

Длину, точность и масштаб столбца можно изменить, указав новый размер для типа данных столбца в предложении ALTER COLUMN. Если в столбце имеются данные, новый размер не может быть меньше максимальной длины данных. Кроме того, столбец нельзя определять в индексе, если тип данных столбца не относится к varchar, nvarchar или varbinary, а индекс не является результатом ограничения PRIMARY KEY. См. пример Р.

Блокировки и инструкция ALTER TABLE

Изменения, указанные в инструкции ALTER TABLE, воплощаются немедленно. Если для изменений требуется модификация строк таблицы, то инструкция ALTER TABLE обновляет эти строки. Инструкция ALTER TABLE получает блокировку модификации схемы для таблицы, чтобы убедиться, что в процессе изменения другие подключения не ссылаются даже на метаданные таблицы, за исключением выполняющихся операций с индексами, требующих очень короткой блокировки SCH-M в конце. В операции ALTER TABLE…SWITCH запрашивается блокировка и исходной, и целевой таблиц. Изменения, сделанные в таблице, регистрируются в журнале и полностью обратимы. Изменения, затрагивающие все строки в очень больших таблицах, например удаление столбца или добавление столбца NOT NULL со значением по умолчанию, могут потребовать длительного времени и привести к формированию множества журнальных записей. Данные инструкции ALTER TABLE следует выполнять с той же осторожностью, что и любые инструкции INSERT, UPDATE или DELETE, влияющие на множество строк.

Выполнение параллельного плана

В выпуске SQL Server 2005 Enterprise Edition число процессоров, применяемых для выполнения одной инструкции ALTER TABLE ADD (на базе индекса) CONSTRAINT или DROP (кластеризованный индекс) CONSTRAINT, определяется с помощью параметра конфигурации максимальная степень параллелизма и текущей рабочей нагрузки. Если компонент Database Engine определяет, что система занята, то перед началом выполнения инструкции степень параллелизма операции автоматически понижается. Можно вручную настроить число процессоров, применяемых для запуска инструкции, указав параметр MAXDOP.

Секционированные таблицы

Помимо выполнения операций SWITCH, затрагивающих секционированные таблицы, инструкция ALTER TABLE может использоваться для изменения состояния столбцов, ограничений и триггеров секционированной таблицы точно так же, как она используется для несекционированных таблиц. Однако данная инструкция не может использоваться для изменения способа, которым секционируется сама таблица. Чтобы заново секционировать секционированную таблицу, используйте ALTER PARTITION SCHEME и ALTER PARTITION FUNCTION. Кроме того, невозможно изменить тип данных столбца секционированной таблицы.

Ограничения в таблицах с представлениями, привязанными к схемам

К инструкциям ALTER TABLE в таблицах с представлениями, привязанными к схемам, применяются те же ограничения, которые применяются в текущем времени для изменения таблиц с простым индексом. Добавление столбца разрешено. Однако удаление или изменение столбца, участвующего в любом из представлений, привязанных к схемам, не разрешается. Если инструкция ALTER TABLE требует изменения столбца, используемого в привязанном к схеме представлении, то происходит сбой инструкции ALTER TABLE, и компонент Database Engine выдает сообщение об ошибке. Дополнительные сведения о привязке схемы и индексированных представлениях см. в разделе CREATE VIEW (Transact-SQL).

Создание ссылающегося на таблицы представления, привязанного к схеме, не влияет на добавление или удаление триггеров в базовых таблицах.

Индексы и инструкция ALTER TABLE

При удалении ограничений индексы, создаваемые как часть ограничения, удаляются. Индексы, создаваемые при помощи инструкции CREATE INDEX, должны удаляться при помощи инструкции DROP INDEX. Инструкция ALTER INDEX может использоваться для перестроения индексной части определения ограничения; не следует удалять и вновь добавлять ограничение при помощи инструкции ALTER TABLE.

Перед удалением столбца необходимо удалить все индексы и ограничения, основанные на столбце.

После удаления ограничения, создавшего кластеризованный индекс, строки данных, хранившиеся на конечном уровне кластеризованного индекса, хранятся в некластеризованной таблице. В SQL Server 2005 существует возможность удаления кластеризованного индекса и перемещения результирующей таблицы в другую файловую группу или схему секций одиночной транзакцией при помощи параметра MOVE TO. Параметр MOVE TO обладает следующими ограничениями:

  • Параметр MOVE TO недопустим для индексированных представлений и некластеризованных индексов.
  • Схема секционирования или файловая группа уже должна существовать.
  • Если не указан аргумент MOVE TO, то таблица будет размещена в той же схеме секций или файловой группе, которая была определена для кластеризованного индекса.

При удалении кластеризованного индекса можно указать параметр ONLINE = ON, так что транзакция DROP INDEX не будет блокировать запросы к лежащим в основе данным и изменениям в них, а также в связанных с ними некластеризованных индексах.

Параметр ONLINE = ON имеет следующие ограничения:

  • Недопустимо использование параметра ONLINE = ON для кластеризованных индексов, которые также отключены. Отключенные индексы должны удаляться при помощи параметра ONLINE = OFF.
  • Только один индекс может удаляться единовременно.
  • Недопустимо использование параметра ONLINE = ON для индексированного представления, некластеризованных индексов или индексов в локальных временных таблицах.

Для удаления кластеризованного индекса временно требуется место на диске, равное размеру существующего кластеризованного индекса. Это дополнительное пространство освобождается сразу после завершения операции.

ms190273.note(ru-ru,SQL.90).gifПримечание.
Параметры, перечисленные в <drop_clustered_constraint_option>, применяются к кластеризованным индексам таблиц. Они не могут применяться к кластеризованным индексам представлений или к некластеризованным индексам.

Репликация изменений схемы

По умолчанию при выполнении команды ALTER TABLE для опубликованной таблицы в издателе SQL Server Publisher это изменение распространяется всем подписчикам SQL Server. Эта функция имеет некоторые ограничения и может быть отключена. Дополнительные сведения см. в разделе Внесение изменений схем в базы данных публикаций.

Разрешения

Требуется разрешение ALTER на таблицу.

Разрешения ALTER TABLE применяются к обеим таблицам, затронутым инструкцией ALTER TABLE SWITCH. Любые переключенные данные наследуют защиту конечной таблицы.

Если какой-либо из столбцов в инструкции ALTER TABLE является пользовательским типом для среды выполнения CLR или как псевдоним типа данных, то на этот тип требуется разрешение REFERENCES.

Примеры

А. Добавление нового столбца

Следующий пример показывает добавление столбца, который допускает значения NULL и не имеет значений, предоставленных через определение DEFAULT. В новом столбце в каждой строке будет NULL.

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

Б. Удаление столбца

В следующем примере для удаления столбца изменяется таблица.

CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO

В. Изменение типа данных столбца

Следующий пример меняет столбец таблицы с INT на 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

Г. Добавление столбца с ограничением

Следующий пример добавляет новый столбец с ограничением UNIQUE.

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

Д. Добавление непроверяемого ограничения CHECK к существующему столбцу

В следующем примере к существующему столбцу в таблице добавляется ограничение. Столбец имеет значение, нарушающее это ограничение. Поэтому во избежание проверки ограничения относительно существующих строк, а также, чтобы разрешить добавление ограничения, применяется WITH NOCHECK.

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

Е. Добавление ограничения DEFAULT к существующему столбцу

Следующий пример показывает создание таблицы с двумя столбцами и заполнение значениями первого столбца; в другом столбце остается NULL. В таком случае во второй столбец добавляется ограничение DEFAULT. Чтобы проверить применение значения по умолчанию, в первый столбец вставляется другое значение и создается запрос к таблице.

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

Ж. Добавление нескольких столбцов с ограничениями

Следующий пример показывает добавление нескольких столбцов с ограничениями, которые определяются с помощью нового столбца. Первый новый столбец имеет свойство IDENTITY. Каждая строка таблицы имеет новые значения с приращениями в столбце идентификаторов.

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

З. Добавление столбца, допускающего значения NULL, со значениями по умолчанию

Следующий пример показывает добавление столбца, способного содержать значения NULL, с определением DEFAULT и использование WITH VALUES для предоставления значений каждой строке таблицы. Если аргумент WITH VALUES не используется, то каждая строка в новом столбце имеет значение NULL.

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

И. Отключение и повторное включение ограничения

Следующий пример показывает отключение ограничения, служащее пределом указанной в данных зарплаты. NOCHECK CONSTRAINT используется с ALTER TABLE для отключения ограничения и разрешения вставки, которая обычно нарушает ограничение. CHECK 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) ;

К. Удаление ограничения

Следующий пример удаляет ограничение UNIQUE из таблицы.

CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO

Л. Переключение секций между таблицами

В следующем примере демонстрируется создание секционированной таблицы, исходя из предположения, что схема секционирования myRangePS1 уже создана в базе данных. Затем создается несекционированная таблица с такой же структурой, что и секционированная таблица, и в той же файловой группе, что и PARTITION 2 таблицы PartitionTable. Данные PARTITION 2 таблицы PartitionTable в таком случае переключаются в таблицу 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

М. Отключение и повторное включение триггера

Следующий пример показывает использование параметра DISABLE TRIGGER``ALTER TABLE для отключения триггера и допущения вставки, которая, как правило, нарушает триггер. Тогда ENABLE 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

Н. Создание ограничения PRIMARY KEY с параметрами индекса

Следующий пример показывает создание ограничения PRIMARY KEY PK_TransactionHistoryArchive_TransactionID и установку параметров FILLFACTOR, ONLINE и PAD_INDEX. Результирующий кластеризованный индекс будет иметь такое же имя, что и ограничение.

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

О. Удаление ограничения PRIMARY KEY в режиме ONLINE

В следующем примере удаляется ограничение PRIMARY KEY с параметром ONLINE, имеющим значение ON.

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

П. Добавление и удаление ограничения FOREIGN KEY

Следующий пример показывает создание таблицы ContactBackup, а затем ее изменение сначала добавлением ограничения FOREIGN KEY, ссылающегося на таблицу Contact, затем удалением ограничения FOREIGN KEY.

USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Contact (ContactID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

Р. Изменение размера столбца

В следующем примере выполняется увеличение размера столбца varchar, а также точности и масштаба столбца decimal. Поскольку столбцы содержат данные, их размер можно только увеличить. Также обратите внимание, что столбец col_a определяется в уникальном индексе. Размер столбца col_a можно увеличивать, поскольку он имеет тип данных varchar, а индекс не является результатом ограничения PRIMARY KEY.

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- 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');

См. также

Справочник

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

Другие ресурсы

Создание и изменение таблиц
Внесение изменений схем в базы данных публикаций

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

15 сентября 2007 г.

Изменения
  • Добавлен раздел «Изменение размера столбца» и пример Р.

12 декабря 2006 г.

Изменения
  • Разъяснено положение и значение предложения NOT FOR REPLICATION в разделах с описанием синтаксиса и аргументов.
  • Разъяснено, что целевая таблица предложения SWITCH может быть выражена составным идентификатором.

14 апреля 2006 г.

Добавления
  • Отмечено, что инструкцию SWITCH нельзя использовать в реплицируемых таблицах.

5 декабря 2005 г.

Добавления
  • Добавлено предложение DROP NOT FOR REPLICATION в диаграмму синтаксиса и список описаний аргументов.
Изменения
  • Предложение COLLATE перемещено в нужную позицию в диаграмме синтаксиса.
  • Исправлены примеры Л и М.