Bạn có thể thay đổi trường và làm cho trường đó không rỗng mà không kiểm tra trường. Nếu bạn thực sự lo lắng về việc không làm nó ra khỏi giờ, bạn có thể thêm một ràng buộc vào lĩnh vực mà kiểm tra để đảm bảo nó không phải là null để thay thế. Điều này sẽ cho phép bạn sử dụng tùy chọn không có kiểm tra và không kiểm tra từng hàng trong số 4 triệu hàng để xem liệu nó có cập nhật hay không.
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
Thực sự bạn có hai lựa chọn (thêm một phần ba thấy chỉnh sửa):
- Sử dụng các hạn chế đó sẽ ngăn chặn bất kỳ hàng mới được cập nhật và để lại những bản gốc không thay đổi gì.
- Cập nhật các hàng không có gì khác và sau đó áp dụng tùy chọn không thay đổi null. Điều này thực sự nên được chạy trong giờ tắt, trừ khi bạn không nhớ các quá trình đang bị khóa khỏi bảng.
Tùy thuộc vào tình huống cụ thể của bạn, tùy chọn có thể tốt hơn cho bạn. Tôi sẽ không chọn tùy chọn bởi vì bạn phải chạy nó trong giờ tắt. Về lâu dài, thời gian bạn dành cho việc cập nhật vào giữa đêm sẽ được chi tiêu tốt so với những cơn đau đầu bạn có thể phải đối mặt bằng cách cắt ngắn để tiết kiệm một vài giờ.
Tất cả điều này được nói, nếu bạn định sử dụng tùy chọn hai, bạn có thể giảm thiểu số lượng công việc bạn làm trong giờ làm việc. Vì bạn phải chắc chắn rằng bạn cập nhật các hàng không null trước khi thay đổi cột, bạn có thể viết một con trỏ đến chậm (so với làm việc đó tất cả cùng một lúc)
- Đi qua mỗi hàng
- Kiểm tra xem nếu nó là null
- Cập nhật nó một cách thích hợp. Quá trình này sẽ mất nhiều thời gian, nhưng nó sẽ không khóa toàn bộ các khối chương trình khác truy cập vào nó. (Đừng quên gợi ý with(rowlock) bảng!)
EDIT: Tôi chỉ nghĩ đến một lựa chọn thứ ba: Bạn có thể tạo một bảng mới với các cột thích hợp, và sau đó xuất dữ liệu từ bảng gốc cái mới. Khi điều này được thực hiện, sau đó bạn có thể thả bảng gốc và thay đổi tên của cái mới thành cái cũ. Để làm điều này, bạn sẽ phải vô hiệu hóa các phụ thuộc trên bản gốc và thiết lập chúng trở lại trên một cái mới khi bạn đã làm xong, nhưng quá trình này sẽ làm giảm đáng kể số lượng công việc bạn phải làm trong những giờ nghỉ. Đây là cách tiếp cận tương tự mà máy chủ sql sử dụng khi bạn thực hiện thay đổi thứ tự cột cho bảng thông qua studio quản lý. Đối với phương pháp này, tôi sẽ thực hiện việc chèn vào các khối để đảm bảo rằng bạn không gây ra sự căng thẳng hoàn toàn trên hệ thống và ngăn người khác truy cập vào nó. Sau đó, vào giờ tắt, bạn có thể thả bản gốc, đổi tên phần thứ hai, và áp dụng các phụ thuộc, vv Bạn vẫn sẽ có một số giờ làm việc, nhưng nó sẽ nhỏ hơn so với cách tiếp cận khác.
Liên kết đến sử dụng sp_rename.
Cá nhân tôi sẽ không bao giờ làm cho một sự thay đổi cấu trúc bảng trong một bảng lớn hiện bất cứ lúc nào, trừ giờ cao điểm.Ngay cả khi nó là khá nhanh, nó có thể gây ra người dùng trong quá trình làm những việc ở momment bạn thực hiện thay đổi để có vấn đề. Mọi thay đổi lớn đều được thực hiện tốt nhất ở chế độ người dùng đơn. Tốt hơn hết là có thời gian bảo trì theo lịch trình bị bôi đen khi người dùng không thể làm bất cứ điều gì (được thông báo trước và trong giờ cao điểm), hơn là có những người dùng không hài lòng đang làm việc gì đó đang gặp lỗi. – HLGEM
Cột bạn đang thay đổi có liên quan đến các ràng buộc FK không? – onupdatecascade
Từ một bài kiểm tra nhanh trong profiler, nó có một khóa 'Sch-M' trên bảng [về cơ bản là không tương thích với mọi thứ] (http://msdn.microsoft.com/en-us/library/ms186396.aspx). Sau đó nó phải đọc mọi trang để xác định rằng tất cả các hàng xác nhận. –