2010-04-29 4 views
9

Tenemos una función escalar que devuelve un DateTime. Realiza un par de selecciones de tablas rápidas para obtener su valor de retorno. Esta función ya está en uso en toda la base de datos, en restricciones predeterminadas, procesos almacenados, etc. Me gustaría cambiar la implementación de la función (para eliminar los hits de la tabla y hacerla más eficiente) pero aparentemente no puedo hacer eso mientras es referenciado por otros objetos en la base de datos. ¿Debo actualizar o eliminar todos los objetos en la base de datos que lo hace referencia, actualizar la función y luego actualizar o volver a crear todos esos objetos para restaurar la referencia a la función?
La función está siendo referenciada por un puñado de vistas, activadores, un par de funciones y una gran cantidad de restricciones predeterminadas y procesos almacenados.SqlServer2008 - ¿Puedo modificar una función escalar mientras se hace referencia en muchos lugares?

Gracias por cualquier idea que pueda dar.

El error que estoy consiguiendo cuando intento ya sea Alter o la caída de la función es:

No se puede [ALTER | DROP FUNCTION] 'dbo.GetClientCurrentTime' porque está siendo referenciado por objeto 'DF_tbl_PatientOrder_Note_RecordCreated' .

+0

Si lo está utilizando en columnas derivadas, tendrá que soltar las columnas temporalmente. El uso en procs almacenados no debería necesitar ser revisado. No estoy seguro sobre el uso de restricciones predeterminadas. –

+0

* aparentemente no puedo hacer eso mientras otros objetos en la base de datos lo hacen referencia *: ¿qué error está recibiendo y cuándo? – egrunin

Respuesta

0

Depende. Si los objetos que hacen referencia a la función tienen la opción WITH SCHEMABINDING, se le impedirá explícitamente interferir con la función. De lo contrario, la única restricción es la restricción de bloqueo de acceso DDL común, lo que significa que los planes en ejecución que usan la función colocarán bloqueos de estabilidad de esquema en la función y esto bloqueará las instrucciones ALTER FUNCTION, ya que requieren bloqueo de modificación de esquema. Pero esto se resolvería solo cuando los planes finalicen la ejecución.

+0

He agregado el error al cuerpo de la pregunta. He buscado SCHEMABINDING en los documentos y no puedo encontrar la manera de determinar si está activado para un objeto o apagarlo para un objeto. ¿Esperaría que el mensaje de error indique que el problema está relacionado con SCHEMABINDING? ¿Conoces alguna forma de apagarlo? Gracias por su ayuda. –

+0

¿Qué es 'DF_tbl_PatientOrder_Note_RecordCreated'? Otra función, una columna derivada, una restricción de verificación? –

+0

DF_tbl_PatientOrder_Note_RecordCreated es una restricción predeterminada. La función solo está siendo referenciada por un puñado de vistas, activadores, un par de funciones y una gran cantidad de restricciones predeterminadas y procesos almacenados. –

-1

Si los parámetros de entrada y el tipo de salida no se modifican, debe poder realizar las modificaciones internas que necesite sin causar ningún problema.

+0

Eso es ciertamente lo que pensé. De hecho, debería ser capaz de hacer cambios también, con el resultado de que lo he roto. Pero simplemente para no poder cambiar una función, ¿punto? Eso parece una restricción bastante ridícula. Entonces me imagino que solo me falta un aro para saltar que me permita cambiar o soltar la función. –

+0

En realidad, mal. Si la función tiene 'WITH SCHEMABINDING' y algún objeto la referencia, no podrá ejecutar ANY alterar en ella ... –

Cuestiones relacionadas