175 lines
6.1 KiB
SQL
175 lines
6.1 KiB
SQL
-- ============================================================
|
|
-- 55_reapply_kb_vpd_after_table_reload.sql
|
|
--
|
|
-- KB 원장을 DROP/CREATE 또는 재적재한 뒤 실행한다.
|
|
-- 테이블 재생성으로 사라진 POC_2 KB VPD/CLS 정책과 CB_ORDS SELECT
|
|
-- 권한만 복구한다. 사용자·역할·권한 조건과 Bearer 토큰은 변경하지 않는다.
|
|
-- Execute as ADMIN using SQLcl.
|
|
-- ============================================================
|
|
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
|
SET ECHO OFF
|
|
SET FEEDBACK ON
|
|
SET DEFINE OFF
|
|
|
|
PROMPT === 1. Validating reloaded KB table contract ===
|
|
DECLARE
|
|
PROCEDURE require_column(p_table_name IN VARCHAR2, p_column_name IN VARCHAR2) IS
|
|
v_count NUMBER;
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO v_count
|
|
FROM all_tab_columns
|
|
WHERE owner = 'POC_2'
|
|
AND table_name = p_table_name
|
|
AND column_name = p_column_name;
|
|
IF v_count = 0 THEN
|
|
RAISE_APPLICATION_ERROR(-20001, 'Required column is missing: POC_2.' || p_table_name || '.' || p_column_name);
|
|
END IF;
|
|
END;
|
|
|
|
PROCEDURE require_runtime_object(p_object_name IN VARCHAR2, p_object_type IN VARCHAR2) IS
|
|
v_count NUMBER;
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO v_count
|
|
FROM all_objects
|
|
WHERE owner = 'ADMIN'
|
|
AND object_name = p_object_name
|
|
AND object_type = p_object_type
|
|
AND status = 'VALID';
|
|
IF v_count = 0 THEN
|
|
RAISE_APPLICATION_ERROR(-20002, 'Required runtime object is invalid: ADMIN.' || p_object_name);
|
|
END IF;
|
|
END;
|
|
BEGIN
|
|
require_column('KB_STAKEHOLDERS', 'USER_ID');
|
|
require_column('KB_STAKEHOLDERS', 'ROLE');
|
|
require_column('KB_STAKEHOLDERS', 'CHANNEL');
|
|
require_column('KB_CONTRACTS', 'CUST_ID');
|
|
require_column('KB_CONTRACTS', 'CONTRACT_NO');
|
|
require_column('KB_CONTRACTS', 'FC_ID');
|
|
require_column('KB_CONTRACTS', 'FC_CHANNEL');
|
|
require_column('KB_CUSTOMERS', 'CUST_ID');
|
|
require_column('KB_CUSTOMERS', 'CUST_NM');
|
|
require_column('KB_CUSTOMERS', 'RRN_MASKED');
|
|
require_column('KB_COVERAGES', 'CUST_ID');
|
|
require_column('KB_CLAIMS', 'CUST_ID');
|
|
require_column('KB_CLAIMS', 'CLAIM_AMT');
|
|
require_column('KB_CLAIMS', 'PAID_AMT');
|
|
require_column('KB_EXTERNAL_HOLDINGS', 'CUST_ID');
|
|
require_column('KB_EXTERNAL_HOLDINGS', 'EXT_INSURER');
|
|
require_column('KB_EXTERNAL_HOLDINGS', 'EXT_PRODUCT_GRP');
|
|
require_column('KB_EXTERNAL_HOLDINGS', 'EXT_PRODUCT_TYPE');
|
|
|
|
require_runtime_object('CB_AGENT_CTX_PKG', 'PACKAGE');
|
|
require_runtime_object('CB_AGENT_CTX_PKG', 'PACKAGE BODY');
|
|
require_runtime_object('CB_AGENT_DOC_VPD_FILTER', 'FUNCTION');
|
|
require_runtime_object('CB_AGENT_CAN_READ_COLUMN', 'FUNCTION');
|
|
END;
|
|
/
|
|
|
|
PROMPT === 2. Restoring CB_ORDS runtime grants ===
|
|
GRANT SELECT ON POC_2.KB_STAKEHOLDERS TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_CUSTOMERS TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_PRODUCTS TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_CONTRACTS TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_COVERAGES TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_CLAIMS TO CB_ORDS;
|
|
GRANT SELECT ON POC_2.KB_EXTERNAL_HOLDINGS TO CB_ORDS;
|
|
GRANT EXECUTE ON CB_AGENT_CTX_PKG TO CB_ORDS;
|
|
GRANT EXECUTE ON CB_AGENT_DOC_VPD_FILTER TO CB_ORDS;
|
|
GRANT EXECUTE ON CB_AGENT_CAN_READ_COLUMN TO CB_ORDS;
|
|
|
|
PROMPT === 3. Reapplying row VPD policies ===
|
|
DECLARE
|
|
PROCEDURE replace_row_policy(p_object_name IN VARCHAR2) IS
|
|
v_count NUMBER;
|
|
v_policy_name VARCHAR2(128) := 'KB_' || p_object_name || '_ROW_POLICY';
|
|
BEGIN
|
|
SELECT COUNT(*)
|
|
INTO v_count
|
|
FROM all_policies
|
|
WHERE object_owner = 'POC_2'
|
|
AND object_name = p_object_name
|
|
AND policy_name = v_policy_name;
|
|
IF v_count > 0 THEN
|
|
DBMS_RLS.DROP_POLICY(
|
|
object_schema => 'POC_2',
|
|
object_name => p_object_name,
|
|
policy_name => v_policy_name
|
|
);
|
|
END IF;
|
|
DBMS_RLS.ADD_POLICY(
|
|
object_schema => 'POC_2',
|
|
object_name => p_object_name,
|
|
policy_name => v_policy_name,
|
|
function_schema => 'ADMIN',
|
|
policy_function => 'CB_AGENT_DOC_VPD_FILTER',
|
|
statement_types => 'SELECT',
|
|
policy_type => DBMS_RLS.DYNAMIC,
|
|
enable => TRUE
|
|
);
|
|
END;
|
|
BEGIN
|
|
replace_row_policy('KB_STAKEHOLDERS');
|
|
replace_row_policy('KB_CUSTOMERS');
|
|
replace_row_policy('KB_PRODUCTS');
|
|
replace_row_policy('KB_CONTRACTS');
|
|
replace_row_policy('KB_COVERAGES');
|
|
replace_row_policy('KB_CLAIMS');
|
|
replace_row_policy('KB_EXTERNAL_HOLDINGS');
|
|
END;
|
|
/
|
|
|
|
PROMPT === 4. Removing deprecated VPD column NULL policies ===
|
|
-- Architecture rule: VPD filters rows only. Column masking is handled solely
|
|
-- by ASO / DBMS_REDACT through 63_kb_aso_masking_rule_runtime.sql.
|
|
DECLARE
|
|
PROCEDURE drop_column_policy(p_object_name IN VARCHAR2, p_policy_name IN VARCHAR2) IS
|
|
BEGIN
|
|
DBMS_RLS.DROP_POLICY(
|
|
object_schema => 'POC_2', object_name => p_object_name, policy_name => p_policy_name
|
|
);
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
-- A missing policy is already the desired state. Do not hide other errors.
|
|
IF SQLCODE != -28102 THEN RAISE; END IF;
|
|
END;
|
|
BEGIN
|
|
drop_column_policy('KB_CUSTOMERS', 'KB_CUST_NM_CLS_POLICY');
|
|
drop_column_policy('KB_CUSTOMERS', 'KB_RRN_CLS_POLICY');
|
|
drop_column_policy('KB_CLAIMS', 'KB_CLAIM_AMT_CLS_POLICY');
|
|
drop_column_policy('KB_CLAIMS', 'KB_PAID_AMT_CLS_POLICY');
|
|
drop_column_policy('KB_EXTERNAL_HOLDINGS', 'KB_EXT_INSURER_CLS_POLICY');
|
|
drop_column_policy('KB_EXTERNAL_HOLDINGS', 'KB_EXT_PRODUCT_GRP_CLS_POLICY');
|
|
drop_column_policy('KB_EXTERNAL_HOLDINGS', 'KB_EXT_PRODUCT_TYPE_CLS_POLICY');
|
|
END;
|
|
/
|
|
|
|
PROMPT === 5. Verification ===
|
|
SELECT object_name,
|
|
COUNT(*) AS policy_count,
|
|
LISTAGG(policy_name, ', ') WITHIN GROUP (ORDER BY policy_name) AS policy_names
|
|
FROM all_policies
|
|
WHERE object_owner = 'POC_2'
|
|
AND object_name IN (
|
|
'KB_CUSTOMERS', 'KB_PRODUCTS', 'KB_CONTRACTS', 'KB_COVERAGES',
|
|
'KB_CLAIMS', 'KB_EXTERNAL_HOLDINGS', 'KB_STAKEHOLDERS'
|
|
)
|
|
GROUP BY object_name
|
|
ORDER BY object_name;
|
|
|
|
SELECT table_name, grantee, privilege
|
|
FROM all_tab_privs
|
|
WHERE table_schema = 'POC_2'
|
|
AND grantee = 'CB_ORDS'
|
|
AND privilege = 'SELECT'
|
|
AND table_name IN (
|
|
'KB_CUSTOMERS', 'KB_PRODUCTS', 'KB_CONTRACTS', 'KB_COVERAGES',
|
|
'KB_CLAIMS', 'KB_EXTERNAL_HOLDINGS', 'KB_STAKEHOLDERS'
|
|
)
|
|
ORDER BY table_name;
|
|
|
|
PROMPT === KB VPD/CLS restoration complete ===
|
|
EXIT
|