ืžื—ืงืจ ืขืœ ื”ื˜ืžืขืช ืœื•ื’ื™ืงื” ืขืกืงื™ืช ื‘ืจืžื” ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืžืื•ื—ืกื ื•ืช PostgreSQL

ื”ื“ื—ืฃ ืœื›ืชื™ื‘ืช ืžืขืจื›ื•ืŸ ื–ื” ื”ื™ื” ื”ืžืืžืจ "ื‘ืžื”ืœืš ื”ื”ืกื’ืจ, ืขื•ืžืก ื”ืขื‘ื•ื“ื” ื’ื“ืœ ืคื™ 5, ืื‘ืœ ื”ื™ื™ื ื• ืžื•ื›ื ื™ื". ืื™ืš ืขื‘ืจื” Lingualeo ืœ-PostgreSQL ืขื 23 ืžื™ืœื™ื•ืŸ ืžืฉืชืžืฉื™ื. ื’ื ืื ื™ ืžืฆืืชื™ ืืช ื”ืžืืžืจ ืฉืคื•ืจืกื ืœืคื ื™ 4 ืฉื ื™ื ืžืขื ื™ื™ืŸ - ื”ื˜ืžืขืช ืœื•ื’ื™ืงื” ืขืกืงื™ืช ื‘-MySQL.

ื–ื” ื ืจืื” ืžืขื ื™ื™ืŸ ืฉืื•ืชื” ืžื—ืฉื‘ื” - "ืœื™ื™ืฉื ื”ื™ื’ื™ื•ืŸ ืขืกืงื™ ื‘ืžืกื“ ื”ื ืชื•ื ื™ื".

ืžื—ืงืจ ืขืœ ื”ื˜ืžืขืช ืœื•ื’ื™ืงื” ืขืกืงื™ืช ื‘ืจืžื” ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืžืื•ื—ืกื ื•ืช PostgreSQL

ืœื ืจืง ืื ื™ ืขืœื” ื‘ื“ืขืชื™.

ื›ืžื• ื›ืŸ, ืœืขืชื™ื“ ืจืฆื™ืชื™ ืœืฉืžืจ, ืงื•ื“ื ื›ืœ, ืœืขืฆืžื™ ื”ืชืคืชื—ื•ื™ื•ืช ืžืขื ื™ื™ื ื•ืช ืฉืขืœื• ื‘ืžื”ืœืš ื”ื™ื™ืฉื•ื. ื‘ืžื™ื•ื—ื“ ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉืœืื—ืจื•ื ื” ื™ื—ืกื™ืช ื”ืชืงื‘ืœื” ื”ื—ืœื˜ื” ืืกื˜ืจื˜ื’ื™ืช ืœืฉื ื•ืช ืืช ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืœื”ืขื‘ื™ืจ ืืช ื”ื”ื™ื’ื™ื•ืŸ ื”ืขืกืงื™ ืœืจืžืช ื”-backend. ื›ืš ืฉื›ืœ ืžื” ืฉืคื•ืชื— ืœื ื™ื•ืขื™ืœ ื‘ืžื”ืจื” ืœืื™ืฉ ื•ืœื ื™ืขื ื™ื™ืŸ ืืฃ ืื—ื“.

ื”ืฉื™ื˜ื•ืช ื”ืžืชื•ืืจื•ืช ืื™ื ืŸ ืกื•ื’ ืฉืœ ื’ื™ืœื•ื™ ืื• ื—ืจื™ื’ื•ืช ื™ื•ื“ืข ืื™ืš, ื”ื›ืœ ืงืœืืกื™ ื•ื™ื•ืฉื ื›ืžื” ืคืขืžื™ื (ืœื“ื•ื’ืžื”, ื”ืฉืชืžืฉืชื™ ื‘ื’ื™ืฉื” ื“ื•ืžื” ืœืคื ื™ 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;

ื’ื™ืฉื” ืœื–ื›ื•ื™ื•ืช

ืชืคืงื™ื“ - DBA ื‘ืขืœ ื’ื™ืฉื” ืžืœืื” ืœื›ืœ ื”ืกื›ืžื•ืช (ืžื•ืคืจื“ื•ืช ืžืชืคืงื™ื“ ื”ื‘ืขืœื™ื ืฉืœ 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;

ืกืš ื”ื›ืœ

ื›ื“ื™ ืœืชืืจ ืืช ื”ืชืžื•ื ื” ื”ื›ืœืœื™ืช, ืื ื™ ื—ื•ืฉื‘ ืฉื–ื” ื“ื™ ืžืกืคื™ืง. ืื ืžื™ืฉื”ื• ืžืชืขื ื™ื™ืŸ ื‘ืคืจื˜ื™ื ื•ื‘ืชื•ืฆืื•ืช, ื›ืชื‘ื• ืชื’ื•ื‘ื•ืช, ืืฉืžื— ืœื”ื•ืกื™ืฃ ื ื’ื™ืขื•ืช ื ื•ืกืคื•ืช ืœืชืžื•ื ื”.

ื .ื‘.

ืจื™ืฉื•ื ืฉื’ื™ืื” ืคืฉื•ื˜ื” - ืกื•ื’ ืคืจืžื˜ืจ ืงืœื˜

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”