Listando las funciones externas

Deja un comentario

Como recordarás, Firebird nos permite usar funciones externas en nuestras bases de datos. Una función externa no está incluida en la instalación del Firebird sino que la agregamos después y a cada Base de Datos que la necesite utilizar. Eso significa que cada una de nuestras bases de datos puede tener cero, una, o varias funciones externas.

Si queremos saber cuales son las funciones externas que hemos registrado en una Base de Datos, podemos usar nuestro administrador gráfico para ello:

externa01

Captura 1. Si haces clic en la imagen la verás más grande

o podemos escribir un SELECT que nos de esa información:

Listado 1.

SELECT
   *
FROM
   RDB$FUNCTIONS
WHERE
   RDB$SYSTEM_FLAG = 0

Donde obtendremos un resultado similar al siguiente:

externa02

Captura 2. Si haces clic en la imagen la verás más grande

  • RDB$FUNCTION_NAME. Es el nombre con el cual se conoce a esta función dentro de nuestra Base de Datos
  • RDB$FUNCTION_TYPE. Tipo de la función, no está siendo usado y por eso siempre es Null
  • RDB$QUERY_NAME. Nombre de la consulta, no está siendo usada y por eso siempre es Null
  • RDB$DESCRIPTION. Comentarios que podemos escribir para describir lo que hace la función
  • RDB$MODULE_NAME. El nombre que tiene el archivo .DLL o el objeto compartido, en el disco duro u otro dispositivo de almacenamiento
  • RDB$ENTRYPOINT. El nombre que tiene la función externa en el archivo .DLL o en el objeto compartido. No siempre es igual a RDB$FUNCTION_NAME
  • RDB$RETURN_ARGUMENT. El número de posición del argumento que se devuelve, en la lista de argumentos de entrada
  • RDB$SYSTEM_FLAG. Una bandera que indica si la función fue definida internamente o externamente. 0=definida externamente, 1=definida internamente

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

 

 

Modificando los metadatos

Deja un comentario

En Firebird toda la estructura de cada Base de Datos se guarda en tablas internas cuyo nombre genérico es “metadatos”.

Los nombres de esas tablas y de todas sus columnas empiezan siempre con las letras MON$ o RDB$

En general no deberías cambiar los metadatos, ya que el menor error que cometas podría dejar a tu Base de Datos corrupta e inservible. Así que el riesgo que corres es muy grande.

Sin embargo, una vez que ya eres un desarrollador experimentado y entiendes bien lo que haces y estás seguro de no equivocarte entonces sí podrías modificar a los metadatos.

El manejo de una tabla MON$ o RDB$ es igual al manejo de cualquier otra tabla de Firebird, no hay diferencias. Puedes insertar, actualizar, borrar, consultar, de la misma manera a como lo harías con una tabla normal.

Aunque claro que los riesgos son muy distintos. Si te equivocas con una tabla normal solamente podrías tener datos erróneos aunque tu Base de Datos continuará funcionando sin problemas. En cambio si te equivocas al modificar los metadatos podrías terminar con una Base de Datos totalmente inservible.

Ejemplo

En nuestra Base de Datos tenemos una tabla llamada CLIENTES a la cual le queremos agregar comentarios en la descripción de las columnas.

METADATOS1

Captura 1. Si haces clic en la imagen la verás más grande

Como puedes ver, en la columna “Description” solamente algunas columnas de la tabla CLIENTES tienen su correspondiente descripción, la mayoría de las columnas no tienen descripción. ¿Y cómo haríamos para agregarles descripciones a las columnas que no tienen? Lo mejor y más correcto es hacerlo con un programa tal como el EMS SQL Manager, pero cuando eso no es posible también puedes hacerlo modificando los “metadatos” manualmente aunque por supuesto eso no es lo recomendable, por los motivos que ya hemos visto en los párrafos anteriores.

Si queremos hacerlo de la forma no recomendable a continuación veremos como. Las estructuras de todas las tablas de la Base de Datos se guardan en una tabla interna (o sea: un metadato) llamada RDB$RELATION_FIELDS. Entonces, lo que hacemos es actualizar la tabla y la columna que nos interesan.

UPDATE
   RDB$RELATION_FIELDS
SET
   RDB$DESCRIPTION = 'Aquí va la descripción de la columna de sucursales'
WHERE
   RDB$RELATION_NAME = 'CLIENTES' AND
   RDB$FIELD_NAME = 'CLI_CODSUC'

Lo que hicimos fue cambiar el contenido de la columna RDB$DESCRIPTION de la tabla RDB$RELATION_FIELDS. La tabla que cambiamos fue CLIENTES y la columna que cambiamos fue CLI_CODSUC.

METADATOS2

Captura 2. Si haces clic en la imagen la verás más grande

Como puedes ver en la Captura 2 se ha cambiado la descripción de la columna CLI_CODSUC tal y como lo habíamos querido.

Conclusión

Hacer un SELECT a los metadatos no te causara problemas, puedes escribir todos los SELECTs que quieras. Pero hacer un INSERT, un UPDATE o un DELETE ya es otra historia, allí sí podrías “meter la pata” y meterla muy grande, dejando a tu Base de Datos inservible. Por lo tanto, el sentido común te dice que no toques los metadatos salvo en el caso de que sepas muy bien lo que estás haciendo.

Este ejemplo mostró como cambiar un metadato. Como ves, es muy simple, muy sencillo, es lo mismo que harías con una tabla normal, no hay diferencias en eso. La diferencia sería en las consecuencias si haces algo mal.

Artículo relacionado:

El índice del blog Firebird21

Buscando las tablas en las cuales se encuentra una columna

2 comentarios

A veces podemos necesitar conocer los nombres de todas las tablas en las cuales existe una determinada columna. Por ejemplo: todas las tablas que tienen una columna llamada PAR_IDENTI.

Esta consulta nos dará la respuesta:

Listado 1.

SELECT
   RDB$FIELD_NAME AS NombreColumna,
   RDB$RELATION_NAME AS NombreTabla
FROM
   RDB$RELATION_FIELDS
WHERE
   RDB$FIELD_NAME = 'PAR_IDENTI'
ORDER BY
   RDB$RELATION_NAME

BUSCANDO1

Captura 1. Si haces clic en la imagen la verás más grande

O podría ser que no buscamos una sola columna sino varias columnas similares, por ejemplo todas las que en su nombre tienen la palabra IDENTI:

Listado 2.

SELECT
   RDB$FIELD_NAME AS NombreColumna,
   RDB$RELATION_NAME AS NombreTabla
FROM
   RDB$RELATION_FIELDS
WHERE
   RDB$FIELD_NAME LIKE '%IDENTI%'
ORDER BY
   RDB$RELATION_NAME

BUSCANDO2

Captura 2. Si haces clic en la imagen la verás más grande

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21