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 ашиглаж болно.
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;