PostgreSQL рднрдгреНрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реНрддрд░рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЕрдзреНрдпрдпрди

рдпреЛ рд╕реНрдХреЗрдЪ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрдЦ рдерд┐рдпреЛ "рдХреНрд╡рд╛рд░реЗрдиреНрдЯрд╛рдЗрдирдХреЛ рд╕рдордпрдорд╛, рдХрд╛рд░реНрдпрднрд╛рд░ 5 рдЧреБрдгрд╛ рдмрдвреНрдпреЛ, рддрд░ рд╣рд╛рдореА рддрдпрд╛рд░ рдерд┐рдпреМрдВред" рдХрд╕рд░реА Lingualeo 23 рдорд┐рд▓рд┐рдпрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд╕рдБрдЧ PostgreSQL рдорд╛ рд╕рд╛рд░рд┐рдпреЛред рек рд╡рд░реНрд╖рдЕрдШрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦ рдкрдирд┐ рд░реЛрдЪрдХ рд▓рд╛рдЧреНрдпреЛ - MySQL рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрджреИ.

рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рд▓рд╛рдЧреНрдпреЛ рдХрд┐ рдПрдЙрдЯреИ рд╡рд┐рдЪрд╛рд░ - "рдбреЗрдЯрд╛рдмреЗрд╕рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реЛрд╕реН".

PostgreSQL рднрдгреНрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реНрддрд░рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЕрдзреНрдпрдпрди

рдпреЛ рдореЗрд░реЛ рдорд╛рддреНрд░ рджрд┐рдорд╛рдЧрдорд╛ рдЖрдПрдХреЛ рдерд┐рдПрдиред

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

рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рд╡рд┐рдзрд┐рд╣рд░реВ рдХреБрдиреИ рдкреНрд░рдХрд╛рд░рдХреЛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╡рд╛ рдЕрд╕рд╛рдзрд╛рд░рдг рд╣реЛрдЗрдирдиреНред рдерд╛рд╣рд╛ рдЫ рдХрд╕рд░реА, рд╕рдмреИ рдХреБрд░рд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рдЫ рд░ рдзреЗрд░реИ рдкрдЯрдХ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ Oracle рдорд╛ 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;

рднреВрдорд┐рдХрд╛ - USER рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдЫ рдирд┐рд╖реНрдХрд░реНрд╖ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░_рдХрд╛рд░реНрдпрд╣рд░реВ.

CREATE ROLE user_role;

рдпреЛрдЬрдирд╛рд╣рд░реВ рдмреАрдЪ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░

GRANT
рдХрд┐рдирдХрд┐ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рд╢реЗрд╖рддрд╛рдХреЛ рд╕рд╛рде рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рддрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рдЫ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХрдмрд╛рдЯ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рджреНрдж рдЧрд░реНрдиреБрд╣реЛрд╕реН...

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

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

рд▓рдХреНрд╖рд┐рдд рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВрдорд╛ рд╕реЗрд╡рд╛ рд░ 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;

рд╡реНрдпрд╛рдкрд╛рд░ рдХрд╛рд░реНрдпрд╣рд░реВ

рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдмреЛрд▓рд╛рдЗрдПрдХреЛ рдЕрдиреНрддрд┐рдо рд╡реНрдпрд╛рдкрд╛рд░ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛред рддрд┐рдиреАрд╣рд░реВ рд╕рдзреИрдВ рдлрд░реНрдХрдиреНрдЫрдиреН - 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди