将键名重置为默认值?

Lle*_*ryd 0 foreign-key sql-server primary-key ssms sql-server-2008-r2

我正在处理一些在某些时候重命名的表/列,但主键/外键的名称仍然基于以前的名称。

在 SSMS 中,是否有任何(最好是自动的)方法可以将密钥的名称重置为新创建的默认名称?

Mar*_*ith 7

没有办法自动执行此操作,但您可以查询目录视图以查找不在所需模式中的约束名称,然后以这种方式生成所需的脚本。

就像是

DECLARE @Script NVARCHAR(MAX);

WITH FK
     AS (SELECT *,
                'FK_' + OBJECT_NAME(parent_object_id) + '_' + OBJECT_NAME(referenced_object_id)                  AS provisionalName,
                ROW_NUMBER() OVER (PARTITION BY parent_object_id, referenced_object_id ORDER BY create_date) - 1 AS RN
         FROM   sys.foreign_keys),
     Combined
     AS (SELECT name COLLATE DATABASE_DEFAULT        AS name,
                OBJECT_SCHEMA_NAME(parent_object_id) AS schemaName,
                provisionalName + CASE
                                    WHEN RN = 0 THEN ''
                                    ELSE CAST(RN AS VARCHAR)
                                  END                AS provisionalName
         FROM   FK
         UNION ALL
         SELECT name,
                OBJECT_SCHEMA_NAME(parent_object_id)       AS schemaName,
                type + '_' + OBJECT_NAME(parent_object_id) AS provisionalName
         FROM   sys.key_constraints)
SELECT @Script = x.rename.value('.', 'NVARCHAR(MAX)')
FROM   (SELECT 'exec sys.sp_rename ''' + QUOTENAME(schemaName) + '.' + QUOTENAME(name) + ''', ''' + provisionalName + ''';
'
        FROM   Combined
        WHERE  provisionalName <> name
        FOR XML PATH(''), TYPE) x(rename);

PRINT @Script;
--EXEC (@Script);
Run Code Online (Sandbox Code Playgroud)