Tôi đồng ý với Jonathan - miễn là chức năng này không phải trả về dữ liệu cục bộ dựa trên bối cảnh cơ sở dữ liệu gọi, đặt chức năng vào cơ sở dữ liệu tiện ích (đây cũng là nơi tôi đặt những thứ như số và bảng lịch, chức năng chia tách, v.v. ):
USE UtilityDB;
GO
CREATE FUNCTION dbo.whatever() RETURNS ...
GO
Bây giờ, trong mọi cơ sở dữ liệu cần truy cập hàm, chỉ cần tạo một từ đồng nghĩa:
CREATE SYNONYM dbo.whatever() FOR UtilityDB.dbo.whatever();
Bằng cách này, mỗi cơ sở dữ liệu vẫn có thể tham chiếu hàm bằng cách sử dụng tên 2 phần đơn giản - và họ không phải biết hoặc quan tâm nơi nó thực sự tồn tại. Và bạn chỉ phải duy trì một bản sao duy nhất của chức năng.
(Và trên thực tế, bạn có thể đặt từ đồng nghĩa vào model
cơ sở dữ liệu để nó được tạo tự động trong cơ sở dữ liệu mới.)
Lý do tôi không thích đưa các đối tượng người dùng vào master
- trừ khi chúng thực sự cần phải có sẵn trên toàn cầu và theo ngữ cảnh cho cơ sở dữ liệu cuộc gọi, như phiên bản tùy chỉnh của bạn sp_spaceused
hoặc sp_helpindex
- là mọi người không tìm kiếm đối tượng người dùng master
và chúng ít hơn khám phá ở đó. Chúng cũng làm cho việc di chuyển cơ sở dữ liệu người dùng của bạn ở nơi khác trở nên khó khăn hơn, bởi vì bạn cũng cần phải nhớ những thứ người dùng bạn đặt vào master
. Nếu bạn hoàn toàn không sẵn sàng chống lại việc tạo hoặc sử dụng cơ sở dữ liệu tiện ích cho việc này, tôi nghĩ msdb
là một lựa chọn thiết thực hơn cho một vị trí trung tâm.