V předchozím příspěvku o
logování jsem se věnoval možnostem, které nabízí APEX k logování činností APEX aplikací. Dnes k tomu přidávám příspěvek, který se zaobírá logováním uživatelských operací. K napsání jsem se inspiroval v dnešním APEX quizu na
www.plsqlchallenge.com, který se zaoberá jednoduchou implementací logování INSERTů do DB.
Jako zadání můžeme vnímat nasledující:
- označit každou INSERT operaci z APEXu uživatelem, který je aktuálně přihlášen do APEXu
- označit každou INSERT operaci z databáze uživatelem, který je aktuálně přihlášen do databázy
- minimálně zatěžovat databázi pro získání informace o uživateli
- všechny události uchovávat ve sloupci CREATED_BY tabulky, do které je záznam vkládán
Jako první krok si vytvoříme sloupec CREATED_BY do tabulky:
ALTER TABLE MY_TABLE ADD COLUMN CREATED_BY VARCHAR2(32):
V dalším kroku vytvoříme PACKAGE s názvem CONST_PKG, která bude obsahovat veřejnou proměnnou G_USER kde budeme uchovávat požadovanou hodnotu přihlášeného uživatele:
CREATE OR REPLACE PACKAGE CONST_PKG IS
G_USER VARCHAR2(64) NOT NULL;
END CONST_PKG;
V těle package pak vytvoříme základní proces, který naplní proměnnou G_USER aktuálně přihlášeným uživatelem:
CREATE OR REPLACE PACKAGE BODY CONST_PKG IS
BEGIN
CONST_PKG.G_USER := NVL(v('APP_USER'), USER);
END CONST_PKG;
V proměnné CONST_PKG.G_USER již máme hodnotu uživatele, který bude pracovat s daty. Umístněním v těle package zabezpečíme to, že táto proměnná bude naplněna jenom jednou - po vytvoření session. Když bude session vytvořená z APEXu, bude hodnota v CONST_PKG.G_USER obsahovat hodnotu právě přihlášeného uživatele, když bude session vytvořená připojením z Oracle klienta (SQL Plus, SQL Developer, PL/SQL developer, Toad a pod.), bude hodnota v CONST_PKG.G_USER obsahovat username přihlášeného uživatele.
Posledním krokem bude vytvoření TRIGGERu, který bude zaznamenávat autora operace do tabulky:
CREATE OR REPLACE TRIGGER MY_TABLE_TRG
BEFORE INSERT ON MY_TABLE
FOR EACH ROW
BEGIN
:NEW.CREATED_BY := CONST_PKG.G_USER;
END;
U každého záznamu tak budeme mat uchováno, kdo daný záznam vytvořil.