Trigger ашиглаж хэрэглэгчийн хүснэгтийн id хадгалах

Trigger дээр user/schema ийн нэр биш хэрэглэгчийн userstable ийн id-г яаж авах вэ?
Доорх жишээнд Schema авсан байна.
INSERT INTO DD_PriceChange
(ChangeBy, ChangeDate, NewProductPrice,NewRetailPrice)
VALUES (USER, SYSDATE, :NEW.ProductPrice, :NEW.RetailPrice);

Програмын аргаар л шийдвэрлэнэдээ. Ямар нэг байдлаар тухайн хэрэглэгчийн ID-г тухайн үйлдэлд дамжуулах хэрэгтэй.

Хаа нэг газар нь өгөгдөл сануулах жишээ нь user_id аа оноож өгчөөд дараа нь шууд USER, SYSDATE шиг шууд дуудах арга байдаг уу.

user context ашиглаж болно.

1 Like

Application context ашиглаж болно. Жишээ : LOZER гэсэн db user - ээр нэвтрээд LOZER гэсэн cell байвал тухайн cell - ийн row-ийн id - г app context set хийдэг жишээ:

–step 1 - create user accounts and ensure SCOTT is active

GRANT CREATE SESSION TO LOZER IDENTIFIED BY golomtbank;

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = ‘SCOTT’;

ALTER USER SCOTT ACCOUNT UNLOCK IDENTIFIED BY password;

–step 2 - Create the Database Session-Based Application Context

CREATE CONTEXT empno_ctx USING set_empno_ctx_pkg

–step 3 - Create package to Retrieve Session Data and Set the Application context

CREATE OR REPLACE PACKAGE set_empno_ctx_pkg IS
PROCEDURE set_empno;
END;
/

CREATE OR REPLACE PACKAGE BODY set_empno_ctx_pkg IS
PROCEDURE set_empno
IS
emp_id NUMBER;
BEGIN
SELECT ID INTO emp_id FROM COMPANY.EMPLOYEE
WHERE NAME = SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’);
DBMS_SESSION.SET_CONTEXT(‘empno_ctx’, ‘employee_id’, emp_id);
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END;
END;
/

SELECT SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’) FROM DUAL;

– step 4 creating logon trigger for the package

CREATE TRIGGER set_empno_ctx_trig AFTER LOGON ON DATABASE
BEGIN
sys.set_empno_ctx_pkg.set_empno;
END;
/

–step 5 test application context

UPDATE COMPANY.EMPLOYEE SET NAME = ‘LOZER’ WHERE ID = 103153;

COMMIT;

  • check
    select sys_context(‘empno_ctx’, ‘employee_id’) emp_id from dual;
2 Likes