PostgreSQL เดธเด‚เดญเดฐเดฟเดšเตเดš เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดคเดฒเดคเตเดคเดฟเตฝ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดชเด เดจเด‚

เดˆ เดธเตเด•เต†เดšเตเดšเต เดŽเดดเตเดคเดพเดจเตเดณเตเดณ เดชเตเดฐเต‡เดฐเดฃ เดฒเต‡เด–เดจเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต เด•เตเดตเดพเดฑเตปเตเดฑเตˆเตป เดธเดฎเดฏเดคเตเดคเต, เดœเต‹เดฒเดฟเดญเดพเดฐเด‚ 5 เดฎเดŸเด™เตเด™เต เดตเตผเดฆเตเดงเดฟเดšเตเดšเต, เดชเด•เตเดทเต‡ เดžเด™เตเด™เตพ เดคเดฏเตเดฏเดพเดฑเดพเดฏเดฟเดฐเตเดจเตเดจเต. 23 เดฆเดถเดฒเด•เตเดทเด‚ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเตเดณเตเดณ PostgreSQL-เดฒเต‡เด•เตเด•เต Lingualeo เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดฎเดพเดฑเดฟเดฏเดคเต. 4 เดตเตผเดทเด‚ เดฎเตเดฎเตเดชเต เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเดšเตเดš เดฒเต‡เด–เดจเดตเตเด‚ เดŽเดจเดฟเด•เตเด•เต เดฐเดธเด•เดฐเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเดฟ - 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;

เดธเต‡เดตเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจ เดกเดฏเด—เตเดฐเด‚

เดธเต‡เดตเดจเดคเตเดคเดฟเดจเตเด‚ เดกเดฟเดŽเด‚เดŽเตฝ เดซเด‚เด—เตเดทเดจเตเด•เตพเด•เตเด•เตเดฎเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ.

CREATE SCHEMA service_functions AUTHORIZATION service_functions;

เดฌเดฟเดธเดฟเดจเดธเต เดซเด‚เด—เตเดทเตป เดกเดฏเด—เตเดฐเด‚

เด•เตเดฒเดฏเตปเตเดฑเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ เด…เดตเดธเดพเดจ เดฌเดฟเดธเดฟเดจเดธเต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ.

CREATE SCHEMA business_functions AUTHORIZATION business_functions;

เด†เด•เตเดธเดธเต เด…เดตเด•เดพเดถเด™เตเด™เตพ

เดชเด™เตเด•เต - DBA เดŽเดฒเตเดฒเดพ เดธเตโ€Œเด•เต€เดฎเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดชเต‚เตผเดฃเตเดฃ เด†เด•เตโ€Œเดธเดธเต เด‰เดฃเตเดŸเต (เดกเดฟเดฌเดฟ เด‰เดŸเดฎเดฏเตเดŸเต† เดฑเต‹เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต‡เตผเดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต).

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;

เดธเตเด•เต€เดฎเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ เดชเตเดฐเดคเตเดฏเต‡เด•เดพเดตเด•เดพเดถเด™เตเด™เตพ

เด—เตเดฐเดพเดจเตเดฑเต
เดŽเดฒเตเดฒเดพ เดซเด‚เด—เตเดทเดจเตเด•เดณเตเด‚ เด†เดŸเตเดฐเดฟเดฌเตเดฏเต‚เดŸเตเดŸเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเดฟเดจเดพเตฝ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดกเต†เดซเดจเดฟเดฏเตผ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเดฒเตเดฒเดพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดฟเดฒเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดชเดฟเตปเดตเดฒเดฟเด•เตเด•เตเด•... เดชเตŠเดคเตเดตเดฟเตฝ เดจเดฟเดจเตเดจเต;

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;

เดซเดฒเด‚

เดชเตŠเดคเตเดตเดพเดฏ เดšเดฟเดคเตเดฐเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป, เด‡เดคเต เดฎเดคเดฟเดฏเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต. เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเตเด‚ เดซเดฒเด™เตเด™เดณเดฟเดฒเตเด‚ เด†เตผเด•เตเด•เต†เด™เตเด•เดฟเดฒเตเด‚ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เตพ เดŽเดดเตเดคเตเด•, เดšเดฟเดคเตเดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดธเตเดชเตผเดถเดจเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดžเดพเตป เดธเดจเตเดคเตเดทเตเดŸเดจเดพเดฃเต.

เดชเดฟ.เดŽเดธเต

เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเดฟเดถเด•เต เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต - เด‡เตปเดชเตเดŸเตเดŸเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดคเดฐเด‚

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•