es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La desencadenador no funcionará cuando se inicie sesión con otro usuario en SQL Developer.

Antes que nada, soy nuevo en ORACLE y solo estoy trabajando en un proyecto escolar.

Quiero crear un desencadenador que se active cada vez que alguien que no sea el usuario llamado ‘ion’ realice un comando DDL.

Cuando inicio sesión en otro usuario, para tener acceso a las tablas de Ion, utilizo el siguiente comando:

alter session set current_schema = ion;

Aquí está el código:

set serveroutput on;
CREATE OR REPLACE TRIGGER t12
    BEFORE CREATE OR DROP OR ALTER ON SCHEMA
BEGIN
  dbms_output.put_line('LALA');
  IF UPPER(USER) != 'ION' THEN
    RAISE_APPLICATION_ERROR(-20022, 'Solo Ion puede hacer esto');
  ELSE
    INSERT INTO audit_ion VALUES(SYS.LOGIN_USER, SYS.DATABASE_NAME, SYS.SYSEVENT, SYS.DICTIONARY_OBJ_NAME, SYSDATE);
  END IF;
END;
/

alter session set current_schema = ion;

create table dummy(d integer);

Y se crea la tabla, pero ni siquiera se imprime “LALA”, lo que significa que ni siquiera entra en el desencadenador. ¿Cómo puedo hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunas cosas que debes tener en cuenta al crear triggers en Oracle. En primer lugar, el trigger debe estar habilitado para que funcione. Esto se puede hacer utilizando el siguiente comando:

    ALTER TRIGGER t12 ENABLE;
    

    En segundo lugar, el trigger debe ser propiedad de un usuario con suficientes privilegios para crear triggers. Si el trigger es propiedad de un usuario sin los privilegios necesarios, no se activará cuando se ejecute el comando DDL.

    Por último, es importante tener en cuenta que el comando ALTER SESSION que has utilizado para acceder a las tablas de Ion puede no tener ningún efecto en el propio comando DDL. En su lugar, es posible que necesites otorgar privilegios específicos a otros usuarios para poder realizar comandos DDL en las tablas de Ion.

    Dicho esto, aquí tienes una versión modificada de tu código que debería funcionar:

    -- Crea la tabla de auditoría
    CREATE TABLE audit_ion (
      user_name VARCHAR2(30),
      db_name VARCHAR2(30),
      event_type VARCHAR2(30),
      object_name VARCHAR2(30),
      timestamp DATE
    );
    
    -- Crea el trigger
    CREATE OR REPLACE TRIGGER t12
      BEFORE CREATE OR DROP OR ALTER ON SCHEMA
    BEGIN
      dbms_output.put_line('LALA');
      IF UPPER(USER) != 'ION' THEN
        RAISE_APPLICATION_ERROR(-20022, 'Solo Ion puede hacer esto');
      ELSE
        INSERT INTO audit_ion VALUES(SYS.LOGIN_USER, SYS.DATABASE_NAME, SYS.SYSEVENT, SYS.DICTIONARY_OBJ_NAME, SYSDATE);
      END IF;
    END;
    /
    
    -- Habilita el trigger
    ALTER TRIGGER t12 ENABLE;
    

    Ten en cuenta que he agregado la creación de la tabla audit_ion, así como el comando ALTER TRIGGER t12 ENABLE para habilitar el trigger. También he cambiado la definición de la instrucción INSERT para usar SYS.LOGIN_USER en lugar de USER, ya que esto capturará al usuario que ejecuta el comando DDL en lugar del usuario que creó el trigger.

    ¡Espero que esto te ayude!

Comments are closed.