zoukankan      html  css  js  c++  java
  • Sql Server重命名所有外键约束

    公司服务器上的数据库原先是采用PowerDesigner设计的,那些外键约束的命名非常难看,并且也和后来在SSMS中额外添加的外键约束命名规则不一致,因此我想遍历数据库的所有外键约束,找到外键约束的相关对象,然后重新生成一致的命名。

    我采用的命名规则是:

    FK_ForeignTable_PrimaryTable_On_ForeignColumn

    直白的翻译就是,ForeignTable在ForeignColumn列上引用了PrimaryTable的主键。

    Sql Server提供了很多动态管理视图(Dynamic management views,DMV)和存储过程,方便我们对数据库进行维护。这里我用到了以下两个sys.foreign_key_columns(包含外键约束完整信 息)和sys.objects(数据库对象信息)这两个DMV以及sp_rename执行重命名的系统存储过程。代码如下:

    declare fkcur cursor for
    select
    OBJECT_NAME(col.constraint_object_id) as FKConstraintName
    ,fkTable.name as FKTable
    ,fkCol.name as FKColumn
    ,pkTable.name as PKTable
    ,pkCol.name as PKColumn
    from sys.foreign_key_columns col
    -- 外键约束是建立在外键表上的,
    -- 因此foreign_key_columns表中的parent_object_id和parent_column_id分别表示外键表和外键列
    inner join sys.objects fkTable
        on fkTable.object_id = col.parent_object_id
    inner join sys.columns fkCol
        on fkCol.column_id = col.parent_column_id
        and fkCol.object_id = fkTable.object_id
    -- foreign_key_columns表中的referenced_object_id和referenced_column_id分别指向
    -- 外键约束的主键表对象以及主键列
    inner join sys.objects pkTable
        on pkTable.object_id = col.referenced_object_id
    inner join sys.columns pkCol
        on pkCol.column_id = col.referenced_column_id
        and pkCol.object_id = pkTable.object_id
    order by OBJECT_NAME(col.constraint_object_id)
     
    open fkcur
    declare @constraintName nvarchar(128)
    declare @fkTable nvarchar(64)
    declare @fkColumn nvarchar(64)
    declare @pkTable nvarchar(64)
    declare @pkColumn nvarchar(64)
    declare @newConstraintName nvarchar(128)
     
    fetch next from fkcur
    into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
    while @@FETCH_STATUS = 0
    begin
        set @newConstraintName = 'FK_'+@fkTable+'_'+@pkTable+'_On_'+@fkColumn
        exec sp_rename @constraintName,@newConstraintName,'Object'
     
        fetch next from fkcur
        into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
    end
    close fkcur
    deallocate fkcur
  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/shihao/p/2231370.html
Copyright © 2011-2022 走看看