Π‘Ρ‚ΡƒΠ΄ΠΈΡ˜Π° ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜ΠΈ пословнС Π»ΠΎΠ³ΠΈΠΊΠ΅ Π½Π° Π½ΠΈΠ²ΠΎΡƒ ΠŸΠΎΡΡ‚Π³Ρ€Π΅Π‘ΠšΠ› ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

ΠŸΠΎΠ΄ΡΡ‚Ρ€Π΅ΠΊ Π·Π° писањС ΠΎΠ²Π΅ скицС Π±ΠΈΠΎ јС Ρ‡Π»Π°Π½Π°ΠΊ β€žΠ’ΠΎΠΊΠΎΠΌ ΠΊΠ°Ρ€Π°Π½Ρ‚ΠΈΠ½Π°, ΠΎΠΏΡ‚Π΅Ρ€Π΅Ρ›Π΅ΡšΠ΅ сС ΠΏΠΎΠ²Π΅Ρ›Π°Π»ΠΎ 5 ΠΏΡƒΡ‚Π°, Π°Π»ΠΈ Π±ΠΈΠ»ΠΈ смо спрСмни. Како јС Π›ΠΈΠ½Π³ΡƒΠ°Π»Π΅ΠΎ ΠΏΡ€Π΅ΡˆΠ°ΠΎ Π½Π° ΠŸΠΎΡΡ‚Π³Ρ€Π΅Π‘ΠšΠ› са 23 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° корисника. Π’Π°ΠΊΠΎΡ’Π΅ ΠΌΠΈ јС Π·Π°Π½ΠΈΠΌΡ™ΠΈΠ² Ρ‡Π»Π°Π½Π°ΠΊ ΠΎΠ±Ρ˜Π°Π²Ρ™Π΅Π½ ΠΏΡ€Π΅ 4 Π³ΠΎΠ΄ΠΈΠ½Π΅ - Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° пословнС Π»ΠΎΠ³ΠΈΠΊΠ΅ Ρƒ ΠœΠΈΠ‘ΠšΠ›.

Π§ΠΈΠ½ΠΈΠ»ΠΎ сС Π·Π°Π½ΠΈΠΌΡ™ΠΈΠ²ΠΈΠΌ Π΄Π° иста мисао - "ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚ΠΈ пословну Π»ΠΎΠ³ΠΈΠΊΡƒ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°".

Π‘Ρ‚ΡƒΠ΄ΠΈΡ˜Π° ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜ΠΈ пословнС Π»ΠΎΠ³ΠΈΠΊΠ΅ Π½Π° Π½ΠΈΠ²ΠΎΡƒ ΠŸΠΎΡΡ‚Π³Ρ€Π΅Π‘ΠšΠ› ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

Нисам само ΠΌΠ΅Π½ΠΈ ΠΏΠ°ΠΎ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚.

Π’Π°ΠΊΠΎΡ’Π΅, Π·Π° будућност сам ΠΆΠ΅Π»Π΅ΠΎ Π΄Π° сачувам, ΠΏΡ€Π΅ свСга, Π·Π° сСбС интСрСсантнС Π΄ΠΎΠ³Π°Ρ’Π°Ρ˜Π΅ који су настали Ρ‚ΠΎΠΊΠΎΠΌ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅. ΠŸΠΎΠ³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΈΠΌΠ°Ρ˜ΡƒΡ›ΠΈ Ρƒ Π²ΠΈΠ΄Ρƒ Π΄Π° јС Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Π΄ΠΎΠ½Π΅Ρ‚Π° ΡΡ‚Ρ€Π°Ρ‚Π΅ΡˆΠΊΠ° ΠΎΠ΄Π»ΡƒΠΊΠ° Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΈ пословна Π»ΠΎΠ³ΠΈΠΊΠ° прСнСсС Π½Π° Π±Π°Ρ†ΠΊΠ΅Π½Π΄ Π½ΠΈΠ²ΠΎ. Π’Π°ΠΊΠΎ Π΄Π° свС ΡˆΡ‚ΠΎ јС Ρ€Π°Π·Π²ΠΈΡ˜Π΅Π½ΠΎ ускоро Π½ΠΈΠΊΠΎΠΌΠ΅ Π½Π΅Ρ›Π΅ користити ΠΈ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅Ρ›Π΅ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΠΈ.

Описани ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ нису Π½Π΅ΠΊΠ° врста ΠΎΡ‚ΠΊΡ€ΠΈΡ›Π° ΠΈΠ»ΠΈ ΠΈΠ·ΡƒΠ·Π΅Ρ‚Π½Π°. ΠΊΠ½ΠΎΠ² Ρ…ΠΎΠ², свС јС класично ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎ јС Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΏΡƒΡ‚Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, користио сам сличан приступ ΠΏΡ€Π΅ 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;

ΠŸΡ€Π°Π²Π° приступа

Π£Π»ΠΎΠ³Π° - ДБА ΠΈΠΌΠ° ΠΏΡƒΠ½ приступ свим шСмама (одвојСно ΠΎΠ΄ ΡƒΠ»ΠΎΠ³Π΅ власника Π”Π‘-Π°).

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

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π·Π° свС ΠΎΠ±Ρ˜Π΅ΠΊΠ°Ρ‚Π°, Π±Π΅Π· ΠΈΠ·ΡƒΠ·Π΅Ρ‚ΠΊΠ°.

Π›ΠΎΠΊΠ°Π»Π½Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π°

Π—Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΠ° ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Ρ†ΠΈΡ™Π½ΠΈΡ… Ρ‚Π°Π±Π΅Π»Π° користи сС Π»ΠΎΠΊΠ°Π»Π½Π° Ρ‚Π°Π±Π΅Π»Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π΅ која ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜Π΅, ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ осталог, Π΄Π΅Ρ‚Π°Ρ™Π΅ ΠΎ Π²Π΅Π·ΠΈ са ΠΊΠ»ΠΈΡ˜Π΅Π½Ρ‚ΠΎΠΌ, ΠΎΠ·Π½Π°ΠΊΡƒ ΠΏΠΎΠ·Π²Π°Π½ΠΎΠ³ ΠΌΠΎΠ΄ΡƒΠ»Π° ΠΈ стварнС врСдности ΡƒΠ»Π°Π·Π° ΠΈ ΠΈΠ·Π»Π°Π·Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Ρƒ ΠΎΠ±Π»ΠΈΠΊΡƒ ЈБОН-Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ систСма

Π”ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Ρƒ Ρ†ΠΈΡ™Π½ΠΈΠΌ Ρ‚Π°Π±Π΅Π»Π°ΠΌΠ°. ОнС су Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ ΠΎΠΊΠΈΠ΄Π°Ρ‡Π°.

Π¨Π°Π±Π»ΠΎΠ½ – систСмска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

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

БСрвиснС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅

Π”ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ услуга ΠΈ Π”ΠœΠ› ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ†ΠΈΡ™Π½ΠΈΠΌ Ρ‚Π°Π±Π΅Π»Π°ΠΌΠ°.

Π¨Π°Π±Π»ΠΎΠ½ – сСрвисна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

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

ПословнС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅

Π”ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π·Π° Π·Π°Π²Ρ€ΡˆΠ½Π΅ пословнС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ којС ΠΏΠΎΠ·ΠΈΠ²Π° ΠΊΠ»ΠΈΡ˜Π΅Π½Ρ‚. Π£Π²Π΅ΠΊ сС Π²Ρ€Π°Ρ›Π°Ρ˜Ρƒ - ЈБОН. Π—Π° ΠΏΡ€Π΅ΡΡ€Π΅Ρ‚Π°ΡšΠ΅ ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π³Ρ€Π΅ΡˆΠ°ΠΊΠ° Ρƒ ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΡƒ, користитС Π±Π»ΠΎΠΊ Π˜Π—Π£Π—Π•Π’ΠΠš.

Π¨Π°Π±Π»ΠΎΠ½ – пословна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

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""
                | }

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€