#sql-server
#sql-сервер
Вопрос:
Возможно ли и как изменить столбец с ограничением по умолчанию ?
Проблема: я хочу вызвать это изменение:
Например
ALTER TABLE MY_TABLE ALTER COLUMN MY_COLUMN nvarchar(1024); --(was varchar)
Но этот код создает исключение:
[S0001][5074] Строка 1: Объект «DF__МОЯ_ТАБЛИЦА __МОЙ_COL__2A563856» зависит от столбца «МОЙ СТОЛБЕЦ».
Я знаю, как искать это ограничение:
select c.name, col.name from sys.default_constraints c inner join sys.columns col on col.default_object_id = c.object_id inner join sys.objects o on o.object_id = c.parent_object_id inner join sys.schemas s on s.schema_id = o.schema_id where o.name = 'MY_TABLE' and col.name = 'MY_COLUMN'
и теперь я не только хочу снять ограничение, блокирующее выполнение вышеупомянутого изменения, но и воссоздать это ограничение.
У меня есть 100 таких столбцов, поэтому я хочу написать какую-нибудь процедуру или функцию и вызвать ее 100 раз в сценарии для каждой таблицы и команды отдельно.
Более того, некоторые столбцы будут иметь значения по умолчанию, такие как «или» -«, или вообще не будут иметь значения по умолчанию. Важно, чтобы после выполнения сценариев все ограничения были такими же, как и до выполнения, и ни одно из них не отсутствовало.
Комментарии:
1. В качестве примечания, когда вы воссоздаете свои
CONSTRAINT
имена, я настоятельно рекомендую дать им значимые имена.2. Как насчет других типов ограничений, таких как индексы и / или контрольные ограничения?
3. Просто запустите
ALTER TABLE dbo.MY_TABLE DROP CONSTRAINT DF__MY_TABLE __MY_COL__2A563856;
— затем ограничение будет снято, и вы сможете изменять свой столбец по своему усмотрению4. Рассмотрите возможность использования проектов баз данных/DACPAC для такого рода развертывания; тяжелая работа по сравнению, удалению и повторному написанию сценариев там уже выполнена (хотя я не могу гарантировать, что она охватывает этот конкретный случай, но я думаю, что это так). Без этого (или интерфейсной поддержки) вам нужно немного программирования, и я не думаю, что должен говорить вам, что T-SQL не является величайшим языком программирования в мире.
5. @michealAtmi вы не можете запустить DDL в функции SQL Server.