Uphononongo malunga nokuphumeza ingqiqo yoshishino kwinqanaba le-PostgreSQL egciniweyo imisebenzi

Impembelelo yokubhala lo mzobo yayilinqaku “Ngexesha lokuvalelwa umntu yedwa, umsebenzi wonyuke izihlandlo ezi-5, kodwa besilungile.” Indlela uLingualeo eye ngayo kwiPostgreSQL enabasebenzisi abazizigidi ezingama-23. Ndifumene inqaku elipapashwe kwiminyaka eyi-4 eyadlulayo linomdla - Ukuphumeza ingqiqo yeshishini kwiMySQL.

Kwakubonakala kunomdla ukuba ingcamango efanayo - "sebenzisa ingqiqo yoshishino kwisiseko sedatha".

Uphononongo malunga nokuphumeza ingqiqo yoshishino kwinqanaba le-PostgreSQL egciniweyo imisebenzi

Yayingendim kuphela owathi qatha engqondweni.

Kwakhona, kwixesha elizayo, ndandifuna ukugcina, okokuqala, kum, uphuhliso olunomdla olwavela ngexesha lokuphunyezwa. Ngokukodwa ngokuqwalasela ukuba kutsha nje kuye kwenziwa isigqibo esicwangcisiweyo sokutshintsha i-architecture kunye nokudlulisa ingqiqo yeshishini kwinqanaba le-backend. Ukuze yonke into ephuhlisiwe kungekudala ingabi namsebenzi nakubani kwaye ayiyi kuba nomdla nakubani na.

Iindlela ezichaziweyo ayilohlobo oluthile lokufunyanwa okanye olukhethekileyo. uyazi njani, yonke into i-classic kwaye iphunyezwe ngamaxesha amaninzi (umzekelo, ndasebenzisa indlela efanayo kwiminyaka eyi-20 edlulileyo kwi-Oracle) Ndagqiba ekubeni ndiqokelele yonke into kwindawo enye. Kwimeko apho iza luncedo kumntu. Njengoko uqheliselo lubonisile, kaninzi ingcamango efanayo iza kubantu abohlukeneyo ngokuzimeleyo. Kwaye kuluncedo ukuzigcinela yona njengesikhumbuzo.

Ngokuqinisekileyo, akukho nto kweli hlabathi igqibeleleyo, iimpazamo kunye neetypos ngelishwa zinokwenzeka. Ukugxekwa kunye nezimvo zamkelwe ngamandla kwaye ziyalindeleka.Kwaye enye inkcukacha encinci ngakumbi - iinkcukacha ezithe ngqo zophumezo azifakwanga. Nangona kunjalo, yonke into isasetyenziswa kwiprojekthi esebenzayo. Ngoko, inqaku lingumzobo nje kunye nenkcazo yengcamango jikelele, akukho nto. Ndiyathemba ukuba kukho iinkcukacha ezaneleyo zokuqonda umfanekiso opheleleyo.

Umbono jikelele "ukwahlula kwaye unqobe, ufihle kwaye ube ngumnikazi"

Ingcamango yeklasikhi - i-schema eyahlukileyo yeetafile, i-schema eyahlukileyo kwimisebenzi egciniweyo.
Umxhasi akanakho ukufikelela kwidatha ngokuthe ngqo. Yonke into eyenziwa ngumxhasi kukufowunela umsebenzi ogciniweyo kwaye iqhubekisele phambili impendulo efunyenweyo.

Iindima

CREATE ROLE store;

CREATE ROLE sys_functions;

CREATE ROLE loc_audit_functions;

CREATE ROLE service_functions;

CREATE ROLE business_functions;

Inkqubo

Iskimu sogcino lwetafile

Iitheyibhile ekujoliswe kuzo eziphumeza amaqumrhu ezifundo.

CREATE SCHEMA store AUTHORIZATION store ;

Idayagram yomsebenzi wenkqubo

Imisebenzi yenkqubo, ngakumbi yotshintsho lwetafile yokuloga.

CREATE SCHEMA sys_functions AUTHORIZATION sys_functions ;

Iskim sophicotho lwendawo

Imisebenzi kunye neetheyibhile ukuphumeza uphicotho lwendawo yokwenziwa kwemisebenzi egciniweyo kunye notshintsho kwiitheyibhile ekujoliswe kuzo.

CREATE SCHEMA loc_audit_functions AUTHORIZATION loc_audit_functions;

Idayagram yomsebenzi wenkonzo

Imisebenzi yenkonzo kunye nemisebenzi ye-DML.

CREATE SCHEMA service_functions AUTHORIZATION service_functions;

Idayagram yomsebenzi weshishini

Imisebenzi yemisebenzi yokugqibela yeshishini ebizwa ngokuba ngumxhasi.

CREATE SCHEMA business_functions AUTHORIZATION business_functions;

Amalungelo okufikelela

Indima - DBA inofikelelo olupheleleyo kuzo zonke izikim (zahlulwe kwindima yoMnini weDB).

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;

Indima - UMSEBENZI unelungelo UMGWEBI kumzobo ishishini_imisebenzi.

CREATE ROLE user_role;

Amalungelo phakathi kwamacebo

ISibonelelo
Ekubeni yonke imisebenzi idalwe kunye nophawu ISIQINISEKISO SOKHUSELEKO imiyalelo efunekayo PHAMBISA UKWENZA KUWO WONKE UMSEBENZI… KULUNTU;

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 ;

Ngoko i-schema yedatha ilungile. Unokuqala ukugcwalisa idatha.

Iitafile ekujoliswe kuzo

Ukudala iitafile kuyinto encinci. Akukho zimpawu zikhethekileyo, ngaphandle kokuba kwagqitywa ukuba zingasetyenziswa INKONZO kwaye uvelise ulandelelwano ngokucacileyo. Ngaphezu koko, ngokuqinisekileyo, ukusetyenziswa okuphezulu kwemiyalelo

COMMENT ON ...

Izimvo ze всех izinto, ngaphandle kokukhetha.

Uphicotho-zincwadi lwasekuhlaleni

Ukuloga ukuphunyezwa kwemisebenzi egciniweyo kunye notshintsho kwiitheyibhile ekujoliswe kuzo, itafile yophicotho lwendawo isetyenziswa, ebandakanya, phakathi kwezinye izinto, iinkcukacha zoqhagamshelo lomxhasi, ileyibhile yemodyuli ebizwa ngokuba yimodyuli, kunye namaxabiso angawo egalelo kwaye imveliso yeparameters ngohlobo lwe JSON.

Imisebenzi yenkqubo

Yenzelwe ukuloga utshintsho kwiitheyibhile ekujoliswe kuzo. Ziyimisebenzi yokuqalisa.

Template - umsebenzi wenkqubo

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

Imisebenzi yenkonzo

Yenzelwe ukuphumeza inkonzo kunye nemisebenzi ye-DML kwiitheyibhile ekujoliswe kuzo.

Template - umsebenzi wenkonzo

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

Imisebenzi yeshishini

Yenzelwe imisebenzi yokugqibela yeshishini ebizwa ngokuba ngumxhasi. Bahlala bebuya - JSON. Ukuthintela kunye nokuloga iimpazamo zokwenziwa, sebenzisa ibhloko UKUXELWA.

Itemplate - umsebenzi weshishini

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;

Isiphumo

Ukuchaza umfanekiso oqhelekileyo, ndicinga ukuba kwanele. Ukuba nabani na unomdla kwiinkcukacha kunye neziphumo, bhala izimvo, ndiya kuvuya ukongeza iimpembelelo ezongezelelweyo kumfanekiso.

PS

Ukuloga imposiso elula - uhlobo lwepharamitha yegalelo

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

umthombo: www.habr.com

Yongeza izimvo