Como convertir todos los paquetes, funciones, triggers, procedimientos de EDITIONABLE a NONEDITIONABLE en Oracle

 Hola Amig@s,

Si por un casual al compilar un paquete, os aparece el error ORA-33884 es debido a que se ha configurado un paquete plsql como EDITIONABLE. Si no os gusta tener copias del mismo paquete en la bbdd (versionado), entonces tendrán que desactivar dicha opción añadiendo la condición NONEDITIONABLE. Con ese parámetro, Oracle dejará de crear versiones del paquete para reemplazar cada vez el paquete cuando se compile.

Para hacerlo todo de golpe he encontrado un buen procedimiento que busca todos los usuarios que no sean los estandar de Oracle y luego busca todos los objetos que tenga dicho usuario marcados como EDITIONABLE y los cambia a NONEDITIONABLE sobre todo para no ir 1 a 1.

DECLARE

  TYPE t_cursor IS REF CURSOR;

  TYPE t_string_array IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;

  vcursor      t_cursor;

  varraystring t_string_array;

  vstring      VARCHAR2(500);

  i            BINARY_INTEGER;

BEGIN

  OPEN vcursor FOR

    select 'ALTER ' || do.object_type || ' ' || do.owner || '.' || do.object_name || ' NONEDITIONABLE'

      from DBA_OBJECTS do

     where do.editionable = 'Y'

       and do.owner NOT IN('QS_CB','DIP','PERFSTAT','QS_ADM','PM','SH','HR','OE','ODM_MTR','WKPROXY','ANONYMOUS','OWNER','SYS','SYSTEM','SCOTT','SYSMAN','XDB','DBSNMP','EXFSYS','OLAPSYS','MDSYS','WMSYS','WKSYS','DMSYS','ODM','EXFSYS','CTXSYS','LBACSYS','ORDPLUGINS','SQLTXPLAIN','OUTLN','TSMSYS','XS$NULL','TOAD','STREAM','SPATIAL_CSW_ADMIN','SPATIAL_WFS_ADMIN','SI_INFORMTN_SCHEMA','QS','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','PA_AWR_USER','OWBSYS_AUDIT','OWBSYS','ORDSYS','ORDDATA','ORACLE_OCM','SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR','MGMT_VIEW','MDDATA','FLOWS_FILES','FLASHBACK','AWRUSER','APPQOSSYS','APEX_PUBLIC_USER','DVSYS')

       and do.object_type IN ('FUNCTION','LIBRARY','PACKAGE BODY','PACKAGE','PROCEDURE','TRIGGER','TYPE','TYPE BODY','SYNONYM','VIEW');

  LOOP

    FETCH vcursor BULK COLLECT

      INTO varraystring;

    EXIT WHEN varraystring.count = 0;

    FOR i IN varraystring.first .. varraystring.last LOOP

      EXECUTE IMMEDIATE varraystring(i);

    END LOOP;

    EXIT WHEN vcursor%NOTFOUND;

  END LOOP;

  CLOSE vcursor;

END;

Si no queremos que la query tenga en cuenta ciertos usuarios, deberemos añadir a la lista, los usuarios a los que no queremos aplicarle la opción de NONEDITIONABLE.

Extraído de este enlace: https://stackoverflow.com/questions/52218477/error-38824-a-create-or-replace-command-may-not-change-the-editionable-propert

Espero que les resulte útil.

Salu2.

Edu.

Share on Google Plus
    Blogger Comment

0 comentarios: