ื ืœืขืจื ืขืŸ ื•ื•ืขื’ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ PostgreSQL ืกื˜ืึธืจื“ ืคืึทื ื’ืงืฉืึทื ื–

ื“ืขืจ ืื™ืžืคึผืขื˜ ืฆื• ืฉืจื™ื™ื‘ืŸ ื“ืขื ืกืงื™ืฆืข ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ืึทืจื˜ื™ืงืœ "ื‘ืขืฉืึทืก ืงืึทืจืึทื ื˜ื™ืŸ, ื“ื™ ื•ื•ืขืจืงืœืึธื•ื“ ื’ืขื•ื•ืืงืกืŸ 5 ืžืืœ, ืึธื‘ืขืจ ืžื™ืจ ื–ืขื ืขืŸ ื’ืจื™ื™ื˜." ื•ื•ื™ Lingualeo ืืจื™ื‘ืขืจื’ืขืคืืจืŸ ืฆื• PostgreSQL ืžื™ื˜ 23 ืžื™ืœื™ืึธืŸ ื™ื•ื–ืขืจื–. ืื™ืš ื”ืึธื‘ ืื•ื™ืš ื’ืขืคึฟื•ื ืขืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืืจื•ื™ืก 4 ื™ืึธืจ ืฆื•ืจื™ืง ื˜ืฉื™ืงืึทื•ื•ืข - ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืื™ืŸ MySQL.

ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื˜ืฉื™ืงืึทื•ื•ืข ืึทื– ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื’ืขื“ืึทื ืง - "ื™ื ืกื˜ืจื•ืžืขื ื˜ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก".

ื ืœืขืจื ืขืŸ ื•ื•ืขื’ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ PostgreSQL ืกื˜ืึธืจื“ ืคืึทื ื’ืงืฉืึทื ื–

ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื ื™ื˜ ื ืึธืจ ืžื™ืจ ื•ื•ืืก ื’ืขืงื•ืžืขืŸ ืฆื• ืžื™ื™ื ื•ื ื’.

ืื•ื™ ืš ืคืืจ ืŸ ืฆื•ืงื•ื ืคื˜ , ื”ื ื‘ ืื™ ืš ื’ืขืฐืืœ ื˜ ืืคื”ื™ื˜ืŸ , ืงื•ื“ืึพื›ืœ , ืคื ืจ ื–ื™ืš , ืื™ื ื˜ืขืจืขืกืื ื˜ ืข ืื ื˜ืฐื™ืงืœื•ื ื’ืขืŸ , ืฐื ืก ื–ืฒื ืข ืŸ ืื•ื™ืคื’ืขืงื•ืžืข ืŸ ื‘ ืฒ ื“ืข ืจ ื“ื•ืจื›ืคื™ืจื•ื ื’ . ืกืคึผืขืฆื™ืขืœ ืงืึทื ืกื™ื“ืขืจื™ื ื’ ืึทื– ืœืขืคื™ืขืจืขืš ืœืขืฆื˜ื ืก ืึท ืกื˜ืจืึทื˜ื™ื“ื–ืฉื™ืง ื‘ืึทืฉืœื•ืก ืื™ื– ื’ืขืžืื›ื˜ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืื•ืŸ ืึทืจื™ื‘ืขืจืคื™ืจืŸ ื’ืขืฉืขืคื˜ ืœืึธื’ื™ืง ืฆื• ื“ื™ ื‘ืึทืงืขื ื“ ืžื“ืจื’ื”. ืื– ืืœืขืก ื•ื•ืืก ืื™ื– ืื ื˜ื•ื•ื™ืงืœื˜ ื’ืขื•ื•ืืจืŸ ื•ื•ืขื˜ ื‘ืืœื“ ืงื™ื™ื ืขื ื ื™ืฉื˜ ื ื•ืฆืขืŸ ืื•ืŸ ืงื™ื™ื ืขื ื ื™ืฉื˜ ืื™ื ื˜ืขืจืขืกื™ืจืŸ.

ื“ื™ ืžืขื˜ื”ืึธื“ืก ื“ื™ืกืงืจื™ื™ื‘ื“ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืึท ืžื™ืŸ ืคื•ืŸ ื•ืคื“ืขืงื•ื ื’ ืึธื“ืขืจ ื™ืงืกืขืคึผืฉืึทื ืึทืœ. ื•ื•ื™ืกืŸ ื•ื•ื™, ืึทืœืฅ ืื™ื– ืงืœืึทืกื™ืฉ ืื•ืŸ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ืขื˜ืœืขื›ืข ืžืึธืœ (ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ืึท ืขื ืœืขืš ืฆื•ื’ืึทื ื’ 20 ื™ืืจ ืฆื•ืจื™ืง ืื•ื™ืฃ ืึธืจืึทืงืœืข). ืื™ืš ื ืึธืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื–ืึทืžืœืขืŸ ืึทืœืฅ ืื™ืŸ ืื™ื™ืŸ ืึธืจื˜. ืื™ืŸ ืคืึทืœ ืขืก ืงื•ืžื˜ ืื™ืŸ ื”ืึทื ื˜ื™ืง ืคึฟืึทืจ ืขืžืขืฆืขืจ. ื•ื•ื™ ืคื™ืจ ื”ืื˜ ื’ืขื•ื•ื™ื–ืŸ, ื’ืึทื ืฅ ืึธืคื˜ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื’ืขื“ืึทื ืง ืงื•ืžื˜ ืฆื• ืคืึทืจืฉื™ื“ืขื ืข ืžืขื ื˜ืฉืŸ ื™ื ื“ื™ืคึผืขื ื“ืึทื ื˜ืœื™. ืื•ืŸ ืขืก ืื™ื– ื ื•ืฆื™ืง ืฆื• ื”ืึทืœื˜ืŸ ืขืก ืคึฟืึทืจ ื–ื™ืš ื•ื•ื™ ืึท ืึธื ื“ืขื ืง.

ืคื•ืŸ ืงื•ืจืก, ื’ืึธืจื ื™ืฉื˜ ืื™ืŸ ื“ืขื ื•ื•ืขืœื˜ ืื™ื– ื’ืื ืฅ, ืžื™ืกื˜ื™ื™ืงืก ืื•ืŸ ื“ืจื•ืงืŸ ื–ืขื ืขืŸ ืœื™ื™ื“ืขืจ ืžืขื’ืœืขืš. ืงืจื™ื˜ื™ืง ืื•ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ื–ืขื ืขืŸ ืฉื˜ืืจืง ื‘ืึทื’ืจื™ืกืŸ ืื•ืŸ ื“ืขืจื•ื•ืึทืจื˜ ืื•ืŸ ื ืึธืš ืื™ื™ืŸ ืงืœื™ื™ืŸ ื“ืขื˜ืึทืœ - ืกืคึผืขืฆื™ืคื™ืฉ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ื“ืขื˜ืึทื™ืœืก ื–ืขื ืขืŸ ืื™ื‘ืขืจื’ืขื”ื™ืคึผืขืจื˜. ื ืึธืš, ืึทืœืฅ ืื™ื– ื ืึธืš ื’ืขื ื™ืฆื˜ ืื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ ืึทืจื‘ืขื˜ ืคึผืจื•ื™ืขืงื˜. ืึทื–ื•ื™, ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื ืึธืจ ืึท ืกืงื™ืฆืข ืื•ืŸ ืึท ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืžื™ื™ื ืข ื‘ืึทื’ืจื™ืฃ, ื’ืึธืจื ื™ืฉื˜ ืžืขืจ. ืื™ืš ื”ืืฃ ืื– ืขืก ื–ืขื ืขืŸ ื’ืขื ื•ื’ ื“ืขื˜ืืœืŸ ืฆื• ืคืืจืฉื˜ื™ื™ืŸ ื“ื™ ื’ืื ืฆืข ื‘ื™ืœื“.

ื“ืขืจ ื’ืขื ืขืจืึทืœ ื’ืขื“ืึทื ืง ืื™ื– "ื˜ื™ื™ืœืŸ ืื•ืŸ ืงืึทื ื’ืงืขืจ, ื‘ืึทื”ืึทืœื˜ืŸ ืื•ืŸ ืื™ื™ื’ืŸ"

ื“ืขืจ ื’ืขื“ืึทื ืง ืื™ื– ืงืœืึทืกื™ืฉ - ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืกื˜ืฉืขืžืึท ืคึฟืึทืจ ื˜ื™ืฉืŸ, ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืกื˜ืฉืขืžืึท ืคึฟืึทืจ ืกื˜ืึธืจื“ ืคืึทื ื’ืงืฉืึทื ื–.
ื“ืขืจ ืงืœื™ืขื ื˜ ื”ืื˜ ื ื™ืฉื˜ ืฆื•ื˜ืจื™ื˜ ืฆื• ื“ื™ ื“ืึทื˜ืŸ ื’ืœื™ื™ึทืš. ื›ืœ ื“ืขืจ ืงืœื™ืขื ื˜ ืงืขื ืขืŸ ื˜ืึธืŸ ืื™ื– ืจื•ืคืŸ ื“ื™ ืกื˜ืึธืจื“ ืคึฟื•ื ืงืฆื™ืข ืื•ืŸ ืคึผืจืึธืฆืขืก ื“ื™ ืขื ื˜ืคืขืจ ื‘ืืงื•ืžืขืŸ.

ืจืึธืœืขืก

CREATE ROLE store;

CREATE ROLE sys_functions;

CREATE ROLE loc_audit_functions;

CREATE ROLE service_functions;

CREATE ROLE business_functions;

Schemes

ื˜ื™ืฉ ืกื˜ืึธืจื™ื“ื–ืฉ ืกื›ืขืžืข

ืฆื™ืœ ื˜ื™ืฉืŸ ื•ื•ืึธืก ื™ื ืกื˜ืจื•ืžืขื ื˜ ื•ื ื˜ืขืจื˜ืขื ื™ืง ืขื ื˜ื™ื˜ื™ื–.

CREATE SCHEMA store AUTHORIZATION store ;

ืกื™ืกื˜ืขื ืคึฟื•ื ืงืฆื™ืข ื“ื™ืึทื’ืจืึทืžืข

ืกื™ืกื˜ืขื ืคืึทื ื’ืงืฉืึทื ื–, ืกืคึผืขืฆื™ืขืœ ืคึฟืึทืจ ืœืึธื’ื™ื ื’ ื˜ื™ืฉ ืขื ื“ืขืจื•ื ื’ืขืŸ.

CREATE SCHEMA sys_functions AUTHORIZATION sys_functions ;

ืœืืงืืœืข ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืกื›ืขืžืข

ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ื˜ื™ืฉืŸ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื”ื™ื’ืข ืึทื“ืึทื˜ื™ื ื’ ืคื•ืŸ ื“ื™ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคื•ืŸ ืกื˜ืึธืจื“ ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ืฆื™ืœ ื˜ื™ืฉืŸ.

CREATE SCHEMA loc_audit_functions AUTHORIZATION loc_audit_functions;

ืกืขืจื•ื•ื™ืก ืคึฟื•ื ืงืฆื™ืข ื“ื™ืึทื’ืจืึทืžืข

ืคืึทื ื’ืงืฉืึทื ื– ืคึฟืึทืจ ื“ื™ื ืกื˜ ืื•ืŸ DML ืคืึทื ื’ืงืฉืึทื ื–.

CREATE SCHEMA service_functions AUTHORIZATION service_functions;

ื’ืขืฉืขืคื˜ ืคึฟื•ื ืงืฆื™ืข ื“ื™ืึทื’ืจืึทืžืข

ืคืึทื ื’ืงืฉืึทื ื– ืคึฟืึทืจ ืœืขืฆื˜ ื’ืขืฉืขืคื˜ ืคืึทื ื’ืงืฉืึทื ื– ื’ืขืจื•ืคืŸ ื“ื•ืจืš ื“ืขืจ ืงืœื™ืขื ื˜.

CREATE SCHEMA business_functions AUTHORIZATION business_functions;

ืึทืงืกืขืก ืจืขื›ื˜

ืจืึธืœืข - ื“ื‘ืึท ื”ืื˜ ืคื•ืœ ืึทืงืกืขืก ืฆื• ืึทืœืข ืกื˜ืฉืขืžืึทืก (ืืคื’ืขืฉื™ื™ื“ื˜ ืคื•ืŸ ื“ื™ ื“ื‘ ืึธื•ื ืขืจื– ืจืึธืœืข).

CREATE ROLE dba_role;
GRANT store TO dba_role;
GRANT sys_functions TO dba_role;
GRANT loc_audit_functions TO dba_role;
GRANT service_functions TO dba_role;
GRANT business_functions TO dba_role;

ืจืึธืœืข - ื‘ืึทื ื™ืฆืขืจ ื”ืื˜ ื“ื™ ื–ื›ื•ืช ื“ื•ืจื›ืคื™ืจืŸ ืื™ืŸ ื“ื™ ื“ื™ืึทื’ืจืึทืžืข ื’ืขืฉืขืคื˜_ืคื•ื ืงืฆื™ืขืก.

CREATE ROLE user_role;

ืคึผืจื™ื•ื•ื™ืœืึทื“ื–ืฉืึทื– ืฆื•ื•ื™ืฉืŸ ืกืงื™ืžื–

ืฉืขื ืงืขืŸ
ื–ื™ื ื˜ ืึทืœืข ืคืึทื ื’ืงืฉืึทื ื– ื–ืขื ืขืŸ ื‘ืืฉืืคืŸ ืžื™ื˜ ื“ื™ ืึทื˜ืจื™ื‘ื™ื•ื˜ ื–ื™ื›ืขืจื”ื™ื™ื˜ ื“ืขืคื™ื ื™ืขืจ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ื“ืืจืฃ ืึธืคึผืจื•ืขืŸ ื•ื™ืกืคื™ืจืŸ ืื•ื™ืฃ ืึทืœืข ืคื•ื ืงืฆื™ืข ... ืคึฟื•ืŸ ืฆื™ื‘ื•ืจ;

REVOKE EXECUTE ON ALL FUNCTION IN SCHEMA sys_functions FROM public ; 
REVOKE EXECUTE ON ALL FUNCTION IN SCHEMA  loc_audit_functions  FROM public ; 
REVOKE EXECUTE ON ALL FUNCTION IN SCHEMA  service_functions FROM public ; 
REVOKE EXECUTE ON ALL FUNCTION IN SCHEMA  business_functions FROM public ; 

GRANT USAGE ON SCHEMA sys_functions TO dba_role ; 
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA sys_functions TO dba_role ;
GRANT USAGE ON SCHEMA loc_audit_functions  TO dba_role ; 
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA loc_audit_functions  TO dba_role ;
GRANT USAGE ON SCHEMA service_functions TO dba_role ; 
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA service_functions TO dba_role ;
GRANT USAGE ON SCHEMA business_functions TO dba_role ; 
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA business_functions TO dba_role ;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA business_functions TO user_role ;

GRANT ALL PRIVILEGES ON SCHEMA store TO GROUP business_functions ;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA store TO business_functions ;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA store TO business_functions ;

ืึทื–ื•ื™ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืกื˜ืฉืขืžืึท ืื™ื– ื’ืจื™ื™ื˜. ืื™ืจ ืงืขื ืขืŸ ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ืคึผืœืึธืžื‘ื™ืจืŸ ื“ื™ ื“ืึทื˜ืŸ.

ืฆื™ืœ ื˜ื™ืฉืŸ

ืฉืืคืŸ ื˜ื™ืฉืŸ ืื™ื– ื ื™ืฉื˜ื™ืง. ืงื™ื™ืŸ ืกืคึผืขืฆื™ืขืœ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ, ืึทื—ื•ืฅ ืึทื– ืขืก ืื™ื– ื‘ืึทืฉืœืึธืกืŸ ื ื™ืฉื˜ ืฆื• ื ื•ืฆืŸ SERIAL ืื•ืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืกื™ืงื•ื•ืึทื ืกื™ื– ื‘ืคื™ืจื•ืฉ. ืคึผืœื•ืก, ืคื•ืŸ ืงื•ืจืก, ืžืึทืงืกื™ืžื•ื ื ื•ืฆืŸ ืคื•ืŸ ื™ื ืกื˜ืจืึทืงืฉืึทื ื–

COMMENT ON ...

ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืคึฟืึทืจ ืึทืœืข ืึทื‘ื“ื–ืฉืขืงืฅ, ืึธืŸ ื•ื™ืกื ืขื.

ืœืืงืืœืข ืงืึธื ื˜ืจืึธืœื™ืจืŸ

ืฆื• ืงืœืึธืฅ ื“ื™ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืคื•ืŸ ืกื˜ืึธืจื“ ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ืฆื™ืœ ื˜ื™ืฉืŸ, ืึท ื”ื™ื’ืข ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื˜ื™ืฉ ืื™ื– ื’ืขื ื™ืฆื˜, ื•ื•ืึธืก ื›ื•ืœืœ, ืฆื•ื•ื™ืฉืŸ ืื ื“ืขืจืข ื–ืื›ืŸ, ื“ืขื˜ืึทื™ืœืก ืคื•ืŸ ื“ื™ ืงืœื™ืขื ื˜ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’, ื“ื™ ืคื™ืจืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื’ืขืจื•ืคึฟืŸ ืžืึธื“ื•ืœืข, ืื•ืŸ ื“ื™ ืคืึทืงื˜ื™ืฉ ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ื“ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืื•ืŸ ืจืขื–ื•ืœื˜ืึทื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ JSON.

ืกื™ืกื˜ืขื ืคืึทื ื’ืงืฉืึทื ื–

ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ ืœืึธื’ื™ื ื’ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืฆื™ืœ ื˜ื™ืฉืŸ. ื–ื™ื™ ื–ืขื ืขืŸ ืฆื™ื ื’ืœ ืคืึทื ื’ืงืฉืึทื ื–.

ืžื•ืกื˜ืขืจ - ืกื™ืกื˜ืขื ืคึฟื•ื ืงืฆื™ืข

---------------------------------------------------------
-- INSERT
CREATE OR REPLACE FUNCTION sys_functions.table_insert_log ()
RETURNS TRIGGER AS $$
BEGIN
  PERFORM loc_audit_functions.make_log( ' '||'table' , 'insert' , json_build_object('id', NEW.id)  );
  RETURN NULL ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE TRIGGER table_after_insert AFTER INSERT ON storage.table FOR EACH ROW EXECUTE PROCEDURE sys_functions.table_insert_log();

---------------------------------------------------------
-- UPDATE
CREATE OR REPLACE FUNCTION sys_functions.table_update_log ()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.column != NEW.column
  THEN
    PERFORM loc_audit_functions.make_log( ' '||'table' , 'update' , json_build_object('OLD.column', OLD.column , 'NEW.column' , NEW.column )  );
  END IF ;
  RETURN NULL ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE TRIGGER table_after_update AFTER UPDATE ON storage.table FOR EACH ROW EXECUTE PROCEDURE sys_functions.table_update_log ();

---------------------------------------------------------
-- DELETE
CREATE OR REPLACE FUNCTION sys_functions.table_delete_log ()
RETURNS TRIGGER AS $$
BEGIN
  PERFORM loc_audit_functions.make_log( ' '||'table' , 'delete' , json_build_object('id', OLD.id )  );
  RETURN NULL ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE TRIGGER table_after_delete AFTER DELETE ON storage.table FOR EACH ROW EXECUTE PROCEDURE sys_functions.table_delete_log ();

ืกืขืจื•ื•ื™ืก ืคืึทื ื’ืงืฉืึทื ื–

ื“ื™ื–ื™ื™ื ื“ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ื ืกื˜ ืื•ืŸ DML ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืื•ื™ืฃ ืฆื™ืœ ื˜ื™ืฉืŸ.

ืžื•ืกื˜ืขืจ - ื“ื™ื ืกื˜ ืคึฟื•ื ืงืฆื™ืข

--INSERT
--RETURN id OF NEW ROW
CREATE OR REPLACE FUNCTION service_functions.table_insert ( new_column store.table.column%TYPE )
RETURNS integer AS $$
DECLARE
  new_id integer ;
BEGIN
  -- Generate new id
  new_id = nextval('store.table.seq');

  -- Insert into table
  INSERT INTO store.table
  ( 
    id ,
    column
   )
  VALUES
  (
   new_id ,
   new_column
   );

RETURN new_id ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

--DELETE
--RETURN ROW NUMBERS DELETED
CREATE OR REPLACE FUNCTION service_functions.table_delete ( current_id integer ) 
RETURNS integer AS $$
DECLARE
  rows_count integer  ;    
BEGIN
  DELETE FROM store.table WHERE id = current_id; 

  GET DIAGNOSTICS rows_count = ROW_COUNT;                                                                           

  RETURN rows_count ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
 
-- UPDATE DETAILS
-- RETURN ROW NUMBERS UPDATED
CREATE OR REPLACE FUNCTION service_functions.table_update_column 
(
  current_id integer 
  ,new_column store.table.column%TYPE
) 
RETURNS integer AS $$
DECLARE
  rows_count integer  ; 
BEGIN
  UPDATE  store.table
  SET
    column = new_column
  WHERE id = current_id;

  GET DIAGNOSTICS rows_count = ROW_COUNT;                                                                           

  RETURN rows_count ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

ื’ืขืฉืขืคื˜ ืคืึทื ื’ืงืฉืึทื ื–

ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ ืœืขืฆื˜ ื’ืขืฉืขืคื˜ ืคืึทื ื’ืงืฉืึทื ื– ื’ืขืจื•ืคืŸ ื“ื•ืจืš ื“ืขืจ ืงืœื™ืขื ื˜. ื–ื™ื™ ืฉื˜ืขื ื“ื™ืง ืฆื•ืจื™ืงืงื•ืžืขืŸ - ื“ื–ืฉืกืึธืŸ. ืฆื• ื™ื ื˜ืขืจืกืขืคึผื˜ ืื•ืŸ ืงืœืึธืฅ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืขืจืจืึธืจืก, ื ื•ืฆืŸ ื“ื™ ื‘ืœืึธืง EXCEPTION.

ืžื•ืกื˜ืขืจ - ื’ืขืฉืขืคื˜ ืคึฟื•ื ืงืฆื™ืข

CREATE OR REPLACE FUNCTION business_functions.business_function_template(
--Input parameters        
 )
RETURNS JSON AS $$
DECLARE
  ------------------------
  --for exception catching
  error_message text ;
  error_json json ;
  result json ;
  ------------------------ 
BEGIN
--LOGGING
  PERFORM loc_audit_functions.make_log
  (
    'business_function_template',
    'STARTED',
    json_build_object
    (
	--IN Parameters
    ) 
   );

  PERFORM business_functions.notice('business_function_template');            

  --START BUSINESS PART
  --END BUSINESS PART

  -- SUCCESFULLY RESULT
  PERFORM business_functions.notice('result');
  PERFORM business_functions.notice(result);

  PERFORM loc_audit_functions.make_log
  (
    'business_function_template',
    'FINISHED', 
    json_build_object( 'result',result )
  );

  RETURN result ;
----------------------------------------------------------------------------------------------------------
-- EXCEPTION CATCHING
EXCEPTION                        
  WHEN OTHERS THEN    
    PERFORM loc_audit_functions.make_log
    (
      'business_function_template',
      'STARTED',
      json_build_object
      (
	--IN Parameters	
      ) , TRUE );

     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR',
       json_build_object('SQLSTATE',SQLSTATE ), TRUE 
     );

     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR',
       json_build_object('SQLERRM',SQLERRM  ), TRUE 
      );

     GET STACKED DIAGNOSTICS error_message = RETURNED_SQLSTATE ;
     PERFORM loc_audit_functions.make_log
     (
      'business_function_template',
      ' ERROR-RETURNED_SQLSTATE',json_build_object('RETURNED_SQLSTATE',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = COLUMN_NAME ;
     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR-COLUMN_NAME',
       json_build_object('COLUMN_NAME',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = CONSTRAINT_NAME ;
     PERFORM loc_audit_functions.make_log
     (
      'business_function_template',
      ' ERROR-CONSTRAINT_NAME',
      json_build_object('CONSTRAINT_NAME',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = PG_DATATYPE_NAME ;
     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR-PG_DATATYPE_NAME',
       json_build_object('PG_DATATYPE_NAME',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = MESSAGE_TEXT ;
     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR-MESSAGE_TEXT',json_build_object('MESSAGE_TEXT',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = SCHEMA_NAME ;
     PERFORM loc_audit_functions.make_log
     (s
       'business_function_template',
       ' ERROR-SCHEMA_NAME',json_build_object('SCHEMA_NAME',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = PG_EXCEPTION_DETAIL ;
     PERFORM loc_audit_functions.make_log
     (
      'business_function_template',
      ' ERROR-PG_EXCEPTION_DETAIL',
      json_build_object('PG_EXCEPTION_DETAIL',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = PG_EXCEPTION_HINT ;
     PERFORM loc_audit_functions.make_log
     (
       'business_function_template',
       ' ERROR-PG_EXCEPTION_HINT',json_build_object('PG_EXCEPTION_HINT',error_message  ), TRUE );

     GET STACKED DIAGNOSTICS error_message = PG_EXCEPTION_CONTEXT ;
     PERFORM loc_audit_functions.make_log
     (
      'business_function_template',
      ' ERROR-PG_EXCEPTION_CONTEXT',json_build_object('PG_EXCEPTION_CONTEXT',error_message  ), TRUE );                                      

    RAISE WARNING 'ALARM: %' , SQLERRM ;

    SELECT json_build_object
    (
      'isError' , TRUE ,
      'errorMsg' , SQLERRM
     ) INTO error_json ;

  RETURN  error_json ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

ื’ืึทื ืฅ

ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืึทืœื’ืขืžื™ื™ื ืข ื‘ื™ืœื“, ืื™ืš ื˜ืจืึทื›ื˜ืŸ ืขืก ืื™ื– ื’ืึทื ืฅ ื’ืขื ื•ื’. ืื•ื™ื‘ ืื™ื™ื ืขืจ ืื™ื– ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ื™ ื“ืขื˜ืึทื™ืœืก ืื•ืŸ ืจืขื–ื•ืœื˜ืึทื˜ืŸ, ืฉืจื™ื™ึทื‘ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ, ืื™ืš ื•ื•ืขืœ ื–ื™ื™ืŸ ืฆื•ืคืจื™ื“ืŸ ืฆื• ืœื™ื™ื’ืŸ ื ืึธืš ืจื™ืจื˜ ืฆื• ื“ื™ ื‘ื™ืœื“.

ืคึผืก

ืœืึธื’ื™ื ื’ ืึท ืคึผืฉื•ื˜ ื˜ืขื•ืช - ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืคึผืึทืจืึทืžืขื˜ืขืจ ื˜ื™ืคึผ

-[ RECORD 1 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1072
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          | STARTED
jsonb_pretty    | {
                |     "dko": {
                |         "id": 4,
                |         "type": "Type1",                                                                                                                                                                                            
                |         "title": "CREATED BY addKD",
                |         "Weight": 10,
                |         "Tr": "300",
                |         "reduction": 10,
                |         "isTrud": "TRUE",
                |         "description": "decription",
                |         "lowerTr": "100",
                |         "measurement": "measurement1",
                |         "methodology": "m1",                                                                                                                                                                                           
                |         "passportUrl": "files",
                |         "upperTr": "200",
                |         "weightingFactor": 100.123,
                |         "actualTrValue": null,
                |         "upperTrCalcNumber": "120"
                |     },
                |     "CardId": 3
                | }
-[ RECORD 2 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1073
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR
jsonb_pretty    | {
                |     "SQLSTATE": "22P02"
                | }
-[ RECORD 3 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1074
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR
jsonb_pretty    | {
                |     "SQLERRM": "invalid input syntax for type numeric: "null""
                | }
-[ RECORD 4 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1075
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-RETURNED_SQLSTATE
jsonb_pretty    | {
                |     "RETURNED_SQLSTATE": "22P02"
                | }
-[ RECORD 5 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1076
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-COLUMN_NAME
jsonb_pretty    | {
                |     "COLUMN_NAME": ""
                | }

-[ RECORD 6 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1077
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-CONSTRAINT_NAME
jsonb_pretty    | {
                |     "CONSTRAINT_NAME": ""
                | }
-[ RECORD 7 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1078
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-PG_DATATYPE_NAME
jsonb_pretty    | {
                |     "PG_DATATYPE_NAME": ""
                | }
-[ RECORD 8 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1079
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-MESSAGE_TEXT
jsonb_pretty    | {
                |     "MESSAGE_TEXT": "invalid input syntax for type numeric: "null""
                | }
-[ RECORD 9 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1080
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-SCHEMA_NAME
jsonb_pretty    | {
                |     "SCHEMA_NAME": ""
                | }
-[ RECORD 10 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1081
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-PG_EXCEPTION_DETAIL
jsonb_pretty    | {
                |     "PG_EXCEPTION_DETAIL": ""
                | }
-[ RECORD 11 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1082
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-PG_EXCEPTION_HINT
jsonb_pretty    | {
                |     "PG_EXCEPTION_HINT": ""
                | }
-[ RECORD 12 ]-
date_trunc      | 2020-08-19 13:15:46
id              | 1083
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-PG_EXCEPTION_CONTEXT
jsonb_pretty    | {
usename         | emp1
log_module      | addKD
log_module_hash | 0b4c1529a89af3ddf6af3821dc790e8a
status          |  ERROR-MESSAGE_TEXT
jsonb_pretty    | {
                |     "MESSAGE_TEXT": "invalid input syntax for type numeric: "null""
                | }

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’