Ich stimme Jonathan zu - solange die Funktion keine lokalen Daten basierend auf dem aufrufenden Datenbankkontext zurückgeben soll, stellen Sie die Funktion in eine Dienstprogrammdatenbank (hier füge ich auch Dinge wie Zahlen und Kalendertabellen, Aufteilungsfunktionen usw. Ein ):
USE UtilityDB;
GO
CREATE FUNCTION dbo.whatever() RETURNS ...
GO
Erstellen Sie jetzt in jeder Datenbank, die auf die Funktion zugreifen muss, einfach ein Synonym:
CREATE SYNONYM dbo.whatever() FOR UtilityDB.dbo.whatever();
Auf diese Weise kann jede Datenbank weiterhin mit einem einfachen zweiteiligen Namen auf die Funktion verweisen - und sie müssen nicht wissen oder sich darum kümmern, wo sie tatsächlich vorhanden ist. Und Sie müssen nur eine einzige Kopie der Funktion pflegen.
(Tatsächlich können Sie das Synonym in die model
Datenbank einfügen, sodass es automatisch in neuen Datenbanken erstellt wird.)
Der Grund, warum ich Benutzerobjekte master
nicht gerne einfüge - es sei denn, sie müssen wirklich global verfügbar und kontextbezogen für die aufrufende Datenbank sein, wie Ihre eigene angepasste Version von sp_spaceused
oder sp_helpindex
-, ist, dass Benutzer nicht nach Benutzerobjekten suchen master
und weniger dort auffindbar. Sie erschweren auch die Migration Ihrer Benutzerdatenbanken an einen anderen Ort, da Sie sich auch an die von Ihnen eingegebenen Benutzerdaten erinnern müssen master
. Wenn Sie absolut nicht in der msdb
Lage sind , eine Dienstprogrammdatenbank dafür zu erstellen oder zu verwenden, ist dies meiner Meinung nach eine praktischere Wahl für einen zentralen Standort.