SET TERM ^ ;

CREATE OR ALTER PROCEDURE PRO_CRIAR_LOGS_PARAMETRO (
    NOME_TABELA DOM_TEXTO_030)
AS
DECLARE VARIABLE STR_NOME_TABELA VARCHAR(40);
DECLARE VARIABLE STR_NUMERO_TABELA VARCHAR(4);
DECLARE VARIABLE STR_NOME_GATILHO VARCHAR(31);
DECLARE VARIABLE STR_CAMPO VARCHAR(31);
DECLARE VARIABLE STR_CHAVE_PRIMARIA VARCHAR(31);
DECLARE VARIABLE SQL DOM_OBS_BLOB;
DECLARE VARIABLE SQL_CAMPOS DOM_OBS_BLOB;
DECLARE VARIABLE CONSULTA_SQL DOM_OBS_BLOB;
DECLARE VARIABLE QTDE_CAMPOS INTEGER;
DECLARE VARIABLE CONTADOR INTEGER;
DECLARE VARIABLE POSICAO_TRIGGER INTEGER;
DECLARE VARIABLE RDB$TRIGGER_NAME VARCHAR(31);
DECLARE VARIABLE SQL_DROP_TRIGGERS VARCHAR(100);
BEGIN

  --LIMPA TODOS OS GATILHOS EXISTENTES DO USUARIO
  --  delete from RDB$TRIGGERS
  --  where RDB$TRIGGERS.RDB$TRIGGER_SEQUENCE = 32767;
  --
  --  delete from RDB$TRIGGERS
  --  where RDB$TRIGGERS.RDB$TRIGGER_SEQUENCE >= 32765 and
  --        RDB$TRIGGERS.RDB$TRIGGER_SEQUENCE <= 32769;

  ------------------------------------------------
  -- ZERA A VARIAVEL
  STR_NOME_TABELA = NULL;
  FOR SELECT TP.TABELA_NOME, LPAD(TP.COD_TABELA, 4, 0)
      FROM VIEW_TABELAS TP
      WHERE (TP.TABELA_NOME = :NOME_TABELA)

            /* for select TP.TABELA_NOME, lpad(TP.COD_TABELA, 4, 0)
      from VIEW_TABELAS TP
      where (TP.TABELA_NOME starting 'CARGA_IMPRESSAO')*/

      INTO :STR_NOME_TABELA, :STR_NUMERO_TABELA
  DO
  BEGIN
    STR_NOME_TABELA = TRIM(:STR_NOME_TABELA);

    SELECT VIEW_CHAVES_PRIMARIAS.TABELA_CHAVE_PRIMARIA
    FROM VIEW_CHAVES_PRIMARIAS
    WHERE (VIEW_CHAVES_PRIMARIAS.TABELA_NOME = :STR_NOME_TABELA)
    INTO :STR_CHAVE_PRIMARIA;

    STR_CHAVE_PRIMARIA = TRIM(:STR_CHAVE_PRIMARIA);

    ---------------------------------------------------------------------
    -- CRIA GATILHOS DE UPDATE
    QTDE_CAMPOS = 0;
    SELECT COUNT(T.TABELA_CAMPO)
    FROM VIEW_TABELAS_CAMPOS_LOG T
    WHERE T.TABELA_NOME = :STR_NOME_TABELA
    GROUP BY TABELA_NOME
    INTO :QTDE_CAMPOS;

    IF (:QTDE_CAMPOS >= 100) THEN
    BEGIN
      CONTADOR = 0;
      POSICAO_TRIGGER = 32764;
      WHILE (:CONTADOR < :QTDE_CAMPOS) DO
      BEGIN
        -- NOME DO GATILHO
        STR_NOME_GATILHO = SUBSTRING('RDB$LOGU' || :STR_NUMERO_TABELA || SUBSTRING(:STR_NOME_TABELA FROM 1 FOR 19) || :CONTADOR FROM 1 FOR 31);

        -- SQL DO GATILHO
        SQL = NULL;
        SQL = 'CREATE OR ALTER TRIGGER ' || :STR_NOME_GATILHO || ' FOR ' || :STR_NOME_TABELA || ' ' || ASCII_CHAR(13);
        SQL = SQL || 'ACTIVE AFTER UPDATE POSITION ' || :POSICAO_TRIGGER || ASCII_CHAR(13);
        SQL = SQL || 'AS  ' || ASCII_CHAR(13);
        SQL = SQL || 'DECLARE VARIABLE COD_LOG INTEGER;  ' || ASCII_CHAR(13);
        SQL = SQL || 'DECLARE VARIABLE INT_TEMP_LOG INTEGER;  ' || ASCII_CHAR(13);
        SQL = SQL || 'BEGIN  ' || ASCII_CHAR(13);
        SQL = SQL || '    /*  Cia Integrativa  */' || ASCII_CHAR(13);
        SQL = SQL || '    /* Gerador de log para auditoria do sistema  */' || ASCII_CHAR(13);
        SQL = SQL || '    COD_LOG = GEN_ID(IBE$LOG_TABLES_GEN, 1);' || ASCII_CHAR(13);

        SQL_CAMPOS = '' || ASCII_CHAR(13);
        STR_CAMPO = NULL;
        CONSULTA_SQL = '';
        -- CAMPOS DIFERENTE DO TIPO BLOB
        CONSULTA_SQL = CONSULTA_SQL || 'select first 100 skip ' || :CONTADOR || ' T.TABELA_CAMPO from VIEW_TABELAS_CAMPOS_LOG T
                                       where T.TABELA_NOME = ' || '''' || :STR_NOME_TABELA || '''' || ' and
                                       T.CAMPO_TAMANHO <= 255 and
                                       T.CAMPO_TIPO <> ''BLOB'' and
                                       T.CAMPO_TIPO <> ''UNKNOWN''';

        FOR EXECUTE STATEMENT(:CONSULTA_SQL)
                INTO :STR_CAMPO
        DO
        BEGIN
          STR_CAMPO = TRIM(:STR_CAMPO);

          SQL_CAMPOS = :SQL_CAMPOS || '   IF (OLD.' || :STR_CAMPO || ' IS DISTINCT FROM NEW.' || :STR_CAMPO || ') THEN BEGIN' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        INT_TEMP_LOG = 1;' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_VALUE, NEW_VALUE)' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NEW.' || :STR_CAMPO || ');' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13); -- || ASCII_CHAR(13);

        END
        -- CAMPOS DO TIPO BLOB OU VARCHAR GRANDE
        CONSULTA_SQL = '';
        CONSULTA_SQL = CONSULTA_SQL || 'select first 100 skip ' || :CONTADOR || ' T.TABELA_CAMPO from VIEW_TABELAS_CAMPOS_LOG T
                                       where ((T.TABELA_NOME = ' || '''' || :STR_NOME_TABELA || '''' || ') and
                                       (((T.CAMPO_TIPO = ''VARCHAR'') and
                                       (T.CAMPO_TAMANHO > 255)) or (T.CAMPO_TIPO = ''BLOB'')))';

        FOR EXECUTE STATEMENT(:CONSULTA_SQL)
                INTO :STR_CAMPO
        DO
        BEGIN
          STR_CAMPO = TRIM(:STR_CAMPO);

          SQL_CAMPOS = :SQL_CAMPOS || '   IF (OLD.' || :STR_CAMPO || ' IS DISTINCT FROM NEW.' || :STR_CAMPO || ') THEN BEGIN' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        INT_TEMP_LOG = 1;' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_BLOB_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_BLOB_VALUE, NEW_BLOB_VALUE)' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NEW.' || :STR_CAMPO || ');' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13) || ASCII_CHAR(13);

        END
        SQL_CAMPOS = SQL_CAMPOS || '    IF (INT_TEMP_LOG >= 1) THEN BEGIN' || ASCII_CHAR(13);

        SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_TABLES (ID, TABLE_NAME, OPERATION, DATE_TIME, USER_NAME)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_NOME_TABELA || '''' || ', ' || '''' || 'U' || '''' || ', CURRENT_TIMESTAMP, USER);' || ASCII_CHAR(13) || ASCII_CHAR(13);

        SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_KEYS (LOG_TABLES_ID, KEY_FIELD, KEY_VALUE)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CHAVE_PRIMARIA || '''' || ', OLD.' || :STR_CHAVE_PRIMARIA || ');' || ASCII_CHAR(13) || ASCII_CHAR(13);

        SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13);

        SQL = SQL || :SQL_CAMPOS || 'END';

        -- EXECUTA O SCRIPT DE UPDATE
        EXECUTE STATEMENT :SQL;

        --------------------------------------
        -- PERMISSOES DA TABELAS DE LOG
        SQL = 'GRANT UPDATE, REFERENCES ON ' || :STR_NOME_TABELA || ' TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;

        SQL = 'GRANT ALL ON TMP_LOG_BLOB_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_KEYS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_TABLES TO TRIGGER ' || :STR_NOME_GATILHO || ';';

        EXECUTE STATEMENT :SQL;

        -- CRIA OS GATILHOS DE DELETE
        SQL = '';
        SQL_CAMPOS = '';
        -- NOME DO GATILHO
        STR_NOME_GATILHO = SUBSTRING('RDB$LOGD' || :STR_NUMERO_TABELA || SUBSTRING(:STR_NOME_TABELA FROM 1 FOR 19) || :CONTADOR FROM 1 FOR 31);

        -- SQL DO GATILHO
        SQL = NULL;
        SQL = 'CREATE OR ALTER TRIGGER ' || :STR_NOME_GATILHO || ' FOR ' || :STR_NOME_TABELA || ' ' || ASCII_CHAR(13);
        SQL = SQL || 'ACTIVE AFTER DELETE POSITION ' || :POSICAO_TRIGGER || ASCII_CHAR(13);
        SQL = SQL || 'AS  ' || ASCII_CHAR(13);
        SQL = SQL || 'DECLARE VARIABLE COD_LOG INTEGER;  ' || ASCII_CHAR(13);
        SQL = SQL || 'BEGIN  ' || ASCII_CHAR(13);
        SQL = SQL || '    /*  Cia Integrativa  */' || ASCII_CHAR(13);
        SQL = SQL || '    /* Gerador de log para auditoria do sistema  */' || ASCII_CHAR(13);
        SQL = SQL || '    COD_LOG = GEN_ID(IBE$LOG_TABLES_GEN, 1);' || ASCII_CHAR(13) || ASCII_CHAR(13);

        SQL = SQL || '    INSERT INTO TMP_LOG_TABLES (ID, TABLE_NAME, OPERATION, DATE_TIME, USER_NAME)' || ASCII_CHAR(13);
        SQL = SQL || '        VALUES (:COD_LOG, ' || '''' || :STR_NOME_TABELA || '''' || ', ' || '''' || 'D' || '''' || ', CURRENT_TIMESTAMP, USER);' || ASCII_CHAR(13) || ASCII_CHAR(13);

        SQL = SQL || '    INSERT INTO TMP_LOG_KEYS (LOG_TABLES_ID, KEY_FIELD, KEY_VALUE)' || ASCII_CHAR(13);
        SQL = SQL || '        VALUES (:COD_LOG, ' || '''' || :STR_CHAVE_PRIMARIA || '''' || ', OLD.' || :STR_CHAVE_PRIMARIA || ');' || ASCII_CHAR(13);

        SQL_CAMPOS = '' || ASCII_CHAR(13);
        STR_CAMPO = NULL;
        -- CAMPOS DIFERENTE DO TIPO BLOB
        CONSULTA_SQL = '';
        CONSULTA_SQL = CONSULTA_SQL || 'select first 100 skip ' || :CONTADOR || ' T.TABELA_CAMPO from VIEW_TABELAS_CAMPOS_LOG T
                                       where T.TABELA_NOME = ' || '''' || :STR_NOME_TABELA || '''' || ' and
                                       T.CAMPO_TAMANHO <= 255 and
                                       T.CAMPO_TIPO <> ''BLOB'' and
                                       T.CAMPO_TIPO <> ''UNKNOWN''';
        FOR EXECUTE STATEMENT(:CONSULTA_SQL)
                INTO :STR_CAMPO
        DO
        BEGIN
          STR_CAMPO = TRIM(:STR_CAMPO);

          SQL_CAMPOS = SQL_CAMPOS || '    INSERT INTO TMP_LOG_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_VALUE, NEW_VALUE)' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NULL);' || ASCII_CHAR(13) || ASCII_CHAR(13);

        END

        -- CAMPOS DO TIPO BLOB OU VARCHAR GRANDE
        CONSULTA_SQL = '';
        CONSULTA_SQL = CONSULTA_SQL || 'select first 100 skip ' || :CONTADOR || ' T.TABELA_CAMPO from VIEW_TABELAS_CAMPOS_LOG T
                                       where ((T.TABELA_NOME = ' || '''' || :STR_NOME_TABELA || '''' || ') and
                                       (((T.CAMPO_TIPO = ''VARCHAR'') and
                                       (T.CAMPO_TAMANHO > 255)) or (T.CAMPO_TIPO = ''BLOB'')))';

        FOR EXECUTE STATEMENT(:CONSULTA_SQL)
                INTO :STR_CAMPO
        DO
        BEGIN
          STR_CAMPO = TRIM(:STR_CAMPO);

          SQL_CAMPOS = SQL_CAMPOS || '    INSERT INTO TMP_LOG_BLOB_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_BLOB_VALUE, NEW_BLOB_VALUE)' || ASCII_CHAR(13);
          SQL_CAMPOS = SQL_CAMPOS || '        VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NULL);' || ASCII_CHAR(13) || ASCII_CHAR(13);

        END

        SQL = SQL || :SQL_CAMPOS || 'END';

        -- EXECUTA O SCRIPT DE DELETE
        EXECUTE STATEMENT :SQL;

        --------------------------------------
        -- PERMISSOES DAS TABELAS DE LOG
        SQL = 'GRANT UPDATE, REFERENCES ON ' || :STR_NOME_TABELA || ' TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;

        SQL = 'GRANT ALL ON TMP_LOG_BLOB_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_KEYS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
        EXECUTE STATEMENT :SQL;
        SQL = 'GRANT ALL ON TMP_LOG_TABLES TO TRIGGER ' || :STR_NOME_GATILHO || ';';

        EXECUTE STATEMENT :SQL;
        CONTADOR = :CONTADOR + 100;
        POSICAO_TRIGGER = POSICAO_TRIGGER + 1;
      END
    END
    ELSE
    BEGIN

      -- NOME DO GATILHO
      STR_NOME_GATILHO = 'RDB$LOGU' || :STR_NUMERO_TABELA || SUBSTRING(:STR_NOME_TABELA FROM 1 FOR 19);

      -- SQL DO GATILHO
      SQL = NULL;
      SQL = 'CREATE OR ALTER TRIGGER ' || :STR_NOME_GATILHO || ' FOR ' || :STR_NOME_TABELA || ' ' || ASCII_CHAR(13);
      SQL = SQL || 'ACTIVE AFTER UPDATE POSITION 32765' || ASCII_CHAR(13);
      SQL = SQL || 'AS  ' || ASCII_CHAR(13);
      SQL = SQL || 'DECLARE VARIABLE COD_LOG INTEGER;  ' || ASCII_CHAR(13);
      SQL = SQL || 'DECLARE VARIABLE INT_TEMP_LOG INTEGER;  ' || ASCII_CHAR(13);
      SQL = SQL || 'BEGIN  ' || ASCII_CHAR(13);
      SQL = SQL || '    /*  Cia Integrativa  */' || ASCII_CHAR(13);
      SQL = SQL || '    /* Gerador de log para auditoria do sistema  */' || ASCII_CHAR(13);
      SQL = SQL || '    COD_LOG = GEN_ID(IBE$LOG_TABLES_GEN, 1);' || ASCII_CHAR(13);

      SQL_CAMPOS = '' || ASCII_CHAR(13);
      -- LIMPA VARIAVEL
      STR_CAMPO = NULL;
      -- CAMPOS DIFERENTE DO TIPO BLOB
      FOR SELECT FIRST 100 T.TABELA_CAMPO
          FROM VIEW_TABELAS_CAMPOS_LOG T
          WHERE ((T.TABELA_NOME = :STR_NOME_TABELA) AND
                (T.CAMPO_TAMANHO <= 255) AND
                ((T.CAMPO_TIPO <> 'BLOB') AND
                (T.CAMPO_TIPO <> 'UNKNOWN')))
          INTO :STR_CAMPO
      DO
      BEGIN
        STR_CAMPO = TRIM(:STR_CAMPO);

        SQL_CAMPOS = :SQL_CAMPOS || '   IF (OLD.' || :STR_CAMPO || ' IS DISTINCT FROM NEW.' || :STR_CAMPO || ') THEN BEGIN' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        INT_TEMP_LOG = 1;' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_VALUE, NEW_VALUE)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NEW.' || :STR_CAMPO || ');' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13); -- || ASCII_CHAR(13);

      END

      -- CAMPOS DO TIPO BLOB OU VARCHAR GRANDE
      FOR SELECT FIRST 100 T.TABELA_CAMPO
          FROM VIEW_TABELAS_CAMPOS_LOG T
          WHERE ((T.TABELA_NOME = :STR_NOME_TABELA) AND
                (((T.CAMPO_TIPO = 'VARCHAR') AND
                (T.CAMPO_TAMANHO > 255)) OR (T.CAMPO_TIPO = 'BLOB')))
          INTO :STR_CAMPO
      DO
      BEGIN
        STR_CAMPO = TRIM(:STR_CAMPO);

        SQL_CAMPOS = :SQL_CAMPOS || '   IF (OLD.' || :STR_CAMPO || ' IS DISTINCT FROM NEW.' || :STR_CAMPO || ') THEN BEGIN' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        INT_TEMP_LOG = 1;' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_BLOB_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_BLOB_VALUE, NEW_BLOB_VALUE)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NEW.' || :STR_CAMPO || ');' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13) || ASCII_CHAR(13);

      END
      SQL_CAMPOS = SQL_CAMPOS || '    IF (INT_TEMP_LOG >= 1) THEN BEGIN' || ASCII_CHAR(13);

      SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_TABLES (ID, TABLE_NAME, OPERATION, DATE_TIME, USER_NAME)' || ASCII_CHAR(13);
      SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_NOME_TABELA || '''' || ', ' || '''' || 'U' || '''' || ', CURRENT_TIMESTAMP, USER);' || ASCII_CHAR(13) || ASCII_CHAR(13);

      SQL_CAMPOS = SQL_CAMPOS || '        INSERT INTO TMP_LOG_KEYS (LOG_TABLES_ID, KEY_FIELD, KEY_VALUE)' || ASCII_CHAR(13);
      SQL_CAMPOS = SQL_CAMPOS || '            VALUES (:COD_LOG, ' || '''' || :STR_CHAVE_PRIMARIA || '''' || ', OLD.' || :STR_CHAVE_PRIMARIA || ');' || ASCII_CHAR(13) || ASCII_CHAR(13);

      SQL_CAMPOS = SQL_CAMPOS || '    END' || ASCII_CHAR(13);

      SQL = SQL || :SQL_CAMPOS || 'END';

      -- EXECUTA O SCRIPT DE UPDATE
      EXECUTE STATEMENT :SQL;

      --------------------------------------
      -- PERMISSOES DA TABELAS DE LOG
      SQL = 'GRANT UPDATE, REFERENCES ON ' || :STR_NOME_TABELA || ' TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;

      SQL = 'GRANT ALL ON TMP_LOG_BLOB_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_KEYS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_TABLES TO TRIGGER ' || :STR_NOME_GATILHO || ';';

      EXECUTE STATEMENT :SQL;

      ---------------------------------------------------------------------
      -- CRIA OS GATILHOS DE DELETE

      -- LIMPA VARIAVEL SQL
      SQL = '';
      SQL_CAMPOS = '';
      -- NOME DO GATILHO
      STR_NOME_GATILHO = 'RDB$LOGD' || :STR_NUMERO_TABELA || SUBSTRING(:STR_NOME_TABELA FROM 1 FOR 19);

      -- SQL DO GATILHO
      SQL = NULL;
      SQL = 'CREATE OR ALTER TRIGGER ' || :STR_NOME_GATILHO || ' FOR ' || :STR_NOME_TABELA || ' ' || ASCII_CHAR(13);
      SQL = SQL || 'ACTIVE AFTER DELETE POSITION 32765' || ASCII_CHAR(13);
      SQL = SQL || 'AS  ' || ASCII_CHAR(13);
      SQL = SQL || 'DECLARE VARIABLE COD_LOG INTEGER;  ' || ASCII_CHAR(13);
      SQL = SQL || 'BEGIN  ' || ASCII_CHAR(13);
      SQL = SQL || '    /*  Cia Integrativa  */' || ASCII_CHAR(13);
      SQL = SQL || '    /* Gerador de log para auditoria do sistema  */' || ASCII_CHAR(13);
      SQL = SQL || '    COD_LOG = GEN_ID(IBE$LOG_TABLES_GEN, 1);' || ASCII_CHAR(13) || ASCII_CHAR(13);

      SQL = SQL || '    INSERT INTO TMP_LOG_TABLES (ID, TABLE_NAME, OPERATION, DATE_TIME, USER_NAME)' || ASCII_CHAR(13);
      SQL = SQL || '        VALUES (:COD_LOG, ' || '''' || :STR_NOME_TABELA || '''' || ', ' || '''' || 'D' || '''' || ', CURRENT_TIMESTAMP, USER);' || ASCII_CHAR(13) || ASCII_CHAR(13);

      SQL = SQL || '    INSERT INTO TMP_LOG_KEYS (LOG_TABLES_ID, KEY_FIELD, KEY_VALUE)' || ASCII_CHAR(13);
      SQL = SQL || '        VALUES (:COD_LOG, ' || '''' || :STR_CHAVE_PRIMARIA || '''' || ', OLD.' || :STR_CHAVE_PRIMARIA || ');' || ASCII_CHAR(13);

      SQL_CAMPOS = '' || ASCII_CHAR(13);
      -- LIMPA VARIAVEL
      STR_CAMPO = NULL;
      -- CAMPOS DIFERENTE DO TIPO BLOB
      FOR SELECT FIRST 100 T.TABELA_CAMPO
          FROM VIEW_TABELAS_CAMPOS_LOG T
          WHERE ((T.TABELA_NOME = :STR_NOME_TABELA) AND
                (T.CAMPO_TAMANHO <= 255) AND
                ((T.CAMPO_TIPO <> 'BLOB') AND
                (T.CAMPO_TIPO <> 'UNKNOWN')))
          INTO :STR_CAMPO
      DO
      BEGIN
        STR_CAMPO = TRIM(:STR_CAMPO);

        SQL_CAMPOS = SQL_CAMPOS || '    INSERT INTO TMP_LOG_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_VALUE, NEW_VALUE)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NULL);' || ASCII_CHAR(13) || ASCII_CHAR(13);

      END

      -- CAMPOS DO TIPO BLOB OU VARCHAR GRANDE
      FOR SELECT FIRST 100 T.TABELA_CAMPO
          FROM VIEW_TABELAS_CAMPOS_LOG T
          WHERE ((T.TABELA_NOME = :STR_NOME_TABELA) AND
                (((T.CAMPO_TIPO = 'VARCHAR') AND
                (T.CAMPO_TAMANHO > 255)) OR (T.CAMPO_TIPO = 'BLOB')))
          INTO :STR_CAMPO
      DO
      BEGIN
        STR_CAMPO = TRIM(:STR_CAMPO);

        SQL_CAMPOS = SQL_CAMPOS || '    INSERT INTO TMP_LOG_BLOB_FIELDS (LOG_TABLES_ID, FIELD_NAME, OLD_BLOB_VALUE, NEW_BLOB_VALUE)' || ASCII_CHAR(13);
        SQL_CAMPOS = SQL_CAMPOS || '        VALUES (:COD_LOG, ' || '''' || :STR_CAMPO || '''' || ', OLD.' || :STR_CAMPO || ', NULL);' || ASCII_CHAR(13) || ASCII_CHAR(13);

      END

      SQL = SQL || :SQL_CAMPOS || 'END';

      -- EXECUTA O SCRIPT DE DELETE
      EXECUTE STATEMENT :SQL;

      --------------------------------------
      -- PERMISSOES DAS TABELAS DE LOG
      SQL = 'GRANT UPDATE, REFERENCES ON ' || :STR_NOME_TABELA || ' TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;

      SQL = 'GRANT ALL ON TMP_LOG_BLOB_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_FIELDS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_KEYS TO TRIGGER ' || :STR_NOME_GATILHO || ';' || ASCII_CHAR(13);
      EXECUTE STATEMENT :SQL;
      SQL = 'GRANT ALL ON TMP_LOG_TABLES TO TRIGGER ' || :STR_NOME_GATILHO || ';';

      EXECUTE STATEMENT :SQL;
    END
  END
END^

SET TERM ; ^