Ответ 1
Try:
exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object'
Кроме того, есть ошибка относительно переименования таких вещей, когда вы имеете дело с нестандартными schema
.
Я переименовал таблицу в моей базе данных с помощью
EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny'
и все ограничения внешнего ключа были обновлены до нового имени таблицы, но они по-прежнему указаны на основе старого имени таблицы. Например, теперь у меня есть FK_tblOldAndBusted_tblTastyDatastrong > , но я бы хотел иметь FK_tblNewAndShiny_tblTastyDatastrong > .
Есть ли простой способ script этого?
Кроме того, я слишком анал? Я знаю, что база данных отлично работает со старым именем таблицы в ограничениях, но она похожа на сломанные окна.
Try:
exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object'
Кроме того, есть ошибка относительно переименования таких вещей, когда вы имеете дело с нестандартными schema
.
Я не большой поклонник курсоров, и это можно написать гораздо проще.
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 )
Если кому-то интересно, мне просто пришлось переименовать все ограничения по умолчанию для поля аудита с именем "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;
Если слишком много переименовать, как насчет экспорта в дамп, отредактируйте дамп в любом текстовом редакторе, чтобы заменить имя таблицы, а затем восстановить из дампа? Я имею в виду экспорт дампа только ограничений, не все.
После некоторого дополнительного копания я обнаружил, что он должен быть в этой форме:
EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT'
Пользователь 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;
Я знаю, что этот поток немного устарел, но я хотел опубликовать свою альтернативу ответу @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