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

เจธเฉ‡เจตเจพ เจซเฉฐเจ•เจธเจผเจจ

เจŸเจพเจฐเจ—เฉ‡เจŸ เจŸเฉ‡เจฌเจฒ 'เจคเฉ‡ เจธเฉ‡เจตเจพ เจ…เจคเฉ‡ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹