2009-09-17 39 views

Trả lời

2

Tôi nghĩ bạn sẽ thấy rằng không có cách nào dễ dàng để giảm các ràng buộc trên một bảng trong SQL Server 2000. Điều đó nói rằng, có rất nhiều người đã viết kịch bản có thể xác định và xóa/vô hiệu/tạo lại khóa ngoài ràng buộc. Một ví dụ là tại http://www.mssqltips.com/tip.asp?tip=1376 - nhưng tôi chưa thử nghiệm trên SQL Server 2000.

EDIT: Dưới đây là một số khác example tạo tập lệnh thả/tạo cho bạn.

13

Nếu chỉ đơn giản là vô hiệu hóa hạn chế là một lựa chọn ở đây, bạn có thể sử dụng:

ALTER TABLE myTable NOCHECK CONSTRAINT all 

sau đó bạn có thể chuyển chúng trở lại chỉ đơn giản là sử dụng:

ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all 

Nếu bạn muốn vô hiệu hóa ép trong tất cả các bảng bạn có thể sử dụng:

-- disable all constraints 
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

-- enable all constraints 
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 

Thêm câu hỏi: Can foreign key constraints be temporarily disabled using TSQL?

Nhưng nếu bạn cần thả vĩnh viễn các ràng buộc, bạn có thể sử dụng this script posted on databasejurnal.com.

Chỉ cần sửa đổi nó một chút để chỉ thả các phím nước ngoài

create proc sp_drop_fk_constraints 
    @tablename sysname 
as 
-- credit to: douglas bass 

set nocount on 

declare @constname sysname, 
    @cmd  varchar(1024) 

declare curs_constraints cursor for 
    select name 
    from sysobjects 
    where xtype in ('F') 
    and (status & 64) = 0 
    and  parent_obj = object_id(@tablename) 

open curs_constraints 

fetch next from curs_constraints into @constname 
while (@@fetch_status = 0) 
begin 
    select @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @constname 
    exec(@cmd) 
    fetch next from curs_constraints into @constname 
end 

close curs_constraints 
deallocate curs_constraints 

return 0 
5

Ở đây bạn đi: (không kiểm tra trên SQL2000, nhưng nên ok)

Tạo 'vô hiệu hóa':

SELECT 'IF EXISTS (SELECT * FROM sys.foreign_keys 
    WHERE object_id = OBJECT_ID(N''[dbo].' + FK +''') 
    AND parent_object_id = OBJECT_ID(N''[dbo].' + PT + ''')) 
    ALTER TABLE ' + PT + ' NOCHECK CONSTRAINT ' + FK + ';' 
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK, 
    OBJECT_NAME(parent_object_id) as PT 
    FROM [sys].[foreign_key_columns]) T 
ORDER BY FK 

Tạo 'bật':

SELECT 'ALTER TABLE ' + PT + ' WITH CHECK CHECK CONSTRAINT ' + FK + ';' 
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK, 
    OBJECT_NAME(parent_object_id) as PT 
    FROM [sys].[foreign_key_columns]) T 
ORDER BY FK 

Cập nhật: Rất tiếc, tôi nghĩ bạn muốn nó cho tất cả các bảng :) Bạn chỉ có thể sửa đổi ở trên cho bảng duy nhất của mình.

+1

Các bảng hệ thống khác nhau nhưng được đặt tên tương tự trong SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx – Emyr

Các vấn đề liên quan