เบเบฒเบ™เบชเบถเบเบชเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰ PostgreSQL

เปเบฎเบ‡เบเบฐเบ•เบธเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™ sketch เบ™เบตเป‰เปเบกเปˆเบ™เบšเบปเบ”เบ„เบงเบฒเบก "เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบเบฑเบเบเบฑเบ™, เบงเบฝเบเบ‡เบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ 5 เป€เบ—เบปเปˆเบฒ, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบเบฝเบกเบžเป‰เบญเบก." เบงเบดเบ—เบตเบเบฒเบ™ Lingualeo เบเป‰เบฒเบเป„เบ› PostgreSQL เบเบฑเบš 23 เบฅเป‰เบฒเบ™เบœเบนเป‰เปƒเบŠเป‰. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เป„เบ”เป‰เบžเบปเบšเป€เบซเบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบˆเบฑเบ”เบžเบตเบกเบกเบฒ 4 เบ›เบตเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ - เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เปƒเบ™ MySQL.

เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบตเปˆโ€‹เบซเบ™เป‰เบฒโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบ„เบดเบ”โ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™ โ€” "เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™".

เบเบฒเบ™เบชเบถเบเบชเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰ PostgreSQL

เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ—เบตเปˆโ€‹เบกเบฒโ€‹เปƒเบ™โ€‹เปƒเบˆ.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบชเปเบฒเบฅเบฑเบšเบญเบฐเบ™เบฒเบ„เบปเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ›เบปเบเบ›เบฑเบเบฎเบฑเบเบชเบฒ, เบเปˆเบญเบ™เบญเบทเปˆเบ™เบซเบกเบปเบ”, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡, เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบเบธเบ”เบ—เบฐเบชเบฒเบ”เป„เบ”เป‰เบ–เบทเบเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเปเบฅเบฐเบเบฒเบ™เป‚เบญเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เป„เบ›เบชเบนเปˆเบฅเบฐเบ”เบฑเบš backend. เป€เบžเบทเปˆเบญโ€‹เบงเปˆเบฒโ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เปƒเบ™โ€‹เป„เบงเป†โ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ›เบฐโ€‹เป‚เบซเบเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เปƒเบœโ€‹เปเบฅเบฐโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบ‚เบญเบ‡โ€‹เปƒเบœ.

เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบšเปเปˆเปเบกเปˆเบ™เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบซเบผเบทเบžเบดเป€เบชเบ”. เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ„เบฅเบฒเบชเบชเบดเบเปเบฅเบฐเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฒเบเบ„เบฑเป‰เบ‡ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ‚เป‰เบญเบเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป€เบกเบทเปˆเบญ 20 เบ›เบตเบœเปˆเบฒเบ™เบกเบฒเปƒเบ™ Oracle) เบ‚เป‰เบญเบเบžเบฝเบ‡เปเบ•เปˆเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบเบฑเบšเบเปเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ”เบฝเบง. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™, เป€เบฅเบทเป‰เบญเบเป†เบ„เบงเบฒเบกเบ„เบดเบ”เบ”เบฝเบงเบเบฑเบ™เบกเบฒเบชเบนเปˆเบ„เบปเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”. เปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบกเบฑเบ™เป„เบงเป‰เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบฅเบฐเบ™เบถเบ.

เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เปƒเบ™เป‚เบฅเบเบ™เบตเป‰เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบเบฒเบ™เบžเบดเบกเบœเบดเบ”เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบเบฒเบ™เบงเบดเบžเบฒเบเบงเบดเบˆเบฒเบ™ เปเบฅเบฐเบ„เปเบฒเบ„เบดเบ”เป€เบซเบฑเบ™เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เป‰เบญเบ™เบฎเบฑเบšเบขเปˆเบฒเบ‡เปเบ‚เบ‡เปเบฎเบ‡ เปเบฅเบฐเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เบทเปˆเบกเบญเบตเบ - เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบ–เบทเบเบฅเบฐเป€เบงเบฑเป‰เบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบเบฑเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบšเบปเบ”เบ„เบงเบฒเบกเปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ sketch เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบปเปˆเบงเป„เบ›, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบซเบผเบฒเบ. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบžเบฒเบšเบฅเบงเบก.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบปเปˆเบงเป„เบ›เปเบกเปˆเบ™ "เปเบšเปˆเบ‡เบ›เบฑเบ™เปเบฅเบฐเป€เบญเบปเบฒเบŠเบฐเบ™เบฐ, เป€เบŠเบทเปˆเบญเบ‡เปเบฅเบฐเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡"

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปเบกเปˆเบ™เบ„เบฅเบฒเบชเบชเบดเบ - schema เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, schema เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰.
เบฅเบนเบเบ„เป‰เบฒเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบปเบ‡. เบฅเบนเบเบ„เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปเบกเปˆเบ™เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš.

เบšเบปเบ”เบšเบฒเบ”

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 เบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบเบฑเบš schemas เบ—เบฑเบ‡เบซเบกเบปเบ” (เปเบเบเบญเบญเบเบˆเบฒเบเบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡ 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;

เบšเบปเบ”เบšเบฒเบ” - เบœเบนเป‰เปƒเบŠเป‰ เบกเบตเบชเบดเบ”เบ—เบดเบžเบดเป€เบชเบ” เบชเบฐเบซเบผเบธเบš เปƒเบ™เปเบœเบ™เบงเบฒเบ” business_functions.

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 ;

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ schema เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบก. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเป„เบ”เป‰.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ. เบšเปเปˆเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบžเบดเป€เบชเบ”, เบเบปเบเป€เบงเบฑเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบšเปเปˆเปƒเบŠเป‰ เบฅเบณ เบ”เบฑเบš เปเบฅเบฐเบชเป‰เบฒเบ‡เบฅเปเบฒเบ”เบฑเบšเบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเบนเบ‡เบชเบธเบ”

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

เบšเบฑเบ™เบ—เบถเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ - input parameter type

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™