2011-10-05 29 views
28

Tôi đang cố gắng tạo các kịch bản nâng cấp và sao lưu trong SQL. Các kịch bản nâng cấp bổ sung thêm một cột như vậy:Tại sao SQL Server tiếp tục tạo ra ràng buộc DF?

IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL DEFAULT(0) 

kịch bản backout loại bỏ các cột như sau:

IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName' 
    AND object_id = OBJECT_ID(N'[dbo].[TableName]')) 

ALTER TABLE TableName 
    DROP COLUMN ColumnName 

Tuy nhiên, kịch bản backout ném lỗi này:

Msg 5074, Level 16, State 1, Line 5 
    The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'. 
Msg 4922, Level 16, State 9, Line 5 
    ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column. 

tôi biết làm thế nào để thả ràng buộc, nhưng tên của ràng buộc thay đổi mọi lúc (hậu tố thay đổi). Tôi hoặc cần SQL Server để ngăn chặn việc tạo ra ràng buộc được đặt tên ngẫu nhiên này hoặc tôi cần để có thể loại bỏ ràng buộc trong kịch bản của tôi bằng cách sử dụng ký tự đại diện thẻ, vì tên thay đổi.

Trả lời

58

Đây là giới hạn default được thêm do DEFAULT(0) trong cột mới được thêm của bạn.

Bạn có thể tự đặt tên cho chính mình để có tên cố định đã biết thay vì dựa vào việc tạo tên tự động.

ALTER TABLE TableName 
    ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0) 

Sau đó, để loại bỏ các cột và hạn chế cùng

ALTER TABLE dbo.TableName 
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName 
+2

+1 nó thường được khuyến khích để đặt tên một cách rõ ràng những hạn chế. –

+0

Cảm ơn Martin. Ngoài ra, để kiểm tra đúng nếu ràng buộc tồn tại (trước khi thả nó), tôi đã sử dụng phương pháp được mô tả ** [ở đây] (http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- tồn tại-in-sql-server/6839547 # 6839547) ** – WEFX

+0

@ ÁlvaroG.Vicario - vâng. Câu trả lời của Martin cho bạn một ví dụ. –

0

Run này:

declare @name as nvarchar(255); 
SELECT @name = name FROM dbo.sysobjects 
WHERE name like 'DF__XXX__YYY__%' and type = 'D' 

IF @name is not null BEGIN 
    EXEC('ALTER TABLE XXX] DROP CONSTRAINT ' + @name); 
END 
Các vấn đề liên quan