SQL Server schemabinding

Este post es una traducción al castellano de este otro.

Cuando se utiliza la palabra clave SchemaBinding al crear una vista o función, lo que hace es vincular la estructura a las tablas o vistas subyacentes. ¿Qué significa? Significa que mientras un objeto exista como un objeto vinculado, está limitado en los cambios que se pueden realizar sobre él por las tablas o vistas que lo referencian. Si una tabla es referenciada por una función o vista vinculada, solo las columnas a las que hace referencia la función o la vista no se pueden modificar, el resto si.

Cuando tienes objetos vinculados en una base de datos:
  • No puedes cambiar la intercalación (collation) de la base de datos. 
  • No puedes usar SELECT * en las vistas vinculadas. 
  • No puedes ejecutar sp_refreshview en las vistas vinculadas. 
  • Puedes realizar cualquier cambio en la tabla origen que no afecte la estructura de las columnas enlazadas.
  • Puedes averiguar si un objeto está vinculado al esquema mirando la columna is_schema_bound en sys.sql_modules o la función del sistema OBJECTPROPERTY (object_id, ‘is_schema_bound’). 
  • Si haces referencia a una vista o función en una vista o función vinculada, entonces esa vista o función también debe estar vinculada.
  • Los objetos que están vinculados (tablas / vistas) no se pueden borrar mientras otro objeto los referencia.
  • Los objetos que están vinculados al esquema pueden cambiar su definición, pero los objetos a los que hacen referencia los objetos vinculados al esquema no pueden cambiar su definición. O sea, puedes cambiar la vista vinculada pero no los campos de las tablas de origen.

El enlace de esquema establece efectivamente que los metadatos que se crean en el momento de la creación del objeto pueden ser confiables en todo momento y no es necesario el uso de sp_refreshsqlmodule.

El enlace de esquema también puede aumentar significativamente el rendimiento de las funciones definidas por el usuario. 

Aún así schemabinding no es una herramienta de uso común, cada vez es más frecuente a raiz de las vistas indexadas, pero no exclusivamente. Se puede utilizar también para bloquear la estructura de una vista o función crítica pues, al incluir esta cláusula, se protege la vista o función de cambios inesperados en las tablas subyacentes

Comentarios