Thay đổi cài đặt ANSI_NULLS trên bảng


7

Chúng tôi có thể sử dụng truy vấn sau để cập nhật tùy chọn ANSI_NULLS không.

sp_configure 'allow updates', 1

reconfigure with override

update sysobjects set status = status | 0x20000000 where name = 'tblClient'

Tôi không chắc nó đang làm gì. Tôi đã nhận được điều này sau khi tìm kiếm một giải pháp. Db của chúng tôi là máy chủ SQL 2008.

Nhưng trong khi tôi đang chạy thì tôi gặp một lỗi như thế này "Ad hoc updates to system catalogs are not allowed."

Hãy cho ý kiến ​​của bạn

Câu trả lời:


9

Cập nhật bảng hệ thống trực tiếp là không được hỗ trợ và không an toàn. Cấu trúc của chúng đã thay đổi từ năm 2000, do đó, mã bạn sẽ không hoạt động chống lại chúng.

Tuy nhiên, đôi khi có thể sử dụng ALTER TABLE ... SWITCHđể làm điều này như một siêu dữ liệu chỉ thay đổi.

Một ví dụ đầy đủ làm việc dưới đây.

/*Create table with option off*/ 
SET ANSI_NULLS OFF; 

CREATE TABLE dbo.YourTable (X INT) 

/*Add some data*/ 
INSERT INTO dbo.YourTable VALUES (1),(2),(3) 

/*Confirm the bit is set to 0*/ 
SELECT uses_ansi_nulls, * 
FROM   sys.tables 
WHERE  object_id = object_id('dbo.YourTable') 

GO 

BEGIN TRY 
    BEGIN TRANSACTION; 
    /*Create new table with identical structure but option on*/
    SET ANSI_NULLS ON; 
    CREATE TABLE dbo.YourTableNew (X INT) 

    /*Metadata only switch*/
    ALTER TABLE dbo.YourTable  SWITCH TO dbo.YourTableNew;

    DROP TABLE dbo.YourTable; 

    EXECUTE sp_rename N'dbo.YourTableNew', N'YourTable','OBJECT'; 

    /*Confirm the bit is set to 1*/ 
    SELECT uses_ansi_nulls, * 
    FROM   sys.tables 
    WHERE  object_id = object_id('dbo.YourTable') 

    /*Data still there!*/ 
    SELECT * 
    FROM dbo.YourTable

    COMMIT TRANSACTION; 
END TRY 

BEGIN CATCH 
    IF XACT_STATE() <> 0 
      ROLLBACK TRANSACTION; 

    PRINT ERROR_MESSAGE(); 
END CATCH; 

Tuy nhiên, một điều lưu ý là điều này không phải lúc nào cũng hoạt động. Thêm một ràng buộc kiểm tra với định nghĩa CHECK (X <> NULL)làm cho nó thất bại với

Câu lệnh ALTER TABLE SWITCH không thành công. Bảng 'YourTableNew' có ràng buộc kiểm tra mức cột 'CK_ YourTableNew _X__37A5467C' trên cột 'X' không thể tải được để xác thực ngữ nghĩa.

Điều này có ý nghĩa khi ngữ nghĩa của ràng buộc thay đổi với cài đặt.

Nếu bạn gặp phải điều này, bạn có thể xem xét tạm thời loại bỏ các ràng buộc có vấn đề, v.v. và thêm chúng trở lại sau khi chuyển đổi hoặc chỉ cắn viên đạn và tạo lại bảng theo cách thông thường hơn.


1
Cảm ơn bạn .. Nhưng sau đó những gì về dữ liệu trong bảng của bạn?
Mahesh KP

@mahesh - Vẫn còn đó. Hãy thử chạy SELECT * FROM dbo.YourTableở cuối mã demo. Các trang dữ liệu không thay đổi. Chỉ cần định nghĩa bảng được cập nhật.
Martin Smith

chúng tôi đã có khoảng 100 bảng, vì vậy chúng tôi phải làm điều này cho tất cả các bảng. Có tùy chọn nào để thực hiện đơn giản hơn như trong bất kỳ cấu hình một bước hoặc bất kỳ phương pháp nào để tự động hóa việc này không .. :)
Mahesh KP

@mahesh - Có lẽ bạn có thể tự động hóa nó bằng SMO để kịch bản CREATEcâu lệnh bảng hoặc TSQL tương tự như ở đây . Hãy chắc chắn rằng bạn có xử lý lỗi tốt!
Martin Smith

Tôi đang tạo bảng mới bằng cách sử dụng bảng script làm tùy chọn trong SSMS cho bảng cụ thể. Trong trường hợp đó, tên của các ràng buộc như khóa chính và khóa ngoại cần được thay đổi bằng tay. Có bất kỳ opton nào khác để thoát khỏi chỉnh sửa thủ công này không ..
Mahesh KP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.