Hoje nos DBA’s temos muito trabalho tendo que ficar lembrando diversos detalhes das tabelas e volta e meia a uma usuário que esquece de criar SEQUENCE e TRIGGERS de auto incremento no banco de dados, pensando nisso escrevi um ótimo script de banco de dados que cria uma SEQUENCE para cada tabela do banco de dados desde que ela seja de chave única, ao mesmo tempo ele cria uma TRIGGER de auto incremento utilizando essa SEQUENCE.

Essa procedure você pode executar diversas vezes sem problema algum, pois ela recria a TRIGGER se necessária.

Ela faz um tratamento também de tipo de campo como campo de DATA caso ele seja uma chave primaria, onde que neste caso não existe SEQUENCE para campos de data.

Abaixo a o código desta TRIGGER.


CREATE OR REPLACE PROCEDURE       CRIAR_GERAL
authid CURRENT_USER

AS
   SQL_IMMEDIATE VARCHAR2(2000);
   SQL_COUNT numeric(12, 2);
   CURSOR A
   IS
   SELECT UPPER(t.TABLE_NAME) as nome,
      UPPER(t1.COLUMN_NAME) as coluna,
      USER
   FROM user_constraints t
   INNER JOIN user_cons_columns t1 on (t1.CONSTRAINT_NAME = t.CONSTRAINT_NAME)
   where t.constraint_type = 'P'
   AND t.OWNER = user
   and t.TABLE_NAME in (
   SELECT r.TABLE_NAME
   FROM user_constraints r
   INNER JOIN user_cons_columns r1 on (r1.CONSTRAINT_NAME = r.CONSTRAINT_NAME)
   LEFT OUTER join USER_TAB_COLUMNS r2 on (r2.table_name = r.TABLE_NAME AND R2.COLUMN_NAME = R1.COLUMN_NAME)
   where r.constraint_type = 'P'
   AND r.OWNER = user
   and r2.DATA_TYPE <> 'DATE' 
   and r.TABLE_NAME in (SELECT rr.TABLE_NAME
   FROM user_constraints rr
   INNER JOIN user_cons_columns rr1 on (rr1.CONSTRAINT_NAME = rr.CONSTRAINT_NAME)
   LEFT OUTER join USER_TAB_COLUMNS rr2 on (rr2.table_name = rr.TABLE_NAME AND Rr2.COLUMN_NAME = Rr1.COLUMN_NAME)
   where rr.constraint_type = 'P'
   AND rr.OWNER = user
   group by rr.TABLE_NAME
   having count(*) <= 1)
   group by r.TABLE_NAME having COUNT(*) = 1);
BEGIN
   FOR I IN A
   LOOP
      Select COUNT(*)
      INTO SQL_COUNT
      from user_objects
      where object_type = 'SEQUENCE'
      and UPPER(object_name) = 'SQ_'||I.NOME;
      IF (SQL_COUNT = 0)
      THEN
         SQL_IMMEDIATE := 'CREATE SEQUENCE '||USER||'.SQ_'||I.NOME;
         EXECUTE IMMEDIATE SQL_IMMEDIATE;
         DBMS_OUTPUT.put_line(SQL_IMMEDIATE);
      END if;
      SQL_IMMEDIATE := 'CREATE OR REPLACE TRIGGER '
      || USER||'.TGI'||I.NOME
      || ' BEFORE INSERT'|| ' ON '||USER||'.'||I.NOME
      || ' REFERENCING OLD AS OLD NEW AS NEW'
      || ' FOR EACH ROW'
      || ' BEGIN'
      || ' IF (:NEW.'||I.COLUNA||' IS NULL) THEN'
      || '   SELECT '||USER||'.SQ_'||I.NOME||'.NEXTVAL'
      || ' INTO :NEW.'||I.COLUNA
      || ' FROM DUAL;'
      || ' END IF;'
      || ' END TGI'||I.NOME||';';
    
   
     EXECUTE IMMEDIATE SQL_IMMEDIATE;
   
 
   END LOOP;
   EXCEPTION
        WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR (-20001,
        SQL_IMMEDIATE ||SQLERRM, TRUE) ;
END CRIAR_GERAL;