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

Anuncios

Tablas sin una PRIMARY KEY

5 comentarios

Sabemos muy bien que todas las tablas deben tener sí o sí una Primary Key (la única excepción son las tablas que siempre tendrán una fila y nunca tendrán más de una fila) pero ¿estamos seguros de que todas nuestras tablas tienen una Primary Key?

Si una tabla (que tiene o puede tener más de una fila) no tiene una Primary Key eso es un error y debemos corregirlo urgentemente. Desde luego que puedes revisar las tablas una por una, manualmente, pero eso no sería profesional.

Aquí hay un stored procedure para averiguarlo (por supuesto que no es la única forma, pero quiero mostrar como hacerlo así):

SET TERM ^ ;

CREATE PROCEDURE TABLAS_SIN_PRIMARY_KEY
   RETURNS(
      TCNOMBRETABLA VARCHAR(32))
AS
   DECLARE VARIABLE lcNombreTabla VARCHAR(32);
   DECLARE VARIABLE lcRestriccion VARCHAR(20);
   DECLARE VARIABLE lcCC VARCHAR(32);
   DECLARE VARIABLE lcMostrar VARCHAR(1);
BEGIN

   lcCC = '***';

   lcMostrar = 'F';

   FOR SELECT
      RDB$RELATION_NAME,
      RDB$CONSTRAINT_TYPE
   FROM
      RDB$RELATION_CONSTRAINTS
   ORDER BY
      RDB$RELATION_NAME
   INTO
      :lcNombreTabla,
      :lcRestriccion
   DO BEGIN
      IF (lcNombreTabla <> lcCC) THEN BEGIN
         IF (lcMostrar = 'T') THEN BEGIN
            tcNombreTabla = lcCC;
            SUSPEND;
         END
         lcCC = lcNombreTabla;
         lcMostrar = 'T';
      END
      IF (lcRestriccion = 'PRIMARY KEY') THEN
         lcMostrar = 'F';
   END

END^

SET TERM ; ^

Este stored procedure es seleccionable y por lo tanto lo debes ejecutar así:


SELECT * FROM TABLAS_SIN_PRIMARY_KEY

Artículos relacionados:

Entendiendo a las Primary Keys

El índice del blog Firebird21

Un stored procedure para conocer la cantidad de filas de todas las tablas

1 comentario

Como seguramente ya sabrás, usar la función COUNT(*) en tablas que tienen muchas filas no es una buena idea, porque como el Firebird no guarda la cantidad de filas que tiene cada tabla en algún lado, lo que hace la función COUNT() es recorrer la tabla desde el principio hasta el fin y contar cuantas filas hay en total.

Y claro que en tablas pequeñas, que tienen solamente algunas miles de filas no hay problema porque la función COUNT() trabaja muy rápido, pero en tablas grandes de millones y millones de filas es otra cosa, allí la espera puede ser desesperante.

Por eso, el siguiente stored procedure solamente es recomendable de ejecutar cuando todas las tablas de tu Base de Datos tienen pocas filas, o en casos excepcionales cuando necesitas conocer la cantidad de filas de cada tabla.

Este stored procedure seleccionable te mostrará, para cada tabla de tu Base de Datos, la cantidad de filas que tiene.

SET TERM ^ ;
CREATE PROCEDURE CANTIDAD_FILAS
RETURNS(
   NOMBRETABLA VARCHAR(32),
   FILAS INTEGER)
AS
DECLARE VARIABLE COMANDO VARCHAR(80);
BEGIN

 FOR SELECT RDB$RELATION_NAME
       FROM RDB$RELATIONS
      WHERE RDB$FLAGS = '1'
       INTO :NombreTabla
       DO BEGIN
          Comando = 'SELECT COUNT(*) FROM ' || :NombreTabla;
          EXECUTE STATEMENT COMANDO
          INTO :Filas ;
          SUSPEND;
       END

END^

SET TERM ; ^

Para ejecutarlo, escribe lo siguiente:

SELECT
   *
FROM
   CANTIDAD_FILAS