Π‘Ρ‚ΡƒΠ΄ΠΈΡ˜Π° Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π΄Π΅Π»ΠΎΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° складирани Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PostgreSQL

ΠŸΠΎΡ‚Ρ‚ΠΈΠΊ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°Π° скица бСшС ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° β€žΠ—Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠ°Ρ€Π°Π½Ρ‚ΠΈΠ½ΠΎΡ‚ ΠΎΠ±Π΅ΠΌΠΎΡ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° сС Π·Π³ΠΎΠ»Π΅ΠΌΠΈ 5 ΠΏΠ°Ρ‚ΠΈ, Π½ΠΎ Π½ΠΈΠ΅ Π±Π΅Π²ΠΌΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ. Како Lingualeo сС прСсСли Π²ΠΎ PostgreSQL со 23 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ корисници. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ° ΠΌΠΈ бСшС интСрСсна ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° објавСна ΠΏΡ€Π΅Π΄ 4 Π³ΠΎΠ΄ΠΈΠ½ΠΈ - Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π΅Π»ΠΎΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π²ΠΎ MySQL.

Π‘Π΅ Ρ‡ΠΈΠ½Π΅ΡˆΠ΅ интСрСсно ΡˆΡ‚ΠΎ истата мисла - "ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π΄Π΅Π»ΠΎΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ".

Π‘Ρ‚ΡƒΠ΄ΠΈΡ˜Π° Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π΄Π΅Π»ΠΎΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° складирани Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PostgreSQL

НС ΠΌΠΈ ΠΏΠ°Π΄Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ само ΠΌΠ΅Π½Π΅.

Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π·Π° Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°, сакав Π΄Π° Π³ΠΈ Π·Π°Ρ‡ΡƒΠ²Π°ΠΌ, ΠΏΡ€Π΅Π΄ сè, Π·Π° сСбС интСрСснитС ΡΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ° ΡˆΡ‚ΠΎ сС појавија ΠΏΡ€ΠΈ ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ. ОсобСно Π°ΠΊΠΎ сС Π·Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° бСшС донСсСна ΡΡ‚Ρ€Π°Ρ‚Π΅ΡˆΠΊΠ° ΠΎΠ΄Π»ΡƒΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ трансфСр Π½Π° Π΄Π΅Π»ΠΎΠ²Π½Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° Π·Π°Π΄Π½ΠΈΠ½Π°. Π’Π°ΠΊΠ° ΡˆΡ‚ΠΎ сè ΡˆΡ‚ΠΎ Π΅ Ρ€Π°Π·Π²ΠΈΠ΅Π½ΠΎ наскоро Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ΄ корист ΠΈ Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ интСрСсно.

ΠžΠΏΠΈΡˆΠ°Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π½Π΅ сС Π½Π΅ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈΠ΅ ΠΈΠ»ΠΈ исклучитСлни. Π·Π½Π°ΠΌ ΠΊΠ°ΠΊΠΎ, сС Π΅ класично ΠΈ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΠ°Ρ‚ΠΈ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, јас користСв сличСн пристап ΠΏΡ€Π΅Π΄ 20 Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π½Π° Oracle) Π‘Π°ΠΌΠΎ Ρ€Π΅ΡˆΠΈΠ² Π΄Π° собСрам сС Π½Π° Π΅Π΄Π½ΠΎ мСсто. Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π΅ΠΊΠΎΠΌΡƒ Π΄ΠΎΠ±Ρ€ΠΎ Π΄Π° ΠΌΡƒ дојдС. Како ΡˆΡ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ‚Π°, доста чСсто иста идСја Π΄ΠΎΠ°Ρ“Π° Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π»ΡƒΡ“Π΅ нСзависно. И корисно Π΅ Π΄Π° Π³ΠΎ Ρ‡ΡƒΠ²Π°Ρ‚Π΅ Π·Π° сСбС ΠΊΠ°ΠΊΠΎ сувСнир.

Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, Π½ΠΈΡˆΡ‚ΠΎ Π½Π° овој свСт Π½Π΅ Π΅ ΡΠΎΠ²Ρ€ΡˆΠ΅Π½ΠΎ, Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ Π·Π° ΠΆΠ°Π» сС ΠΌΠΎΠΆΠ½ΠΈ. ΠšΡ€ΠΈΡ‚ΠΈΠΊΠΈΡ‚Π΅ ΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ сС силно Π΄ΠΎΠ±Ρ€Π΅Π΄ΠΎΡ˜Π΄Π΅Π½ΠΈ ΠΈ ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½ΠΈ, Π° ΡƒΡˆΡ‚Π΅ Π΅Π΄Π΅Π½ ΠΌΠ°Π» Π΄Π΅Ρ‚Π°Ρ™ - ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° сС ΠΈΡΠΏΡƒΡˆΡ‚Π΅Π½ΠΈ. Π‘Π΅ΠΏΠ°ΠΊ, сè ΡƒΡˆΡ‚Π΅ сС користи Π²ΠΎ вистински Ρ€Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π—Π½Π°Ρ‡ΠΈ, написот Π΅ само скица ΠΈ опис Π½Π° ΠΎΠΏΡˆΡ‚ΠΈΠΎΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚, Π½ΠΈΡˆΡ‚ΠΎ повСќС. Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ Ρ†Π΅Π»ΠΎΠΊΡƒΠΏΠ½Π°Ρ‚Π° слика.

ΠžΠΏΡˆΡ‚Π°Ρ‚Π° идСја Π΅ β€žΡ€Π°Π·Π΄Π΅Π»ΠΈ ΠΈ владСј, ΡΠΊΡ€ΠΈΡ˜ ΠΈ ΠΏΠΎΡΠ΅Π΄ΡƒΠ²Π°Ρ˜β€œ

Π˜Π΄Π΅Ρ˜Π°Ρ‚Π° Π΅ класична - посСбна шСма Π·Π° Ρ‚Π°Π±Π΅Π»ΠΈ, посСбна шСма Π·Π° складирани Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
ΠšΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π΅ΠΌΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ пристап Π΄ΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅. Π‘Γ¨ ΡˆΡ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ Π΅ Π΄Π° ја ΠΏΠΎΠ²ΠΈΠΊΠ° Π·Π°Ρ‡ΡƒΠ²Π°Π½Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΈ Π΄Π° Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ‚ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€.

Π£Π»ΠΎΠ³ΠΈ

CREATE ROLE store;

CREATE ROLE sys_functions;

CREATE ROLE loc_audit_functions;

CREATE ROLE service_functions;

CREATE ROLE business_functions;

Π¨Π΅ΠΌΠΈ

Π¨Π΅ΠΌΠ° Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° маса

Π¦Π΅Π»Π½ΠΈ Ρ‚Π°Π±Π΅Π»ΠΈ ΠΊΠΎΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ ΡΡƒΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ.

CREATE SCHEMA store AUTHORIZATION store ;

Π”ΠΈΡ˜Π°Π³Ρ€Π°ΠΌ Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π½Π° систСмот

БистСмски Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, особСно Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π°.

CREATE SCHEMA sys_functions AUTHORIZATION sys_functions ;

Π›ΠΎΠΊΠ°Π»Π½Π° рСвизорска шСма

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚Π°Π±Π΅Π»ΠΈ Π·Π° ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π° Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° Ρ†Π΅Π»Π½ΠΈΡ‚Π΅ Ρ‚Π°Π±Π΅Π»ΠΈ.

CREATE SCHEMA loc_audit_functions AUTHORIZATION loc_audit_functions;

Π”ΠΈΡ˜Π°Π³Ρ€Π°ΠΌ Π·Π° сСрвисна Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° сСрвис ΠΈ DML Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

CREATE SCHEMA service_functions AUTHORIZATION service_functions;

Π”ΠΈΡ˜Π°Π³Ρ€Π°ΠΌ Π·Π° Π΄Π΅Π»ΠΎΠ²Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° Ρ„ΠΈΠ½Π°Π»Π½ΠΈ Π΄Π΅Π»ΠΎΠ²Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ΠΈ ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚.

CREATE SCHEMA business_functions AUTHORIZATION business_functions;

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

Π£Π»ΠΎΠ³Π° - Π’Π΅Π»ΠΈΠΊΠ° Π‘Ρ€ΠΈΡ‚Π°Π½ΠΈΡ˜Π° ΠΈΠΌΠ° цСлосСн пристап Π΄ΠΎ ситС шСми (ΠΎΠ΄Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΠ΄ ΡƒΠ»ΠΎΠ³Π°Ρ‚Π° Π½Π° сопствСник Π½Π° 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

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