Tại sao tiền tố lược đồ (dbo) là bắt buộc khi chúng ta gọi một hàm?


9

Khi người dùng được ánh xạ với lược đồ mặc định (dbo) và chúng ta có thể chọn tất cả các bảng trong [dbo] mà không cần thêm tiền tố vào lược đồ.

Chúng ta có thể thực thi các thủ tục được lưu trữ mà không có tiền tố nếu nó nằm dưới lược đồ mặc định.

Cho rằng, tại sao chúng ta cần phải thêm tiền tố vào một hàm với lược đồ?

Cảm ơn!

Câu trả lời:


11

Vậy thì tại sao chúng ta có thể gọi hàm mà không có tiền tố (lược đồ), được tạo dưới dbo?

Từ Sách Tài liệu trực tuyến trên UDF

Các hàm có giá trị vô hướng có thể được gọi trong đó các biểu thức vô hướng được sử dụng. Điều này bao gồm các cột được tính toán và các định nghĩa ràng buộc CHECK. Các hàm có giá trị vô hướng cũng có thể được thực thi bằng cách sử dụng câu lệnh EXECUTE. Các hàm có giá trị vô hướng phải được gọi bằng cách sử dụng ít nhất tên hai phần của hàm .

Vì vậy, đây về cơ bản là một hạn chế do nhóm phát triển SQL Server đặt ra và tôi cho rằng nó hoàn toàn chính xác. Ngay cả khi nó được cho phép bằng cách nào đó (chỉ vì mục đích trò chuyện) tôi vẫn sẽ sử dụng tiền tố Schema.

Tôi luôn hỗ trợ sử dụng tên lược đồ ngay cả khi nó hoạt động mà không cần thêm nó. Đây là cách thực hành tốt nhất và tất cả các nhà phát triển "Tốt" đều sử dụng nó cho dù nó có dư bao nhiêu.

Một lý do khác mà tôi thấy là, Cơ sở dữ liệu cần một cái gì đó để phân biệt giữa chức năng hệ thống và chức năng do getdate ()người dùng xác định. Nếu bạn được phép gọi hàm mà không có tên lược đồ, thì công cụ cơ sở dữ liệu sẽ phân biệt giữa hàm do Người dùng tạo có tên Getdate hoặc hàm GETDATE () của hệ thống.


Vậy thì tại sao nó khác với SP. Như bạn đã nói có thể là để tránh va chạm đặt tên. Tôi vừa tạo SP "tạo thủ tục sp_help khi chọn getdate ()" trong cơ sở dữ liệu người dùng của tôi và khi tôi thực thi có hoặc không có lược đồ (dbo), SQL Server đề cập đến SP hệ thống. Tại sao nó không thực thi SP của tôi mà tôi đã tạo.
Rajesh Ranjan

1
@rajeshRaja trong chủ thì nó sẽ xử tử bạn. Bạn không bao giờ nên tạo Proc với tiền tố sp_ vì nó có vấn đề về hiệu năng.
Shanky

Tôi nghĩ Shanky đã trả lời trực tiếp câu hỏi "tại sao" khi anh ấy đề cập đến nó được đặt bởi nhóm phát triển SQL Server. Bạn có thể hỏi tại sao họ làm như vậy và tại sao hành vi của các chức năng không phù hợp với quy trình, nhưng câu trả lời có lẽ không quá quan trọng.
Michael J Swart

1
BTW, tác động hiệu suất của các thủ tục bắt đầu bằng "sp_" không thể đo lường được. Nó đã không phải là một vấn đề trong nhiều năm. Tiền tố sp vẫn có thể không phải là một ý tưởng tốt, nhưng hiệu suất không phải là lý do.
Michael J Swart

10

Câu trả lời khác giải thích rằng đây là một hạn chế nhưng không phải là lý do tại sao.

Yêu cầu không phải lúc nào cũng đúng. UDF vô hướng có thể được EXEC-ed và vẫn sử dụng độ phân giải ngầm ( ví dụ )

Tôi tưởng tượng điều này là để tránh va chạm đặt tên.

Nếu các hàm được phép tham chiếu mà không có lược đồ thì ai đó đã tạo ra hàm riêng của chúng được gọi là crypt_gen_randomvào năm 2000 hoặc 2005 sẽ gặp phải vấn đề nâng cấp lên phiên bản mới hơn vì đây đã trở thành tên của hàm được xây dựng trong năm 2008.

Không có sự mơ hồ với việc execsử dụng vì các hàm được tích hợp không thể được gọi như thế.


Vậy thì tại sao nó khác với SP. Như bạn đã nói có thể là để tránh va chạm đặt tên. Tôi vừa tạo SP "tạo thủ tục sp_help khi chọn getdate ()" trong cơ sở dữ liệu người dùng của tôi và khi tôi thực thi có hoặc không có lược đồ (dbo), SQL Server đề cập đến SP hệ thống. Tại sao nó không thực thi SP của tôi mà tôi đã tạo.
Rajesh Ranjan

3
@Rajesh. Các đối tượng bắt đầu sp_ được đặt đặc biệt để luôn tìm trong cơ sở dữ liệu chủ / tài nguyên. Và nó được ghi nhận rằng tiền tố này nên tránh. Không có quy ước như vậy để xây dựng trong các chức năng.
Martin Smith
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.