Мне нужно удалить уникальные ограничения, которые я не знаю, имена - PullRequest
9 голосов
/ 09 июня 2010

Я поддерживаю продукт, установленный в нескольких местах, который был случайно обновлен.Уникальные ограничения были добавлены к ряду таблиц, но я понятия не имею, какие имена есть в каждом конкретном случае.Что я знаю, так это пары таблица / столбец с уникальными ограничениями, и я хотел бы написать скрипт для удаления любого уникального ограничения для этих комбинаций столбец / таблица.

Это SQL Server 2000 и более поздние версии.То, что работает в 2000/2005/2008, было бы лучше всего!

Ответы [ 3 ]

5 голосов
/ 09 июня 2010

Этот скрипт генерирует список ALTER TABLE..... DROP CONSTRAINT.... команд, которые затем можно скопировать + вставить и выполнить (или настроить перед выполнением по мере необходимости), чтобы удалить все уникальные ограничения / уникальные индексы:

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(so.parent_obj) + ' DROP CONSTRAINT ' + so.name
FROM sysobjects so
WHERE so.xtype = 'UQ'

Я надеюсь, что он должен работать на всех версиях SQL Server с 2000 по 2008 R2.

2 голосов
/ 12 июля 2013

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

Таблица была создана с уникальным ограничением на столбец, например:

CREATE TABLE table_name (
    id bigint identity not null,
    column_name varchar(255) not null,
    primary key(id),
    unique (column_name)
);

Некоторое время спустя обнаруживается, что это уникальное ограничение нежелательно.

INSERT INTO table_name(column_name) VALUES('col1');

приводит к: Нарушению ограничения UNIQUE KEY 'UQ__table_na__9FA0BA59160F4887'.Невозможно вставить дубликат ключа в объект 'dbo.table_name'.

Если у вас есть ручное управление этой БД и вы можете запускать SQL непосредственно на нем, просто выполните:

ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887;

В моемВ этом случае эти сценарии будут выполняться в разных средах, а ключи не будут иметь одинаковых имен, поэтому для снятия ограничения мне понадобится SQL, который принимает имя таблицы и столбца в качестве входных данных и вычисляет остальное.

DECLARE @table_name nvarchar(256)
DECLARE @col_name nvarchar(256)
DECLARE @Command  nvarchar(1000)

-- set your table and column name here:
SET @table_name = N'table_name'
SET @col_name = N'column_name'

SELECT @Command = 'ALTER TABLE ' + @table_name + ' DROP CONSTRAINT ' + d.name
    FROM sys.tables t
    JOIN sys.indexes d ON d.object_id = t.object_id  AND d.type=2 and d.is_unique=1
    JOIN sys.index_columns ic on d.index_id=ic.index_id and ic.object_id=t.object_id
    JOIN sys.columns c on ic.column_id = c.column_id  and c.object_id=t.object_id
    WHERE t.name = @table_name and c.name=@col_name

--if you want to preview the generated command before running
SELECT @Command

EXEC sp_executesql @Command;

Это удаляет уникальное ограничение на столбец и позволяет продолжить вставку.

0 голосов
/ 09 июня 2010

На этой странице есть быстрый и грязный способ извлечь все CONSTRAINT в базе данных, и оттуда вы можете создать динамический SQL для их отбрасывания:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,
SCHEMA_NAME(schema_id) AS SchemaName,
OBJECT_NAME(parent_object_id) AS TableName,
type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...