PostgreSQL рд╕рдВрдЪрдпрд┐рдд рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рд╕реНрддрд░рд╛рд╡рд░ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕

рд╣реЗ рд╕реНрдХреЗрдЪ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкреНрд░реЗрд░рдгрд╛ рд╣рд╛ рд▓реЗрдЦ рд╣реЛрддрд╛ тАЬрдХреНрд╡рд╛рд░рдВрдЯрд╛рдЗрди рджрд░рдореНрдпрд╛рди, рдХрд╛рдорд╛рдЪрд╛ рддрд╛рдг 5 рдкрдЯ рд╡рд╛рдврд▓рд╛, рдкрдг рдЖрдореНрд╣реА рддрдпрд╛рд░ рд╣реЛрддреЛ.тАЭ Lingualeo 23 рджрд╢рд▓рдХреНрд╖ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╣ PostgreSQL рд╡рд░ рдХрд╕реЗ рд╣рд▓рд╡рд▓реЗ. рдорд▓рд╛ 4 рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдЭрд╛рд▓реЗрд▓рд╛ рд▓реЗрдЦрд╣реА рдордиреЛрд░рдВрдЬрдХ рд╡рд╛рдЯрд▓рд╛ - MySQL рдордзреНрдпреЗ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рдгреЗ.

рддреЛрдЪ рд╡рд┐рдЪрд╛рд░ рдордиреЛрд░рдВрдЬрдХ рд╡рд╛рдЯрд▓рд╛ - "рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рд╛".

PostgreSQL рд╕рдВрдЪрдпрд┐рдд рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рд╕реНрддрд░рд╛рд╡рд░ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕

рд╣реЗ рдлрдХреНрдд рдорд╛рдЭреНрдпрд╛ рдордирд╛рдд рдЖрд▓реЗ рдЕрд╕реЗ рдирд╛рд╣реА.

рддрд╕реЗрдЪ, рднрд╡рд┐рд╖реНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ рд╕рд░реНрд╡ рдкреНрд░рдердо, рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА, рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджрд░рдореНрдпрд╛рди рдЙрджреНрднрд╡рд▓реЗрд▓реНрдпрд╛ рдордиреЛрд░рдВрдЬрдХ рдШрдбрд╛рдореЛрдбреА рдЬрддрди рдХрд░рд╛рдпрдЪреНрдпрд╛ рд╣реЛрддреНрдпрд╛. рд╡рд┐рд╢реЗрд╖рдд: рддреБрд▓рдиреЗрдиреЗ рдЕрд▓реАрдХрдбреЗрдЪ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рдмреЕрдХрдПрдВрдб рд╕реНрддрд░рд╛рд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдзреЛрд░рдгрд╛рддреНрдордХ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рдд рдЖрд▓рд╛ рдЖрд╣реЗ. рдЬреЗрдгреЗрдХрд░реВрди рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд▓рд╡рдХрд░рдЪ рдХреЛрдгрд╛рдЪреНрдпрд╛рд╣реА рдЙрдкрдпреЛрдЧрд╛рдЪреА рдирд╛рд╣реА рдЖрдгрд┐ рдХреЛрдгрд╛рдЪреНрдпрд╛рд╣реА рд╣рд┐рддрд╛рдЪреА рд░рд╛рд╣рдгрд╛рд░ рдирд╛рд╣реА.

рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреА рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рд╢реЛрдз рдХрд┐рдВрд╡рд╛ рдЕрдкрд╡рд╛рджрд╛рддреНрдордХ рдирд╛рд╣реАрдд рдХрд╕реЗ рдорд╛рд╣рд┐рдд, рд╕рд░реНрд╡рдХрд╛рд╣реА рдХреНрд▓рд╛рд╕рд┐рдХ рдЖрд╣реЗ рдЖрдгрд┐ рдмрд░реНтАНрдпрд╛рдЪ рд╡реЗрд│рд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдореА 20 рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рдУрд░реЕрдХрд▓рд╡рд░ рд╕рдорд╛рди рджреГрд╖реНрдЯреАрдХреЛрди рд╡рд╛рдкрд░рд▓рд╛ рд╣реЛрддрд╛) рдореА рдлрдХреНрдд рд╕рд░реНрд╡ рдХрд╛рд╣реА рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рдЬрд░ рддреЗ рдПрдЦрд╛рджреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдЕрд╕реЗрд▓ рддрд░. рд╕рд░рд╛рд╡рд╛рдиреЗ рджрд╛рдЦрд╡рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рд╕рдорд╛рди рдХрд▓реНрдкрдирд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд▓реЛрдХрд╛рдВрдирд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдпреЗрддреЗ. рдЖрдгрд┐ рддреЗ рд╕реНрд╡рддрдГрд╕рд╛рдареА рдПрдХ рдЖрдард╡рдг рдореНрд╣рдгреВрди рдареЗрд╡рдгреЗ рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗ.

рдЕрд░реНрдерд╛рдд, рдпрд╛ рдЬрдЧрд╛рдд рдХрд╛рд╣реАрд╣реА рдкрд░рд┐рдкреВрд░реНрдг рдирд╛рд╣реА, рдЪреБрдХрд╛ рдЖрдгрд┐ рдЯрд╛рдпрдкреЛ рджреБрд░реНрджреИрд╡рд╛рдиреЗ рд╢рдХреНрдп рдЖрд╣реЗрдд. рдЯреАрдХрд╛ рдЖрдгрд┐ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдЪреЗ рдЬреЛрд░рджрд╛рд░ рд╕реНрд╡рд╛рдЧрдд рдЖрдгрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрд╣реЗ. рдЖрдгрд┐ рдЖрдгрдЦреА рдПрдХ рд▓рд╣рд╛рди рддрдкрд╢реАрд▓ - рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рддрдкрд╢реАрд▓ рд╡рдЧрд│рд▓реЗ рдЖрд╣реЗрдд. рддрд░реАрд╣реА, рд╕рд░реНрд╡рдХрд╛рд╣реА рдЕрджреНрдпрд╛рдк рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд░рдд рдкреНрд░рдХрд▓реНрдкрд╛рдд рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ. рддрд░, рд▓реЗрдЦ рдлрдХреНрдд рдПрдХ рд╕реНрдХреЗрдЪ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдкрдиреЗрдЪреЗ рд╡рд░реНрдгрди рдЖрд╣реЗ, рдЖрдгрдЦреА рдХрд╛рд╣реА рдирд╛рд╣реА. рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рдПрдХреВрдг рдЪрд┐рддреНрд░ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╕реЗ рддрдкрд╢реАрд▓ рдЖрд╣реЗрдд.

"рдлрд╛рдЯрд╛ рдЖрдгрд┐ рдЬрд┐рдВрдХрд╛, рд▓рдкрд╡рд╛ рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪреЗ рдХрд░рд╛" рдЕрд╢реА рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдг рдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ.

рдХрд▓реНрдкрдирд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рдЖрд╣реЗ - рдЯреЗрдмрд▓рд╕рд╛рдареА рдПрдХ рд╡реЗрдЧрд│рд╛ рд╕реНрдХреАрдорд╛, рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдВрд╕рд╛рдареА рдПрдХ рд╡реЗрдЧрд│рд╛ рд╕реНрдХреАрдорд╛.
рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рдбреЗрдЯрд╛рдордзреНрдпреЗ рдереЗрдЯ рдкреНрд░рд╡реЗрд╢ рдирд╛рд╣реА. рдХреНрд▓рд╛рдпрдВрдЯ рд╕рд░реНрд╡ рдХрд░реВ рд╢рдХрддреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрд▓ рдХрд░рдгреЗ рдЖрдгрд┐ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ.

рднреВрдорд┐рдХрд╛

CREATE ROLE store;

CREATE ROLE sys_functions;

CREATE ROLE loc_audit_functions;

CREATE ROLE service_functions;

CREATE ROLE business_functions;

рдпреЛрдЬрдирд╛

рдЯреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдпреЛрдЬрдирд╛

рд╡рд┐рд╖рдп рдШрдЯрдХрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгрд╛рд░реА рд▓рдХреНрд╖реНрдп рд╕рд╛рд░рдгреА.

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;

рдкреНрд░рд╡реЗрд╢ рд╣рдХреНрдХ

рднреВрдорд┐рдХрд╛ - DBA рд╕рд░реНрд╡ рд╕реНрдХреАрдорд╛рдВрд╡рд░ рдкреВрд░реНрдг рдкреНрд░рд╡реЗрд╢ рдЖрд╣реЗ (DB рдорд╛рд▓рдХрд╛рдЪреНрдпрд╛ рднреВрдорд┐рдХреЗрдкрд╛рд╕реВрди рд╡рд┐рднрдХреНрдд).

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 ;

рддреНрдпрд╛рдореБрд│реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рддрдпрд╛рд░ рдЖрд╣реЗ. рддреБрдореНрд╣реА рдбреЗрдЯрд╛ рднрд░рдгреЗ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛.

рд▓рдХреНрд╖реНрдп рд╕рд╛рд░рдгреНрдпрд╛

рдЯреЗрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдХреНрд╖реБрд▓реНрд▓рдХ рдЖрд╣реЗ. рдХреЛрдгрддреАрд╣реА рд╡рд┐рд╢реЗрд╖ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ, рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рддреЗ рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рдирд╛рд╣реА рдЕрд╕реЗ рдард░рд╡рд▓реЗ рдЧреЗрд▓реЗ рд╕рд┐рд░рд┐рдпрд▓ рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдХреНрд░рдо рддрдпрд╛рд░ рдХрд░рд╛. рд╢рд┐рд╡рд╛рдп, рдЕрд░реНрдерд╛рддрдЪ, рд╕реВрдЪрдирд╛рдВрдЪрд╛ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рд╡рд╛рдкрд░

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 ();

рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпреЗ

рд▓рдХреНрд╖реНрдп рд╕рд╛рд░рдгреНрдпрд╛рдВрд╡рд░ рд╕реЗрд╡рд╛ рдЖрдгрд┐ рдбреАрдПрдордПрд▓ рдСрдкрд░реЗрд╢рдиреНрд╕ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ.

рдЯреЗрдореНрдкрд▓реЗрдЯ - рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп

--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;

рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛рд░реНрдпреЗ

рдХреНрд▓рд╛рдпрдВрдЯрджреНрд╡рд╛рд░реЗ рдХреЙрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕрдВрддрд┐рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХрд╛рд░реНрдпрд╛рдВрд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ. рддреЗ рдиреЗрд╣рдореА рдкрд░рдд рдпреЗрддрд╛рдд - JSON. рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рддреНрд░реБрдЯреА рд░реЛрдЦрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд▓реЙрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдмреНрд▓реЙрдХ рд╡рд╛рдкрд░рд╛ рд╕реБрдЯ.

рдЯреЗрдореНрдкрд▓реЗрдЯ - рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛рд░реНрдп

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;

рдкрд░рд┐рдгрд╛рдо

рд╕рд╛рдорд╛рдиреНрдп рдЪрд┐рддреНрд░рд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рддреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ. рдХреЛрдгрд╛рд▓рд╛рд╣реА рддрдкрд╢реАрд▓ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдорд╛рдВрдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рд▓рд┐рд╣рд╛, рдорд▓рд╛ рдЪрд┐рддреНрд░рд╛рдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд░реНрд╢ рдЬреЛрдбрдгреНрдпрд╛рдд рдЖрдирдВрдж рд╣реЛрдИрд▓.

PS

рдПрдХ рд╕рд╛рдзреА рддреНрд░реБрдЯреА рд▓реЙрдЧ рдХрд░рдгреЗ - рдЗрдирдкреБрдЯ рдкреЕрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░

-[ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛