La forma en que prefiero hacer esto: poner la función en una base de datos de utilidades y crear un sinónimo en cada base de datos regular. De esta manera obtienes lo mejor de ambos mundos:
- solo hay una copia del objeto para mantener
- el desarrollador no tiene que proporcionar nombres de tres o cuatro partes
p.ej
USE UtilityDB;
GO
CREATE FUNCTION dbo.LastIndexOf(...) ...
GO
USE otherDB;
GO
CREATE SYNONYM dbo.LastIndexOf FOR UtilityDB.dbo.LastIndexOf;
GO
Esto es especialmente poderoso para las funciones de CLR, ya que existe una sobrecarga administrativa adicional para cambiarlas / implementarlas.
Y esto es preferible a usar master (y marcar como un objeto del sistema, que no se garantiza que sea reenviable). Sin sys
embargo, me encantaría saber cómo su desarrollador espera crear su función en el esquema.
Entiendo que mantener múltiples copias de una función en 500 bases de datos no es realmente más difícil que mantener una sola copia, pero tener múltiples copias es realmente solo un beneficio cuando hay excepciones (por ejemplo, el cliente A quiere que su función maneje NULL de manera diferente, o algo). En cuyo caso, dejaría el sinónimo en todas las demás bases de datos e introduciría una versión especial de la función solo en esa base de datos.
(Esto supone que la función no depende de ningún acceso a datos dentro de la base de datos de un cliente, por supuesto, lo que ciertamente puede complicar las cosas).