2011-08-27 29 views
7

Tài liệu SQL Server here nói rằng trường table_schema của information_schema.tables là "không đáng tin cậy" và cách chính xác để lấy lược đồ của đối tượng là truy vấn sys.objects.thông tin lược đồ information_schema không đáng tin cậy trên SQL Server?

Mọi người có thể xây dựng trên cáchkhi lược đồ được báo cáo bởi information_schema.tables có thể không chính xác?

+0

Nhìn vào kết quả của 'EXEC sp_helptext 'INFORMATION_SCHEMA.TABLES'' này ** không ** sử dụng 'sys.objects' có vẻ kỳ quặc. –

+0

Trong SQL Server 2000 kỹ thuật cột này báo cáo chủ sở hữu của đối tượng, không phải lược đồ của nó, mặc dù vào năm 2000 khái niệm đó có thể hoán đổi cho nhau. Trừ khi khả năng di chuyển chéo RDBMS là ưu tiên hàng đầu, tôi khuyên bạn nên sử dụng chế độ xem danh mục 'sys' cho siêu dữ liệu thay vì' INFORMATION_SCHEMA' chủ yếu vì trước đây sẽ được mở rộng cho các tính năng mới nhưng sau này sẽ tương đối trì trệ. (Ví dụ: hãy thử tìm hiểu về các chỉ mục được lọc bằng cách sử dụng 'INFORMATION_SCHEMA'.) –

+0

@Martin bạn có nhận thấy nó thực hiện' LEFT JOIN' không? Dường như với tôi mà chỉ ra có một số kịch bản mà lược đồ có thể không hợp lệ (không thể hình dung ra khỏi đỉnh đầu của tôi). Nhưng thông điệp cảnh báo (ngữ pháp không chính xác và tất cả) có ý nghĩa rất ít, bởi vì nó có nghĩa là hàng trong 'sys.schemas' mà' sys.objects' trỏ đến cũng không hợp lệ, vậy làm thế nào để sử dụng 'sys.objects' (hoặc 'sys.tables' thích hợp hơn) cung cấp cho bạn bất cứ điều gì đáng tin cậy hơn' INFORMATION_SCHEMA'? –

Trả lời

11

Đó là một sự xấu hổ này đã không được trả lời và chỉ cần nhận xét như vậy một phần ra khỏi tham lam và quan trọng hơn để có được nó ra khỏi hàng đợi chưa được trả lời, tôi sẽ ném một vài điểm vào một câu trả lời.

  1. Từ ngữ trong tài liệu không chính xác và đang được sửa chữa (xem Connect #686118). Tôi không chắc liệu họ có sửa chữa tài liệu R2 năm 2005, 2008 và 2008 cùng một lúc hay không hoặc liệu các phiên bản cũ hơn có được cập nhật hay không. Vấn đề là tôi không thể hình dung một trường hợp mà lược đồ trong một trong hai khung nhìn là không chính xác, nhưng thậm chí nhiều hơn như vậy, thông tin đó là không chính xác trong khi sys.objects là chính xác. Cái sau là không thể - khung nhìn info_schema được dựa hoàn toàn trên khung nhìn sys.objects (chỉ cần nhìn vào SELECT OBJECT_DEFINITION (OBJECT_ID ('INFORMATION_SCHEMA.TABLES'));), vì vậy nếu một cái không chính xác, chúng đều không chính xác. Có thể có những trường hợp không rõ ràng mà cả hai có thể không chính xác, nhưng không có trong phiên bản hiện tại (ví dụ, trong SQL Server 2000, với tùy chọn cấu hình allow updates được kích hoạt, xóa từ sysusers một người dùng sở hữu một đối tượng - không thực sự có liên quan hoặc có thể ngày hôm nay, và không phải thứ tôi sẵn sàng thử, nhưng đó là điều duy nhất tôi có thể tưởng tượng có thể thúc đẩy từ ngữ hiện tại vào bất kỳ thời điểm nào).

  2. Nói chung, không nên xem INFORMATION_SCHEMA lượt xem theo hướng xem danh mục được giới thiệu trong SQL Server 2005 (và được tăng cường kể từ đó). Tại sao? Bởi vì các khung nhìn danh mục tiếp tục được phát triển khi các tính năng mới được thêm vào SQL Server, trong khi các khung nhìn info_schema thì không. Như tôi đã đề cập trong bình luận của mình, hãy thử tìm thông tin về các chỉ mục được lọc trong info_schema. Tương tự, các cột được bao gồm, các chỉ mục XML, các cột nhận dạng/tính toán, các khóa ngoại trừ các chỉ mục duy nhất - tất cả đều bị thiếu hoàn toàn hoặc được biểu diễn khác nhau trong khung nhìn info_schema. Trong Denali, họ đã thêm một khung nhìn info_schema cho Sequences nhưng lại đáp ứng tối thiểu tiêu chuẩn và không bao gồm bất kỳ thông tin nào về các chi tiết thực hiện cụ thể của SQL Server (ví dụ, cho dù nó cạn kiệt hay không) trong tương lai bạn có thể chắc chắn khung nhìn info_schema sẽ không được giữ trong vòng lặp). Trường hợp duy nhất bạn quan tâm đến quan điểm info_schema là nếu (a) bạn đang viết các siêu dữ liệu cần phải làm việc trên các nền tảng tuân thủ info_schema AND (b) bạn không sử dụng bất kỳ tính năng cụ thể nền tảng nào sẽ bị bỏ qua. Ngoài các công cụ nhà cung cấp đa nền tảng, đây có thể là một trường hợp khá hiếm (và thậm chí trong trường hợp đó có thể dẫn đến các khách hàng không hài lòng, sử dụng các tính năng đó và công cụ không chọn chúng).

  3. Tôi đã gửi đề xuất Kết nối riêng lẻ (Connect #686121) rằng họ nêu rõ cảnh báo về sự không hoàn chỉnh này trên tất cả các chủ đề xem INFORMATION_SCHEMA xem sách trực tuyến. Tôi không nghĩ rằng chúng ta biết rõ rằng chúng là không phải là cách ưu tiên để lấy siêu dữ liệu ra khỏi SQL Server và ai có thể đổ lỗi cho những người không thấy điều này - sau khi tất cả, chúng tôi luôn nói rằng sử dụng các phương pháp tuân thủ tiêu chuẩn là một "thực hành tốt nhất" và sử dụng các phương thức độc quyền là ngược lại. Như với rất nhiều thứ cơ sở dữ liệu, "nó phụ thuộc" - nhưng tôi nghi ngờ, thường xuyên hơn không, bạn nên sử dụng chế độ xem danh mục sys trừ khi bạn đang ở trong trường hợp hiếm hoi đó, bạn chỉ sử dụng các tính năng trong SQL Máy chủ chung với tiêu chuẩn.Tôi không nghĩ rằng tôi đã đi qua một trường hợp duy nhất trong bất kỳ khả năng mà đây là trường hợp, nhưng tôi hạnh phúc hơn để tìm hiểu về họ nếu họ tồn tại.

EDIT Tôi cũng đã viết blog về không đáng tin cậy của INFORMATION_SCHEMA đây:

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx

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