Câu trả lời của James hoạt động tốt nếu bạn biết tên của ràng buộc thực tế. Điều khó khăn là trong các trường hợp di sản thế giới thực và khác, bạn có thể không biết những gì ràng buộc được gọi.
Nếu đây là trường hợp bạn có nguy cơ tạo ra những hạn chế trùng lặp, để tránh bạn có thể sử dụng:
create function fnGetForeignKeyName
(
@ParentTableName nvarchar(255),
@ParentColumnName nvarchar(255),
@ReferencedTableName nvarchar(255),
@ReferencedColumnName nvarchar(255)
)
returns nvarchar(255)
as
begin
declare @name nvarchar(255)
select @name = fk.name from sys.foreign_key_columns fc
join sys.columns pc on pc.column_id = parent_column_id and parent_object_id = pc.object_id
join sys.columns rc on rc.column_id = referenced_column_id and referenced_object_id = rc.object_id
join sys.objects po on po.object_id = pc.object_id
join sys.objects ro on ro.object_id = rc.object_id
join sys.foreign_keys fk on fk.object_id = fc.constraint_object_id
where
po.object_id = object_id(@ParentTableName) and
ro.object_id = object_id(@ReferencedTableName) and
pc.name = @ParentColumnName and
rc.name = @ReferencedColumnName
return @name
end
go
declare @name nvarchar(255)
declare @sql nvarchar(4000)
-- hunt for the constraint name on 'Badges.BadgeReasonTypeId' table refs the 'BadgeReasonTypes.Id'
select @name = dbo.fnGetForeignKeyName('dbo.Badges', 'BadgeReasonTypeId', 'dbo.BadgeReasonTypes', 'Id')
-- if we find it, the name will not be null
if @name is not null
begin
set @sql = 'alter table Badges drop constraint ' + replace(@name,']', ']]')
exec (@sql)
end
Nguồn
2012-02-01 03:13:30
nếu bit tồn tại của tôi thực sự sau .. xin lỗi. tôi sẽ cập nhật câu hỏi của tôi để nó rõ ràng hơn! – solrevdev
Xin lỗi John đã bỏ lỡ bit đó, tôi sẽ cập nhật câu trả lời của tôi –
Nếu bạn đang sử dụng EF tạo ra các phím nước ngoài có dấu chấm trong tên bạn cần đặt dấu ngoặc ôm xung quanh các tên như [dbo]. [FK_dbo.MyTable_Etc] –