Как переименовать мои ограничения

Я переименовал таблицу в моей базе данных с помощью

EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny'

и все ограничения внешнего ключа были обновлены до нового имени таблицы, но они по-прежнему указаны на основе старого имени таблицы. Например, теперь у меня есть FK_tblOldAndBusted_tblTastyData​​strong > , но я бы хотел иметь FK_tblNewAndShiny_tblTastyData​​strong > .

Есть ли простой способ script этого?

Кроме того, я слишком анал? Я знаю, что база данных отлично работает со старым именем таблицы в ограничениях, но она похожа на сломанные окна.

Ответы

Ответ 1

Try:

exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object'

Кроме того, есть ошибка относительно переименования таких вещей, когда вы имеете дело с нестандартными schema.

Невозможно переименовать ограничение по умолчанию для таблицы в схеме, которая не является dbo по rsocol @Microsoft Connect

Ответ 2

Я не большой поклонник курсоров, и это можно написать гораздо проще.

DECLARE @SQLCmd varchar(MAX) = ''
SELECT 
    @SQLCmd += 'EXEC sp_rename ''' + dc.name + ''', ''DF' + 
                OBJECT_NAME( dc.parent_object_id ) + c.name + ''', ''OBJECT'';'
FROM 
    sys.default_constraints dc
    JOIN sys.columns c 
        ON c.object_id = dc.parent_object_id 
        AND c.column_id = dc.parent_column_id
WHERE 
    dc.name != 'DF' + object_name( dc.parent_object_id ) + c.name 
    AND OBJECT_NAME( dc.parent_object_id ) != 'dtproperties'
EXEC( @SqlCmd ) 

Ответ 3

Если кому-то интересно, мне просто пришлось переименовать все ограничения по умолчанию для поля аудита с именем "EnteredDate" на определенный шаблон. Обновляйте и заменяйте по мере необходимости. Надеюсь, это поможет и может стать отправной точкой.

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255)
DECLARE constraint_cursor CURSOR
    FOR 
        select b.name, c.name from 
        sys.all_columns a 
        inner join
        sys.tables b 
        on 
        a.object_id = b.object_id
        inner join
        sys.default_constraints c
        on a.default_object_id = c.object_id
        where 
            b.name <> 'sysdiagrams'
            and a.name = 'EnteredDate' -- column name
            and b.type = 'U'

OPEN constraint_cursor
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName

WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @SqlScript VARCHAR(255) = ''
        SET @SqlScript = 'sp_rename ' + @ConstraintName + ', ''DF_' + @TableName + '_EnteredDate'', ''object'''
        EXEC(@SqlScript)
        SELECT @TableName, @ConstraintName, 'DF_' + @TableName + '_EnteredDate', @SqlScript 
        FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName
    END 
CLOSE constraint_cursor;
DEALLOCATE constraint_cursor;

Ответ 4

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

Ответ 5

После некоторого дополнительного копания я обнаружил, что он должен быть в этой форме:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT'

Источник

Ответ 6

Пользователь user906573 script. Создайте script, чтобы переименовать все значения по умолчанию в базе данных. Полезно для исправления ограничений, которые не были явно указаны во время создания.

 --
-- Generates a script to rename defaults to the pattern DF_tablename_columnname
--

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255), @ColumnName varchar(255), @SchemaName varchar(255)
DECLARE constraint_cursor CURSOR
    FOR 
        select b.name, c.name, a.name, sc.name
        from sys.all_columns a 
        inner join sys.tables b on a.object_id = b.object_id
        join sys.schemas sc on b.schema_id = sc.schema_id
        inner join sys.default_constraints c on a.default_object_id = c.object_id
        where 
            b.name <> 'sysdiagrams'
            and b.type = 'U'

OPEN constraint_cursor
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName

WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @SqlScript VARCHAR(255) = ''
        SET @SqlScript = 'sp_rename ''' + @SchemaName + '.' + @ConstraintName + ''', ''' + @SchemaName + '.DF_' + @TableName + '_' + @ColumnName + ''', ''object''' + char(13) + char(10) + 'GO' + char(13) + char(10)
        --EXEC(@SqlScript)
        print @sqlscript
        FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName
    END 
CLOSE constraint_cursor;
DEALLOCATE constraint_cursor;

Ответ 7

Я знаю, что этот поток немного устарел, но я хотел опубликовать свою альтернативу ответу @foxfire, поскольку я внесли некоторые изменения в него. Сделал это, взяв меньший кусок имен, когда я столкнулся с базой данных, где было так много переименований, что это сделало @sql truncate. Я также добавил обработку ошибок, чтобы вырваться, а также имена схем для обработки разных схем, отличных от dbo. Я решил не использовать попытку начать, чтобы его можно было использовать в нескольких версиях сервера SQL. Предложение where может быть использовано для выполнения первоначального намерения OP.

BEGIN TRAN

DECLARE @sql varchar(MAX) = '...'

WHILE LEN(@sql) > 0 BEGIN
       SET @sql = '';

       SELECT TOP 50 @sql = @sql 
              + 'EXEC sp_rename N''' + SCHEMA_NAME(dc.[schema_id]) + '.' + dc.name 
              + ''', N''DF_' + OBJECT_NAME(dc.parent_object_id) + '_' + c.name 
              + ''', ''OBJECT'';' + CHAR(10)
       FROM sys.default_constraints dc
       inner join sys.columns c 
              ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id
       WHERE dc.name LIKE 'DF[_][_]%' -- rename any auto named defaults

       PRINT @sql
       EXEC(@sql)

       IF @@ERROR <> 0 BEGIN 
              IF @@TRANCOUNT > 0 ROLLBACK TRAN
              BREAK;
       END
END

IF @@TRANCOUNT > 0 COMMIT TRAN
--IF @@TRANCOUNT > 0 ROLLBACK TRAN