時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
數(shù)據(jù)庫(kù)原先是采用PowerDesigner設(shè)計(jì)的,Sql Server外鍵約束的命名非常難看,并且也和后來(lái)在SSMS中額外添加的Sql Server外鍵約束命名規(guī)則不一致,因此想遍歷數(shù)據(jù)庫(kù)的所有外鍵約束,找到外鍵約束的相關(guān)對(duì)象,然后重新生成一致的命名。
采用的命名規(guī)則是:
- FK_ForeignTable_PrimaryTable_On_ForeignColumn?
直白的翻譯就是,F(xiàn)oreignTable在ForeignColumn列上引用了PrimaryTable的主鍵。
Sql Server提供了很多動(dòng)態(tài)管理視圖(Dynamic management views,DMV)和存儲(chǔ)過程,方便我們對(duì)數(shù)據(jù)庫(kù)進(jìn)行維護(hù)。這里我用到了以下兩個(gè)sys.foreign_key_columns(包含外鍵約束完整信息)和sys.objects(數(shù)據(jù)庫(kù)對(duì)象信息)這兩個(gè)DMV以及sp_rename執(zhí)行重命名的系統(tǒng)存儲(chǔ)過程。代碼如下:
- 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分別指向 ?
- --?外鍵約束的主鍵表對(duì)象以及主鍵列 ?
- 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 ?
關(guān)鍵詞標(biāo)簽:Sql Server
相關(guān)閱讀
熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法