Cómo ejecutar sentencias DDL dentro un trigger de Oracle

You may also like...

4 Responses

  1. javier says:

    oye necesito dentro de un disparador crear un usario de sistema, despues de insertar en la tabla de personas que tengo,  es decir por cada persona que tengo en la BD pues debo crearle un usuario a cada una despues de que lo inserto pero no me deja :S  nose si puedas ayudarme  este es mi codigo

    create or replace
    trigger CREAR_USER_ORA_EST before INSERT ON PERSONA
    FOR EACH ROW 
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN 
      create user :new.cod_est identified by :new.login;
    GRANT ESTUDIANTE TO :new.cod_est;
    END;

    Integre la instrucicon de pragma pero el error me sigue diciendo que se encontro el simbolo create cuando se esperaba otro,  es necesario activar algo para que el pragma funcione????

  2. deckerix says:

    creo que te un “DECLARE”

    create or replace
    trigger CREAR_USER_ORA_EST before INSERT ON PERSONA
    FOR EACH ROW 
    declare
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN 
      create user :new.cod_est identified by :new.login;
    GRANT ESTUDIANTE TO :new.cod_est;
    END;

    Saludos!!!

  3. javier says:

    gracias por responder, ya le coloque el declare, pero aun asi sigue saliendo la instruccion es necesario activar el pragma o algo por el estilo? nunca lo habia trabajado y aun continua saliendo el error no me deja crear el usuario,  esta instruccion se puede en el oracle 10g express edition?

  4. JenJen says:

    Sé que es muy tarde mi respuesta pero llegué aquí porque también buscaba la misma solución y la encontré, además si otros también que tienen el mismo problema y se encuentran con esta publicación espero que mi respuesta les sea de ayuda.

    En si la lógica estaba bien .. solo faltaba algunos detalles… que la sentencia lo guardes en una variable y luego la ejecutes.. así por ejemplo:

    CREATE OR REPLACE TRIGGER trg_crear_usuario
    after insert on usuarios 
    for each row
    declare
      PRAGMA AUTONOMOUS_TRANSACTION;
      v_sql varchar2(1000);
    begin
      v_sql:=’CREATE USER ‘||:new.usuario||’ IDENTIFIED BY ‘||:new.contrasenia;
      execute immediate v_sql;
      commit;
    end;

    Por lo que cada que insertes este trigger ejecutara la variable v_sql , que esta tiene la sentencia sql que queremos.
    y Listo!
    (:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.