Отбрасывание безымянных ограничений - PullRequest
14 голосов
/ 22 марта 2009

Будучи новичком, я создал несколько внешних ключей без явного имени.

Тогда я основал сгенерированные SQL сумасшедшие имена, такие как FK__Machines__IdArt__760D22A7. Думаю, они будут генерироваться с разными именами на разных серверах.

Есть ли какая-нибудь приятная функция для удаления безымянных ограничений FK, передавая в качестве аргументов таблицы и рассматриваемые поля?

Ответы [ 3 ]

14 голосов
/ 06 июня 2011

Для удаления отдельного безымянного ограничения по умолчанию на столбец используйте следующий код:

DECLARE @ConstraintName VARCHAR(256)
SET @ConstraintName = (
     SELECT             obj.name
     FROM               sys.columns col 

     LEFT OUTER JOIN    sys.objects obj 
     ON                 obj.object_id = col.default_object_id 
     AND                obj.type = 'F' 

     WHERE              col.object_id = OBJECT_ID('TableName') 
     AND                obj.name IS NOT NULL
     AND                col.name = 'ColunmName'
)   

IF(@ConstraintName IS NOT NULL)
BEGIN
    EXEC ('ALTER TABLE [TableName] DROP CONSTRAINT ['+@ConstraintName+']')
END

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

obj.type = 'F'

до

obj.type = 'D'
5 голосов
/ 22 марта 2009

Для этого нет встроенной процедуры, но вы можете создать свою собственную, используя информацию в представлениях information_schema.

Пример таблицы

Create Proc dropFK(@TableName sysname)
as
Begin

Declare @FK sysname
Declare @SQL nvarchar(4000)
Declare crsFK cursor for

select tu.Constraint_Name from 
information_schema.constraint_table_usage TU
LEFT JOIN SYSOBJECTS SO 
ON TU.Constraint_NAME = SO.NAME
where xtype = 'F'
and Table_Name = @TableName
open crsFK
fetch next from crsFK into @FK
While (@@Fetch_Status = 0)
Begin
    Set @SQL = 'Alter table ' + @TableName + ' Drop Constraint ' + @FK
    Print 'Dropping ' + @FK
    exec sp_executesql  @SQL
    fetch next from crsFK into @FK
End
Close crsFK
Deallocate crsFK
End
1 голос
/ 31 марта 2015

Это позволит вам удалить конкретное ограничение внешнего ключа на основе имени таблицы + имени столбца

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

Вам нужен Constraint_Column_Usage, который в соответствии с документами Returns one row for each column in the current database that has a constraint defined on the column.

Я присоединился к sys.objects, чтобы просто получить внешние ключи.

В процедуре (это заимствует из других ответов. Ура, ребята!):

Create Proc yourSchema.dropFK(@SchemaName NVarChar(128), @TableName NVarChar(128), @ColumnName NVarChar(128))
as
Begin

    DECLARE @ConstraintName nvarchar(128)
    SET @ConstraintName = (
        select c.Constraint_Name
          from Information_Schema.Constraint_Column_usage c
          left join sys.objects o 
          on o.name = c.Constraint_Name
          where c.TABLE_SCHEMA = @SchemaName and 
                c.Table_name = @TableName and 
                c.Column_Name = @ColumnName and
                o.type = 'F'
    )   

    exec ('alter table [' + @SchemaName + '].[' + @TableName + '] drop constraint [' + @ConstraintName + ']')
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...