Ihe mkpali maka ide ihe osise a bụ akụkọ
O yiri ihe na-adọrọ mmasị na otu echiche ahụ - "mejuputa mgbagha azụmahịa na nchekwa data".
Ọ bụghị naanị m ka batara n'uche.
Ọzọkwa, maka ọdịnihu, achọrọ m ichekwa, nke mbụ, maka onwe m, ihe ndị na-akpali mmasị nke bilitere n'oge mmejuputa. Karịsịa n'ịtụle na n'oge na-adịbeghị anya, e mere mkpebi atụmatụ iji gbanwee ụkpụrụ ụlọ na ịnyefe echiche azụmahịa na ọkwa azụ azụ. Nke mere na ihe niile emepụtara ga-abụ ihe na-abaghị uru nye onye ọ bụla n'oge na-adịghị anya ma ọ dịghị amasị onye ọ bụla.
Ụzọ ndị akọwara abụghị ụdị nchoputa ma ọ bụ pụrụ iche. mara otú, ihe niile bụ kpochapụwo na etinyere ya ọtụtụ oge (dịka ọmụmaatụ, ejiri m usoro yiri nke ahụ 20 afọ gara aga na Oracle) M kpebiri ịnakọta ihe niile n'otu ebe. Ọ bụrụ na ọ baara mmadụ uru. Dị ka omume gosiri, ọtụtụ mgbe otu echiche na-abịara ndị dị iche iche onwe ha. Ma ọ bara uru idowe ya maka onwe gị dị ka ihe ncheta.
N'ezie, ọ dịghị ihe n'ụwa a zuru okè, mmejọ na typos bụ mwute ikwu na o kwere omume. A na-anabata nkatọ na nkọwa ma na-atụ anya ya. N'agbanyeghị nke ahụ, a ka na-eji ihe niile na-arụ ọrụ n'ezie. Yabụ, isiokwu ahụ bụ naanị eserese na nkọwa nke echiche izugbe, ọ nweghị ihe ọzọ. Enwere m olileanya na enwere nkọwa zuru oke iji ghọta foto zuru ezu.
Echiche izugbe bụ "kewaa na merie, zoo ma nwe ya"
Echiche a bụ kpochapụwo - atụmatụ dị iche iche maka tebụl, atụmatụ dị iche iche maka ọrụ echekwara.
Onye ahịa ahụ enweghị ohere ịnweta data ozugbo. Ihe niile onye ahịa nwere ike ime bụ ịkpọ ọrụ echekwara ma hazie nzaghachi natara.
Ọrụ
CREATE ROLE store;
CREATE ROLE sys_functions;
CREATE ROLE loc_audit_functions;
CREATE ROLE service_functions;
CREATE ROLE business_functions;
Atụmatụ
Atụmatụ nchekwa tebụl
Tebụl dị iche iche na-emejuputa ihe dị n'ime isiokwu.
CREATE SCHEMA store AUTHORIZATION store ;
Eserese ọrụ sistemụ
Ọrụ sistemu, ọkachasị maka mgbanwe mgbanwe tebụl.
CREATE SCHEMA sys_functions AUTHORIZATION sys_functions ;
Atụmatụ nyocha mpaghara
Ọrụ na tebụl iji mejuputa nyocha mpaghara nke mmezu nke ọrụ echekwara na mgbanwe na tebụl ezubere iche.
CREATE SCHEMA loc_audit_functions AUTHORIZATION loc_audit_functions;
Eserese ọrụ ọrụ
Ọrụ maka ọrụ yana ọrụ DML.
CREATE SCHEMA service_functions AUTHORIZATION service_functions;
Eserese ọrụ azụmahịa
Ọrụ maka ọrụ azụmahịa ikpeazụ nke onye ahịa na-akpọ.
CREATE SCHEMA business_functions AUTHORIZATION business_functions;
Ikike ịnweta
Ọrụ - DBA nwere ohere zuru oke na schema niile (kewapụrụ na ọrụ onye nwe 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;
Ọrụ - OJI nwere ihe ùgwù IWU na eserese ọrụ_azụmaahịa.
CREATE ROLE user_role;
Ihe ùgwù n'etiti atụmatụ
NYE
Ebe ọ bụ na a na-emepụta ọrụ niile na njirimara Nkọwapụta nchekwa ntuziaka chọrọ Kagbuo igbu na ọrụ niile… SITE ọha;
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 ;
Ya mere atụmatụ nchekwa data dị njikere. Ị nwere ike ịmalite dejupụta data.
Tebụl ndị ebumnuche
Ịmepụta tebụl dị obere. Enweghị atụmatụ pụrụ iche, belụsọ na e kpebiri na ọ gaghị eji Usoro ma mepụta usoro n'ụzọ doro anya. Na mgbakwunye, n'ezie, kacha ojiji ntuziaka
COMMENT ON ...
Okwu maka всех ihe, na-enweghị isi.
Nyocha mpaghara
Iji debanye aha na mmezu nke ọrụ echekwara na mgbanwe na tebụl ndị e lekwasịrị anya, a na-eji tebụl nyocha mpaghara, nke gụnyere, n'etiti ihe ndị ọzọ, nkọwa nke njikọ ndị ahịa, akara nke modul a na-akpọ, na ụkpụrụ n'ezie nke ntinye na ihe nrụpụta n'ụdị JSON.
Ọrụ sistemu
Ezubere maka mgbanwe osisi na tebụl ebumnuche. Ha bụ ọrụ mkpali.
Template - ọrụ sistemụ
---------------------------------------------------------
-- 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 ();
Ọrụ ọrụ
Ezubere iji mejuputa ọrụ yana ọrụ DML na tebụl ebumnuche.
Template - ọrụ ọrụ
--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;
Ọrụ azụmahịa
Ezubere maka ọrụ azụmaahịa ikpeazụ nke onye ahịa na-akpọ. Ha na-alọghachi mgbe niile - JSON. Iji gbochie ma tinye mperi mmejọ, jiri ngọngọ NGANYA.
Template - ọrụ azụmahịa
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;
Nsonaazụ
Iji kọwaa foto n'ozuzu, echere m na ọ zuru oke. Ọ bụrụ na onye ọ bụla nwere mmasị na nkọwa na nsonaazụ ya, dee nkọwa, m ga-enwe obi ụtọ ịgbakwunye mmetụ ọzọ na foto a.
PS
Ịbanye mperi dị mfe - ụdị ntinye paramita
-[ 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"" | }
isi: www.habr.com