PostgreSQL เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชพเชฐเซเชฏเซ‹เชจเชพ เชธเซเชคเชฐเซ‡ เชฌเชฟเชเชจเซ‡เชธ เชฒเซ‹เชœเซ€เช•เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเชฐเชจเซ‹ เช…เชญเซเชฏเชพเชธ

เช† เชธเซเช•เซ‡เชš เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชชเซเชฐเซ‡เชฐเชฃเชพ เชฒเซ‡เช– เชนเชคเซ€ "เชธเช‚เชธเชฐเซเช—เชจเชฟเชทเซ‡เชง เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชตเชฐเซเช•เชฒเซ‹เชก 5 เช—เชฃเซ‹ เชตเชงเซ€ เช—เชฏเซ‹, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชคเซˆเชฏเชพเชฐ เชนเชคเชพ." เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ Lingualeo 23 เชฎเชฟเชฒเชฟเชฏเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเชพเชฅเซ‡ PostgreSQL เชฎเชพเช‚ เช–เชธเซ‡เชกเซเชฏเซเช‚. เชฎเชจเซ‡ 4 เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชฏเซ‡เชฒเซ‹ เชฒเซ‡เช– เชชเชฃ เชฐเชธเชชเซเชฐเชฆ เชฒเชพเช—เซเชฏเซ‹ - MySQL เชฎเชพเช‚ เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เชคเชฐเซเช•เชจเซ‹ เช…เชฎเชฒ.

เชคเซ‡ เชฐเชธเชชเซเชฐเชฆ เชฒเชพเช—เซเชฏเซเช‚ เช•เซ‡ เชคเซ‡ เชœ เชตเชฟเชšเชพเชฐ - "เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชตเซเชฏเชตเชธเชพเชฏ เชคเชฐเซเช• เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเซ‹".

PostgreSQL เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชพเชฐเซเชฏเซ‹เชจเชพ เชธเซเชคเชฐเซ‡ เชฌเชฟเชเชจเซ‡เชธ เชฒเซ‹เชœเซ€เช•เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเชฐเชจเซ‹ เช…เชญเซเชฏเชพเชธ

เชคเซ‡ เชฎเชพเชคเซเชฐ เชนเซเช‚ เชœ เชจเชนเซ‹เชคเซ‹ เชœเซ‡ เชฎเชจเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹.

เช‰เชชเชฐเชพเช‚เชค, เชญเชตเชฟเชทเซเชฏ เชฎเชพเชŸเซ‡, เชนเซเช‚, เชธเซŒ เชชเซเชฐเชฅเชฎ, เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช‰เชฆเซเชญเชตเชคเชพ เชฐเชธเชชเซเชฐเชฆ เชตเชฟเช•เชพเชธเชจเซ‡ เชธเชพเชšเชตเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชนเชคเซ‹. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเซเช‚ เช•เซ‡ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฌเชฆเชฒเชตเชพ เช…เชจเซ‡ เชฌเชฟเชเชจเซ‡เชธ เชฒเซ‹เชœเซ€เช•เชจเซ‡ เชฌเซ‡เช•เชเชจเซเชก เชฒเซ‡เชตเชฒ เชชเชฐ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเชพเชจเซ‹ เชตเซเชฏเซ‚เชนเชพเชคเซเชฎเช• เชจเชฟเชฐเซเชฃเชฏ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชœเซ‡เชฅเซ€ เชœเซ‡ เชฌเชงเซเช‚ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡ เชŸเซ‚เช‚เช• เชธเชฎเชฏเชฎเชพเช‚ เช•เซ‹เชˆเชจเชพ เช•เชพเชฎเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚ เช…เชจเซ‡ เช•เซ‹เชˆเชจเชพ เชนเชฟเชคเชฎเชพเช‚ เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚.

เชตเชฐเซเชฃเชตเซ‡เชฒ เชชเชฆเซเชงเชคเชฟเช“ เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเซ€ เชถเซ‹เชง เช…เชฅเชตเชพ เช…เชชเชตเชพเชฆเชฐเซ‚เชช เชจเชฅเซ€. เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเชพเชฃเซ‹, เชฌเชงเซเช‚ เช•เซเชฒเชพเชธเชฟเช• เช›เซ‡ เช…เชจเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเซ‡เช‚ 20 เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพเช‚ Oracle เชชเชฐ เชธเชฎเชพเชจ เช…เชญเชฟเช—เชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹). เชฎเซ‡เช‚ เชนเชฎเชฃเชพเช‚ เชœ เชฌเชงเซเช‚ เชเช• เชœเช—เซเชฏเชพเช เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชคเซ‡ เช•เซ‹เชˆเชจเชพ เชฎเชพเชŸเซ‡ เชนเชพเชฅเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เชฌเชคเชพเชตเซ‡ เช›เซ‡ เชคเซ‡เชฎ, เช˜เชฃเซ€ เชตเชพเชฐ เชเช• เชœ เชตเชฟเชšเชพเชฐ เช…เชฒเช— เช…เชฒเช— เชฒเซ‹เช•เซ‹เชจเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชฐเซ€เชคเซ‡ เช†เชตเซ‡ เช›เซ‡. เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชญเชพเชฐเชฃเซเช‚ เชคเชฐเซ€เช•เซ‡ เชฐเชพเช–เชตเซเช‚ เช‰เชชเชฏเซ‹เช—เซ€ เช›เซ‡.

เช…เชฒเชฌเชคเซเชค, เช† เชตเชฟเชถเซเชตเชฎเชพเช‚ เช•เช‚เชˆเชชเชฃ เชธเช‚เชชเซ‚เชฐเซเชฃ เชจเชฅเซ€, เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เชŸเชพเช‡เชชเซ‹ เช•เชฎเชจเชธเซ€เชฌเซ‡ เชถเช•เซเชฏ เช›เซ‡. เชŸเซ€เช•เชพ เช…เชจเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชจเซ‡ เชญเชพเชฐเชชเซ‚เชฐเซเชตเช• เช†เชตเช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชชเซ‡เช•เซเชทเชฟเชค เช›เซ‡. เช…เชจเซ‡ เชตเชงเซ เชเช• เชจเชพเชจเซ€ เชตเชฟเช—เชค - เชšเซ‹เช•เซเช•เชธ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเช—เชคเซ‹ เช…เชตเช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เชคเซ‡เชฎ เช›เชคเชพเช‚, เชตเชพเชธเซเชคเชตเชฟเช• เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชนเชœเซ€ เชชเชฃ เชฌเชงเซเช‚ เชตเชชเชฐเชพเชฏ เช›เซ‡. เชคเซ‡เชฅเซ€, เชฒเซ‡เช– เชซเช•เซเชค เชเช• เชธเซเช•เซ‡เชš เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช–เซเชฏเชพเชฒเชจเซเช‚ เชตเชฐเซเชฃเชจ เช›เซ‡, เชตเชงเซ เช•เช‚เชˆ เชจเชฅเซ€. เชนเซเช‚ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช•เซ‡ เชธเชฎเช—เซเชฐ เชšเชฟเชคเซเชฐเชจเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ€ เชตเชฟเช—เชคเซ‹ เชนเชถเซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชตเชฟเชšเชพเชฐ เช เช›เซ‡ เช•เซ‡ "เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชœเซ€เชคเซ‹, เช›เซเชชเชพเชตเซ‹ เช…เชจเซ‡ เชชเซ‹เชคเชพเชจเชพ เช•เชฐเซ‹"

เช† เชตเชฟเชšเชพเชฐ เช•เซเชฒเชพเชธเชฟเช• เช›เซ‡ - เช•เซ‹เชทเซเชŸเช•เซ‹ เชฎเชพเชŸเซ‡ เชเช• เช…เชฒเช— เชธเซเช•เซ€เชฎเชพ, เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชพเชฐเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เชเช• เช…เชฒเช— เชธเซเช•เซ€เชฎเชพ.
เช•เซเชฒเชพเชฏเชจเซเชŸเชจเซ‡ เชกเซ‡เชŸเชพเชจเซ€ เชธเซ€เชงเซ€ เชเช•เซเชธเซ‡เชธ เชจเชฅเซ€. เช•เซเชฒเชพเชฏเช‚เชŸ เชœเซ‡ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชคเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชพเชฐเซเชฏเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡.

เชญเซ‚เชฎเชฟเช•เชพเช“

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

เชธเซ‡เชตเชพ เช•เชพเชฐเซเชฏเซ‹

เชฒเช•เซเชทเซเชฏ เช•เซ‹เชทเซเชŸเช•เซ‹ เชชเชฐ เชธเซ‡เชตเชพ เช…เชจเซ‡ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹