์ด ์ค์ผ์น๋ฅผ ์ฐ๊ฒ ๋ ์๋๋ ฅ์ ๊ธฐ์ฌ์์ต๋๋ค.
๊ฐ์ ์๊ฐ์ด ํฅ๋ฏธ๋ก์ ๋ณด์์ต๋๋ค. "๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ".
๋๋ง ์๊ฐ๋ ๊ฒ ์๋์๋ค.
๋ํ ๋ฏธ๋๋ฅผ ์ํด ์ฐ์ ๊ตฌํ ๊ณผ์ ์์ ๋ฐ์ํ ํฅ๋ฏธ๋ก์ด ๋ฐ์ ์ ๋ณด์กดํ๊ณ ์ถ์์ต๋๋ค. ํนํ ๋น๊ต์ ์ต๊ทผ์ ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐฑ์๋ ์์ค์ผ๋ก ์ด์ ํ๊ธฐ ์ํ ์ ๋ต์ ๊ฒฐ์ ์ด ๋ด๋ ค์ก๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ๊ณง ๋๊ตฌ์๊ฒ๋ ์ธ๋ชจ๊ฐ ์๊ณ ๋๊ตฌ์๊ฒ๋ ๊ด์ฌ์ด ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ค๋ช ๋ ๋ฐฉ๋ฒ์ ์ผ์ข ์ ๋ฐ๊ฒฌ์ด๋ ์์ธ๊ฐ ์๋๋๋ค. ๋ ธํ์ฐ, ๋ชจ๋ ๊ฒ์ด ๊ณ ์ ์ ์ด๋ฉฐ ์ฌ๋ฌ ๋ฒ ๊ตฌํ๋์์ต๋๋ค.(์๋ฅผ ๋ค์ด ์ ๋ 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;
์ญํ - USER ํน๊ถ์ด ์๋ค ์คํ ๋ค์ด์ด๊ทธ๋จ์์ ๋น์ฆ๋์ค_๊ธฐ๋ฅ.
CREATE ROLE user_role;
์ฒด๊ณ ๊ฐ ๊ถํ
GRANT
๋ชจ๋ ํจ์๋ ์์ฑ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ ์์ ํ์ํ ์ง์นจ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํ ์คํ ์ทจ์โฆ ๊ณต๊ฐ;
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"" | }
์ถ์ฒ : habr.com