系统表[sysforeignkeys]记录了数据库的所有外键关系,查看数据库的外键约束可以通过此表获得,
例如:
use AdventureWorksDW
select const=object_name(constid)
,f_table=object_name(fkeyid)
,fcol=f.name
,r_table=object_name(rkeyid)
,rcol=r.name
,keyno
from sysforeignkeys left join syscolumns f on f.id=fkeyid and f.colid=fkey
left join syscolumns r on r.id=rkeyid and r.colid=rkey
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
顺手写了一个清除所有外键关系的存储过程:
create procedure DropDbFk
as
--备份
if object_id('__foreignkeys') is not null drop table __foreignkeys
use AdventureWorksDW
select const=object_name(constid)
,f_table=object_name(fkeyid)
,fcol=f.name
,r_table=object_name(rkeyid)
,rcol=r.name
,keyno
into __foreignkeys
from sysforeignkeys left join syscolumns f on f.id=fkeyid and f.colid=fkey
left join syscolumns r on r.id=rkeyid and r.colid=rkey
--删除整个数据库内全部表的外键约束
declare @fk_table sysname
,@fk_const_name sysname
,@sql varchar(1000)
declare fkConstDelete cursor for
select f_table,const from __foreignkeys order by const
open fkConstDelete
fetch next from fkConstDelete into @fk_table, @fk_const_name
while (@@fetch_status=0) begin
select @sql = 'Alter table '+@fk_table+' drop constraint '+@fk_const_name
if object_id(@fk_const_name) is not null exec(@sql)
fetch next from fkConstDelete into @fk_table,@fk_const_name
end
Close fkConstDelete
Deallocate fkConstDelete
go
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其实数据从 SQL 2005 回迁到 SQL2000,要解决外键约束可以有更简便的方法,就是在脚本中先把外键约束那一段关了,
等数据迁移好后,再运行之前禁闭了的那段约束脚本。
呵呵,第一次在技术论坛写BLOG,不当的地方还请朋友们多多指正。
转载自原文链接, 如需删除请联系管理员。
原文链接:查看、清除数据库中的外键约束,转载请注明来源!