Data Base/PL SQL

231107 PL/SQL SESSION TRIGGER

잇꼬 2023. 11. 13. 19:14
728x90
반응형
SMALL

<SYS SESSION>

CREATE USER green IDENTIFIED BY oracle;
GRANT CREATE SESSION TO green;

CREATE TABLE audit_emp_sal (
    name     VARCHAR2(30),
    day      TIMESTAMP,
    id       NUMBER,
    old_sal  NUMBER,
    new_sal  NUMBER
);

CREATE OR REPLACE PROCEDURE update_proc (
    p_id IN NUMBER ) 
IS
BEGIN
    UPDATE hr.employees
    SET salary = salary * 1.1
    WHERE employee_id = p_id;
END update_proc;
/

SELECT salary
FROM hr.employees
WHERE employee_id = 100;

execute update_proc(100);

GRANT EXECUTE ON hr.update_proc TO green;

SELECT * FROM user_tab_privs;

CREATE OR REPLACE TRIGGER sal_audit
AFTER 
    UPDATE OF salary ON hr.employees
    FOR EACH ROW
WHEN (new.salary != old.salary)
BEGIN
    IF :new.salary != :old.salary THEN
        INSERT INTO audit_emp_sal (NAME, DAY, ID, old_sal, new_sal)
        VALUES (USER, systimestamp, :NEW.employee_id, :OLD.salary, :NEW.salary);
    END IF;
END sal_audit;
/


<green session>

SELECT * FROM user_tab_privs;

execute hr.update_proc(100);
commit;



<hr session>

SELECT * FROM hr.audit_emp_sal;


<green session>

execute hr.update_proc(101);



<hr session>

SELECT * FROM hr.audit_emp_sal;

UPDATE hr.employees
SET salary = salary*1.1
WHERE employee_id =101; <- wditing, no wait(green session 에서 rollback 하는 순간)

-- 생성된 트리거 조회
SELECT * FROM user_triggers;

DROP TRIGGER sal_audit;

SELECT * FROM user_source WHERE name = 'UPDATE_PROC';
728x90
반응형
LIST