Como ya hemos visto en un post anterior:

https://firebird21.wordpress.com/2013/03/15/entendiendo-a-las-bases-de-datos/

hay dos clases de metadatos:

  • Metadatos del Firebird (los cuales siempre tienen el prefijo RDB$ o el prefijo MON$)
  • Metadatos del programador

En este artículo escribiré sobre los metadatos del programador porque los metadatos del Firebird son un asunto más avanzado y este artículo es para principiantes.

Todo lo que el programador hace dentro de una Base de Datos afecta a los metadatos de ella. El programador tiene la posibilidad de crear, modificar, o borrar metadatos. Los usuarios comunes no tienen esa posibilidad (o al menos no deberían tenerla porque sería un grave problema de seguridad).

Los metadatos que el programador define en una Base de Datos son totalmente independientes a los metadatos que define en otra Base de Datos, eso significa que cada Base de Datos tiene sus propios metadatos y ni se entera de lo que ocurre en las otras bases de datos.

¿Cuáles son los metadatos que el programador puede definir?

  • Dominios
  • Tablas
  • Restricciones
  • Índices
  • Vistas
  • Stored procedures
  • UDFs
  • Triggers
  • Excepciones
  • Generadores
  • Filtros BLOB
  • Roles
  • Triggers de la Base de Datos

Los dominios son tipos de datos propios del programador que puede usar además de los tipos de datos estándar (SMALLINT, INTEGER, DATE, CHAR, VARCHAR, etc.). La ventaja de definir dominios es que se puede acotar exactamente los valores que podrán tener las columnas que se hayan declarado con ese dominio. Por ejemplo, se podría tener un dominio que no acepte números negativos, otro dominio que solamente acepte números entre 1900 y 2020, otro dominio  que solamente acepte una “T” o una “F”, otro dominio solamente acepte hasta 20 caracteres, etc.

Las tablas son los almacenes donde los usuarios guardan sus datos. Están compuestas por filas y por columnas. El programador determina cuales serán las columnas que tendrá la tabla y los usuarios le van insertando filas. Dependiendo del tipo de una columna serán los datos que se podrán registrar en esa columna. Por ejemplo, si una columna es de tipo INTEGER en esa columna solamente se podrán guardar números enteros,  no será posible guardar palabras en esa columna, es imposible. Los tipos de la columna pueden ser estándar (o sea, los que siempre tiene el Firebird y por lo tanto todas las bases de datos) o dominios (o sea, los definidos por el propio programador según su necesidad).

Las restricciones son las limitaciones que tienen algunos datos, pueden ser:

  • Primary Key (clave primaria). Debe ser única y no puede contener NULL
  • Foreign Key (clave foránea). Relaciona una o más columnas de una tabla con una o más columnas de otra tabla
  • Check (verificación). Verifica que un dato cumpla con una (o más de una) condición
  • Unique (clave única). Debe ser única y no puede contener NULL

Cuando se crea una restricción el Firebird automáticamente crea también un índice y lo asocia con esa restricción.

Los índices son tablas auxiliares que el Firebird utiliza para:

    1. Mostrar a los datos ordenados según lo especificado en el índice
    2. Buscar un dato dentro de una tabla.

Por ejemplo, se podría usar un índice para mostrar los nombres de todos los productos, ordenados alfabeticamente. Y otro índice para buscar a la Factura número 12345.

Las vistas son consultas que se realizan frecuentemente, por eso se las guarda dentro de la Base de Datos ya que así las consultas serán mostradas más rapidamente.

Los stored procedures (procedimientos almacenados) son las instrucciones que el programador escribe para procesar los datos que los usuarios guardaron en las tablas. Los hay de dos tipos: ejecutables y seleccionables. Los ejecutables son equivalentes a los procedimientos, rutinas o funciones que tienen los lenguajes de programación. Los seleccionables son equivalentes a una tabla.

Las UDFs (User Defined Function = función definida por el usuario) son las funciones externas al Firebird y que se usan dentro de las bases de datos. Por ejemplo, podrías escribir una función en el lenguaje C que te halle la raíz cuadrada de un número. Esa función podrás luego incluirla dentro de tu Base de Datos y pasará a formar parte de ella, podrás llamarla a esa función cuando lo desees, todas las veces que quieras. Esta característica del Firebird lo hace muy poderoso porque permite que le agregues cientos o miles de funciones que hagan prácticamente cualquier cosa que necesites.

Los triggers (desencadenantes) son similares a los stored procedures en que contienen instrucciones para el procesamiento de los datos pero se diferencian en algo fundamental: los triggers son llamados automáticamente por el Firebird cada vez que los usuarios insertan o borran o modifican una fila. Son muy útiles para validar que los datos que se quieren guardar en una tabla sean todos datos válidos. Por ejemplo, podrías usar un trigger para evitar que se haga la cobranza antes de hacerse la venta. O para evitar que el precio de venta sea menor que el precio de costo, etc.

Las excepciones son los mensajes que el Servidor le envía al Cliente cuando detecta algún error. Por ejemplo podrías tener una excepción llamada E_FALTA_FECHA_VENTA que diga algo como “No puedo grabar esta venta porque falta la fecha de la venta”. Otra excepción podría llamarse E_FALTA_MONTO_VENTA y decir algo como “No puedo grabar esta venta porque falta el monto vendido”.

Los generadores, también llamados secuencias, son números cuyos valores los asigna automáticamente el Firebird, no los asigna ni el programador ni el usuario sino el Firebird. ¿Para qué se usan? para identificar a una fila y asegurarse que ninguna otra fila tenga ese mismo número. Por ejemplo, si una Primary Key es obtenida mediante un generador te asegurarás que: a) no tenga números repetidos y que b) no tenga valores nulos.

Los filtros BLOB son filtros para las columnas de tipo BLOB. ¿Y qué son las columnas de tipo BLOB? La sigla BLOB significa (Binary Large OBject = objeto binario de gran tamaño) y se la utiliza para  guardar archivos dentro de la Base de Datos, por ejemplo: fotografías, canciones, vídeos, etc. Por el momento no te preocupes por los filtros BLOB porque no son para principiantes, son algo bastante más avanzado.

Los roles son los derechos que se le asignan a un grupo de usuarios. La ventaja de usar roles es que con ellos se les puede asignar o revocar de una sola vez los derechos a todos los usuarios que pertenecen a ese rol. Por ejemplo, supongamos que Alicia, Graciela, Mirta, Raquel y Susana pertenecen al rol R_CONTABILIDAD y queremos que todas ellas tengan acceso a la vista V_BALANCE_GENERAL. En este caso al rol R_CONTABILIDAD le asignamos el derecho de acceso a V_BALANCE_GENERAL y ya está. Si no usáramos rol entonces tendríamos que hacer la misma asignación 5 veces, una vez para cada una de esas personas.

Los triggers de la Base de Datos son las instrucciones que el programador escribe para controlar cuando:

  • Alguien se conectó a la Base de Datos
  • Alguien se desconectó de la Base de Datos
  • Empezó una transacción
  • Una transacción terminó con un COMMIT
  • Una transacción terminó con un ROLLBACK

Resumiendo:

  • Todas las operaciones que el programador efectúa dentro de una Base de Datos modifican a los metadatos
  • El programador puede crear, borrar o modificar metadatos
  • Los metadatos que escribe un programador en una Base de Datos son totalmente independientes a los metadatos de todas las otras Bases de Datos
  • Los metadatos que los programadores pueden crear, borrar o modificar son los siguientes:
    • Dominios
    • Tablas
    • Restricciones
    • Índices
    • Vistas
    • Stored procedures
    • UDFs
    • Triggers
    • Excepciones
    • Generadores
    • Filtros BLOB
    • Roles
    • Triggers de la Base de Datos