Para que tu Base de Datos se encuentre siempre en un estado consistente el Firebird no te permite que borres una columna de una tabla, si esa columna está siendo usada en otro lugar.

En otras palabras, no podrás borrar una columna si ella está siendo usada en:

  • la Primary Key
  • una Foreign Key
  • un Check
  • una Unique Key
  • un Index
  • un Expression Index
  • una Computed columna
  • una Validation
  • una View
  • un Stored Procedure
  • un Trigger
  • un Generator
  • una Exception
  • una UDF

Cualquier intento por borrar una columna que está siendo usada en alguno de los objetos listados arriba será siempre rechazado. Eso es algo muy bueno, una excelente medida de seguridad, que te asegura que no borres (por descuido o por ignorancia) una columna que es necesitada por algún objeto.

¿Cómo se puede saber cuáles son las dependencias que tiene una columna?

El Firebird guarda todas las dependencias en una tabla interna llamada RDB$DEPENDENCIES, que tiene esta estructura:

RDB$DEPENDENT_NAME   CHAR(31)
RDB$DEPENDED_ON_NAME CHAR(31)
RDB$FIELD_NAME       CHAR(31)
RDB$DEPENDENT_TYPE   SMALLINT
RDB$DEPENDED_ON_TYPE SMALLINT

_

RDB$DEPENDENT_NAME es el nombre del objeto dependiente, el que está usando a la columna. Es decir, el stored procedure, trigger, etc.

RDB$DEPENDED_ON_NAME es el nombre del dominio, de la tabla, del stored procedure, etc. del cual está dependiendo la columna anterior

RDB$FIELD_NAME es el nombre de la columna (cuando se aplica)

RDB$DEPENDENT_TYPE es el número que identifica la clase de objeto que es RDB$DEPENDENT_NAME y sus posibles valores son:

0 = Table
1 = View
2 = Trigger
3 = Computed
4 = Validation
5 = Procedure
6 = Expression index
7 = Exception
8 = User
9 = Field
10 = Index
14 = Generator
15 = UDF

_

Por ejemplo, si ves un número 5 en esta columna entonces sabes que el objeto en la columna RDB$DEPENDENT_NAME es un stored procedure.

RDB$DEPENDED_ON_TYPE es un número que identifica la clase de objeto que es RDB$DEPENDED_ON_NAME y sus posibles valores son:

0 = Table
1 = View
2 = Trigger
3 = Computed
4 = Validation
5 = Procedure
6 = Expression index
7 = Exception
8 = User
9 = Field
10 = Index
14 = Generator
15 = UDF

_

Ejemplo Nº 1. Viendo todas las dependencias:

SELECT
   *
FROM
   RDB$DEPENDENCIES

Ejemplo Nº 2. Viendo las dependencias de un objeto:

Tenemos un stored procedure llamada GRABAR_SUCURSAL y queremos ver todos los objetos de los cuales depende.

SELECT
   *
FROM
   RDB$DEPENDENCIES
WHERE
   RDB$DEPENDENT_NAME = 'GRABAR_SUCURSAL'

DEPENDENCIAS1

 (haciendo clic en la imagen la verás más grande)

Como puedes ver en la imagen de arriba, GRABAR_SUCURSAL es un stored procedure (porque RDB$DEPENDENT_TYPE es 5) y SUCURSALES es una tabla (porque RDB$DEPENDED_ON_TYPE es 0)

Las columnas SUC_CODDEP, SUC_CODIGO, SUC_CODLOC, etc., están siendo usadas en el stored procedure GRABAR_SUCURSAL y por lo tanto no podrás borrar dichas columnas de la tabla de SUCURSALES. Eso está muy bien, es una muy buena medida de seguridad.

Ejemplo Nº 3. Viendo los dependientes de un objeto:

Supongamos que queremos borrar una columna, ¿cuáles objetos están usando a esa columna?

Aquí, queremos borrar a la columna SUC_TELEFO

SELECT
   *
FROM
   RDB$DEPENDENCIES
WHERE
   RDB$FIELD_NAME = 'SUC_TELEFO'
ORDER BY
   RDB$DEPENDENT_NAME

DEPENDENCIAS2

(haciendo clic en la imagen la verás más grande)

 Como podemos ver en la imagen, la columna SUC_TELEFO de la tabla SUCURSALES está siendo usada en GRABAR_SUCURSAL (que es un stored procedure, por eso RDB$DEPENDENT_TYPE es 5) y también en V_ABM_SUCURSALES (que es una vista, por eso RDB$DEPENDENT_TYPE es 1)

Viendo las dependencias con EMS SQL Manager

Si usas el programa EMS SQL Manager hay una forma más simple de ver cuales son las dependencias de un objeto: hacer clic en la pestaña Dependencies como se muestra en la imagen de abajo

DEPENDENCIAS3

(haciendo clic en la imagen la verás más grande)

Después de hacer clic en la pestaña Dependencies verás una imagen similar a la siguiente:

DEPENDENCIAS4

(haciendo clic en la imagen la verás más grande)

 En el panel de la izquierda se muestran todos los objetos que dependen de este objeto. En este caso, todos los objetos que dependen de la tabla SUCURSALES. Eso significa que borrar una columna de la tabla SUCURSALES les afectará negativamente a esos objetos.

En el panel de la derecha se muestran todos los objetos de los cuales este objeto es dependiente. En este caso, todos los objetos de los cuales está dependiendo la tabla SUCURSALES. Si borras uno de esos objetos entonces estarás afectando negativamente a la tabla SUCURSALES.

Aunque vemos los nombres de los objetos que tienen dependencias, no vemos los nombres de las columnas. Por ejemplo, la vista V_ABM_BANCOS ¿cuál o cuáles columnas de la tabla SUCURSALES está usando? No tenemos esa información entonces debes abrir la vista y revisarla o ejecutar un SELECT a la tabla RDB$DEPENDENCIES (como se mostró más arriba) para saberlo.

Conclusión:

Que el Firebird no nos permita borrar o alterar un objeto del cual dependen otros objetos es una excelente medida de seguridad, eso le otorga consistencia a nuestra Base de Datos.

En síntesis, el control de la dependencia se basa en lo siguiente: si el objeto 1 está siendo usado por el objeto 2, entonces el objeto 1 no puede ser borrado. Es así de simple.

Cuando empiezas a usar Firebird esa manía que tiene de no dejarte borrar o alterar columnas a tu gusto puede resultarte chocante (sobre todo si vienes de entornos donde puedes hacer lo que se te antoje, como con las tablas .DBF), pero apenas te das cuenta de lo mucho que eso te ayuda para evitar que cometas errores, realmente se lo agradeces.

Anuncios