diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/03_MARS_835_PREHOOK_update_SOURCE_FILE_RECEIVED_table.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/03_MARS_835_PREHOOK_update_SOURCE_FILE_RECEIVED_table.sql new file mode 100644 index 0000000..c3996bf --- /dev/null +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/03_MARS_835_PREHOOK_update_SOURCE_FILE_RECEIVED_table.sql @@ -0,0 +1,70 @@ +-- ==================================================================== +-- MARS-835-PREHOOK: Update A_SOURCE_FILE_RECEIVED Table Structure +-- ==================================================================== +-- Purpose: +-- 1. Rename column ARCH_FILE_NAME to ARCH_PATH +-- 2. Add new column PROCESS_NAME VARCHAR2(200) +-- Author: System Generated +-- Date: 2026-02-13 +-- ==================================================================== + +SET SERVEROUTPUT ON SIZE UNLIMITED +SET TIMING ON + +PROMPT ==================================================================== +PROMPT MARS-835-PREHOOK: Updating A_SOURCE_FILE_RECEIVED table structure +PROMPT ==================================================================== + +-- Check if column ARCH_FILE_NAME exists +DECLARE + v_column_exists NUMBER; + v_process_name_exists NUMBER; +BEGIN + -- Check if ARCH_FILE_NAME exists + SELECT COUNT(*) + INTO v_column_exists + FROM dba_tab_columns + WHERE owner = 'CT_MRDS' + AND table_name = 'A_SOURCE_FILE_RECEIVED' + AND column_name = 'ARCH_FILE_NAME'; + + IF v_column_exists > 0 THEN + DBMS_OUTPUT.PUT_LINE('INFO: Renaming column ARCH_FILE_NAME to ARCH_PATH...'); + EXECUTE IMMEDIATE 'ALTER TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED RENAME COLUMN ARCH_FILE_NAME TO ARCH_PATH'; + DBMS_OUTPUT.PUT_LINE('SUCCESS: Column renamed to ARCH_PATH'); + ELSE + DBMS_OUTPUT.PUT_LINE('INFO: Column ARCH_FILE_NAME does not exist (already renamed or first install)'); + END IF; + + -- Check if PROCESS_NAME already exists + SELECT COUNT(*) + INTO v_process_name_exists + FROM dba_tab_columns + WHERE owner = 'CT_MRDS' + AND table_name = 'A_SOURCE_FILE_RECEIVED' + AND column_name = 'PROCESS_NAME'; + + IF v_process_name_exists = 0 THEN + DBMS_OUTPUT.PUT_LINE('INFO: Adding new column PROCESS_NAME...'); + EXECUTE IMMEDIATE 'ALTER TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED ADD (PROCESS_NAME VARCHAR2(200))'; + DBMS_OUTPUT.PUT_LINE('SUCCESS: Column PROCESS_NAME added'); + + -- Add comment on new column + EXECUTE IMMEDIATE 'COMMENT ON COLUMN CT_MRDS.A_SOURCE_FILE_RECEIVED.PROCESS_NAME IS ''Name of the process that created this record'''; + DBMS_OUTPUT.PUT_LINE('SUCCESS: Comment added to PROCESS_NAME column'); + ELSE + DBMS_OUTPUT.PUT_LINE('INFO: Column PROCESS_NAME already exists'); + END IF; + + DBMS_OUTPUT.PUT_LINE('SUCCESS: A_SOURCE_FILE_RECEIVED table structure updated successfully'); + +EXCEPTION + WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE('ERROR: Failed to update table structure: ' || SQLERRM); + RAISE; +END; +/ + +PROMPT ==================================================================== +PROMPT A_SOURCE_FILE_RECEIVED Table Update Completed +PROMPT ==================================================================== diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/93_MARS_835_PREHOOK_rollback_SOURCE_FILE_RECEIVED_table.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/93_MARS_835_PREHOOK_rollback_SOURCE_FILE_RECEIVED_table.sql new file mode 100644 index 0000000..8e84c5a --- /dev/null +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/93_MARS_835_PREHOOK_rollback_SOURCE_FILE_RECEIVED_table.sql @@ -0,0 +1,65 @@ +-- ==================================================================== +-- MARS-835-PREHOOK ROLLBACK: Revert A_SOURCE_FILE_RECEIVED Table Structure +-- ==================================================================== +-- Purpose: +-- 1. Rename column ARCH_PATH back to ARCH_FILE_NAME +-- 2. Remove column PROCESS_NAME +-- Author: System Generated +-- Date: 2026-02-13 +-- ==================================================================== + +SET SERVEROUTPUT ON SIZE UNLIMITED +SET TIMING ON + +PROMPT ==================================================================== +PROMPT MARS-835-PREHOOK ROLLBACK: Reverting A_SOURCE_FILE_RECEIVED table +PROMPT ==================================================================== + +DECLARE + v_column_exists NUMBER; + v_process_name_exists NUMBER; +BEGIN + -- Check if ARCH_PATH exists (needs to be renamed back) + SELECT COUNT(*) + INTO v_column_exists + FROM dba_tab_columns + WHERE owner = 'CT_MRDS' + AND table_name = 'A_SOURCE_FILE_RECEIVED' + AND column_name = 'ARCH_PATH'; + + IF v_column_exists > 0 THEN + DBMS_OUTPUT.PUT_LINE('INFO: Renaming column ARCH_PATH back to ARCH_FILE_NAME...'); + EXECUTE IMMEDIATE 'ALTER TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED RENAME COLUMN ARCH_PATH TO ARCH_FILE_NAME'; + DBMS_OUTPUT.PUT_LINE('SUCCESS: Column renamed back to ARCH_FILE_NAME'); + ELSE + DBMS_OUTPUT.PUT_LINE('INFO: Column ARCH_PATH does not exist (already rolled back)'); + END IF; + + -- Check if PROCESS_NAME exists (needs to be dropped) + SELECT COUNT(*) + INTO v_process_name_exists + FROM dba_tab_columns + WHERE owner = 'CT_MRDS' + AND table_name = 'A_SOURCE_FILE_RECEIVED' + AND column_name = 'PROCESS_NAME'; + + IF v_process_name_exists > 0 THEN + DBMS_OUTPUT.PUT_LINE('INFO: Dropping column PROCESS_NAME...'); + EXECUTE IMMEDIATE 'ALTER TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED DROP COLUMN PROCESS_NAME'; + DBMS_OUTPUT.PUT_LINE('SUCCESS: Column PROCESS_NAME dropped'); + ELSE + DBMS_OUTPUT.PUT_LINE('INFO: Column PROCESS_NAME does not exist (already rolled back)'); + END IF; + + DBMS_OUTPUT.PUT_LINE('SUCCESS: A_SOURCE_FILE_RECEIVED table structure rollback completed'); + +EXCEPTION + WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE('ERROR: Failed to rollback table structure: ' || SQLERRM); + RAISE; +END; +/ + +PROMPT ==================================================================== +PROMPT A_SOURCE_FILE_RECEIVED Table Rollback Completed +PROMPT ==================================================================== diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/install_mars835_prehook.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/install_mars835_prehook.sql index 2542116..ff9ed11 100644 --- a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/install_mars835_prehook.sql +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/install_mars835_prehook.sql @@ -31,6 +31,7 @@ PROMPT ========================================================================= PROMPT PROMPT This script will: PROMPT - Create A_PARALLEL_EXPORT_CHUNKS table with unique timestamp task names +PROMPT - Update A_SOURCE_FILE_RECEIVED table (rename ARCH_FILE_NAME to ARCH_PATH, add PROCESS_NAME column) PROMPT - Update ENV_MANAGER to v3.2.0 (add parallel execution error codes) PROMPT - Update DATA_EXPORTER to v2.4.0 (DBMS_PARALLEL_EXECUTE + Smart Column Mapping) PROMPT - Add pParallelDegree parameter (1-16 threads) to EXPORT_*_BY_DATE procedures @@ -71,13 +72,19 @@ PROMPT ========================================================================= PROMPT PROMPT ========================================================================= -PROMPT Step 4: Track Package Versions +PROMPT Step 4: Update A_SOURCE_FILE_RECEIVED Table Structure +PROMPT ========================================================================= +@@03_MARS_835_PREHOOK_update_SOURCE_FILE_RECEIVED_table.sql + +PROMPT +PROMPT ========================================================================= +PROMPT Step 5: Track Package Versions PROMPT ========================================================================= @@track_package_versions.sql PROMPT PROMPT ========================================================================= -PROMPT Step 5: Verify Package Versions +PROMPT Step 6: Verify Package Versions PROMPT ========================================================================= @@verify_packages_version.sql diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/A_SOURCE_FILE_RECEIVED.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/A_SOURCE_FILE_RECEIVED.sql new file mode 100644 index 0000000..b67d6b5 --- /dev/null +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/A_SOURCE_FILE_RECEIVED.sql @@ -0,0 +1,30 @@ +-- ==================================================================== +-- A_SOURCE_FILE_RECEIVED Table +-- ==================================================================== +-- Purpose: Track received files and their processing status +-- ==================================================================== + +CREATE TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED ( + A_SOURCE_FILE_RECEIVED_KEY NUMBER(38,0) NOT NULL ENABLE, + A_SOURCE_FILE_CONFIG_KEY NUMBER(38,0) NOT NULL ENABLE, + SOURCE_FILE_NAME VARCHAR2(1000) NOT NULL, + CHECKSUM VARCHAR2(128), + CREATED TIMESTAMP(6) WITH TIME ZONE, + BYTES NUMBER, + RECEPTION_DATE DATE NOT NULL, + PROCESSING_STATUS VARCHAR2(200), + EXTERNAL_TABLE_NAME VARCHAR2(200), + PARTITION_YEAR VARCHAR2(4), + PARTITION_MONTH VARCHAR2(2), + ARCH_PATH VARCHAR2(1000), + PROCESS_NAME VARCHAR2(200), + CONSTRAINT A_SOURCE_FILE_RECEIVED_PK PRIMARY KEY (A_SOURCE_FILE_RECEIVED_KEY), + CONSTRAINT ASFR_A_SOURCE_FILE_CONFIG_KEY_FK FOREIGN KEY(A_SOURCE_FILE_CONFIG_KEY) REFERENCES CT_MRDS.A_SOURCE_FILE_CONFIG(A_SOURCE_FILE_CONFIG_KEY), + CONSTRAINT A_SOURCE_FILE_RECEIVED_CHK CHECK (PROCESSING_STATUS IN ('RECEIVED', 'VALIDATED', 'READY_FOR_INGESTION', 'INGESTED', 'ARCHIVED')) +) TABLESPACE "DATA"; + +-- Unique index for file identification (workaround for TIMESTAMP WITH TIMEZONE constraint limitation) +CREATE UNIQUE INDEX CT_MRDS.A_SOURCE_FILE_RECEIVED_UK1 +ON CT_MRDS.A_SOURCE_FILE_RECEIVED(CHECKSUM, CREATED, BYTES); + +GRANT SELECT, INSERT, UPDATE, DELETE ON CT_MRDS.A_SOURCE_FILE_RECEIVED TO MRDS_LOADER_ROLE; \ No newline at end of file diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkb b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkb index f696c5a..7a3c90a 100644 --- a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkb +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkb @@ -606,6 +606,7 @@ AS pTemplateTableName IN VARCHAR2 default NULL, pMaxFileSize IN NUMBER default 104857600, pRegisterExport IN BOOLEAN default FALSE, + pProcessName IN VARCHAR2 default 'DATA_EXPORTER', pCredentialName IN VARCHAR2 default ENV_MANAGER.gvCredentialName ) IS @@ -638,6 +639,7 @@ AS ,'pTemplateTableName => '''||nvl(pTemplateTableName, 'NULL')||'''' ,'pMaxFileSize => '''||nvl(TO_CHAR(pMaxFileSize), 'NULL')||'''' ,'pRegisterExport => '''||CASE WHEN pRegisterExport THEN 'TRUE' ELSE 'FALSE' END||'''' + ,'pProcessName => '''||nvl(pProcessName, 'NULL')||'''' ,'pCredentialName => '''||nvl(pCredentialName, 'NULL')||'''' )); ENV_MANAGER.LOG_PROCESS_EVENT('Start','INFO', vParameters); @@ -853,7 +855,8 @@ AS PROCESSING_STATUS, PARTITION_YEAR, PARTITION_MONTH, - ARCH_FILE_NAME + ARCH_PATH, + PROCESS_NAME ) VALUES ( vSourceFileReceivedKey, NVL(vConfigKey, -1), -- Use config key if found, otherwise -1 @@ -865,7 +868,8 @@ AS 'INGESTED', NULL, -- PARTITION_YEAR not used for single-file exports NULL, -- PARTITION_MONTH not used for single-file exports - NULL -- ARCH_FILE_NAME not used for single-file exports + NULL, -- ARCH_PATH not used for single-file exports + pProcessName -- Process name from parameter ); ENV_MANAGER.LOG_PROCESS_EVENT('Registered file: FileReceivedKey=' || vSourceFileReceivedKey || ', File=' || vActualFileName || ', Size=' || vBytes || ' bytes', 'INFO', vParameters); @@ -887,7 +891,8 @@ AS PROCESSING_STATUS, PARTITION_YEAR, PARTITION_MONTH, - ARCH_FILE_NAME + ARCH_PATH, + PROCESS_NAME ) VALUES ( vSourceFileReceivedKey, NVL(vConfigKey, -1), -- Use config key if found, otherwise -1 @@ -896,7 +901,8 @@ AS 'INGESTED', NULL, -- PARTITION_YEAR not used for single-file exports NULL, -- PARTITION_MONTH not used for single-file exports - NULL -- ARCH_FILE_NAME not used for single-file exports + NULL, -- ARCH_PATH not used for single-file exports + pProcessName -- Process name from parameter ); ENV_MANAGER.LOG_PROCESS_EVENT('Registered file without metadata: FileReceivedKey=' || vSourceFileReceivedKey || ', File=' || vSanitizedFileName, 'INFO', vParameters); @@ -1198,6 +1204,7 @@ AS pTemplateTableName IN VARCHAR2 default NULL, pMaxFileSize IN NUMBER default 104857600, pRegisterExport IN BOOLEAN default FALSE, + pProcessName IN VARCHAR2 default 'DATA_EXPORTER', pCredentialName IN VARCHAR2 default ENV_MANAGER.gvCredentialName ) IS @@ -1544,7 +1551,8 @@ AS PROCESSING_STATUS, PARTITION_YEAR, PARTITION_MONTH, - ARCH_FILE_NAME + ARCH_PATH, + PROCESS_NAME ) VALUES ( vSourceFileReceivedKey, vConfigKey, -- Config key from A_SOURCE_FILE_CONFIG lookup @@ -1556,7 +1564,8 @@ AS 'INGESTED', NULL, -- PARTITION_YEAR not used for CSV exports NULL, -- PARTITION_MONTH not used for CSV exports - NULL -- ARCH_FILE_NAME not used for CSV exports + NULL, -- ARCH_PATH not used for CSV exports + pProcessName -- Process name from parameter ); ENV_MANAGER.LOG_PROCESS_EVENT('Registered file: FileReceivedKey=' || vSourceFileReceivedKey || ', File=' || vActualFileName || ', Size=' || vBytes || ' bytes', 'DEBUG', vParameters); @@ -1578,7 +1587,8 @@ AS PROCESSING_STATUS, PARTITION_YEAR, PARTITION_MONTH, - ARCH_FILE_NAME + ARCH_PATH, + PROCESS_NAME ) VALUES ( vSourceFileReceivedKey, vConfigKey, -- Config key from A_SOURCE_FILE_CONFIG lookup @@ -1587,7 +1597,8 @@ AS 'INGESTED', NULL, -- PARTITION_YEAR not used for CSV exports NULL, -- PARTITION_MONTH not used for CSV exports - NULL -- ARCH_FILE_NAME not used for CSV exports + NULL, -- ARCH_PATH not used for CSV exports + pProcessName -- Process name from parameter ); END; END LOOP; diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkg b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkg index 283f736..41e6168 100644 --- a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkg +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/new_version/DATA_EXPORTER.pkg @@ -81,6 +81,7 @@ AS * - NULL = use source table columns in natural order * @param pMaxFileSize - Maximum file size in bytes (default 104857600 = 100MB, min 10MB, max 1GB) * @param pRegisterExport - When TRUE, registers exported CSV file in A_SOURCE_FILE_RECEIVED table + * @param pProcessName - Process name stored in PROCESS_NAME column (default 'DATA_EXPORTER') * @example * begin * DATA_EXPORTER.EXPORT_TABLE_DATA( @@ -106,6 +107,7 @@ AS pTemplateTableName IN VARCHAR2 default NULL, pMaxFileSize IN NUMBER default 104857600, pRegisterExport IN BOOLEAN default FALSE, + pProcessName IN VARCHAR2 default 'DATA_EXPORTER', pCredentialName IN VARCHAR2 default ENV_MANAGER.gvCredentialName ); @@ -162,6 +164,7 @@ AS * File naming pattern: {pFileName}_YYYYMM.csv or {TABLENAME}_YYYYMM.csv (if pFileName is NULL) * When pRegisterExport=TRUE, successfully exported files are registered in: * - CT_MRDS.A_SOURCE_FILE_RECEIVED (tracks file location, size, checksum, and metadata) + * @param pProcessName - Process name stored in PROCESS_NAME column (default 'DATA_EXPORTER') * @example * begin * -- With custom filename @@ -207,6 +210,7 @@ AS pTemplateTableName IN VARCHAR2 default NULL, pMaxFileSize IN NUMBER default 104857600, pRegisterExport IN BOOLEAN default FALSE, + pProcessName IN VARCHAR2 default 'DATA_EXPORTER', pCredentialName IN VARCHAR2 default ENV_MANAGER.gvCredentialName ); diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_mars835_prehook.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_mars835_prehook.sql index 20e1d38..992ff6d 100644 --- a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_mars835_prehook.sql +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_mars835_prehook.sql @@ -29,6 +29,7 @@ PROMPT MARS-835-PREHOOK: Rollback to Previous Versions PROMPT ========================================================================= PROMPT WARNING: This will reverse all changes from MARS-835-PREHOOK installation! PROMPT - Removes A_PARALLEL_EXPORT_CHUNKS table +PROMPT - Reverts A_SOURCE_FILE_RECEIVED table (rename ARCH_PATH to ARCH_FILE_NAME, drop PROCESS_NAME column) PROMPT - Restores ENV_MANAGER v3.1.0 (removes parallel error codes) PROMPT - Restores DATA_EXPORTER v2.1.0 (removes parallel + Smart Column Mapping) PROMPT ========================================================================= @@ -65,13 +66,19 @@ PROMPT ========================================================================= PROMPT PROMPT ========================================================================= -PROMPT Step 3: Track Rollback Version +PROMPT Step 3: Rollback A_SOURCE_FILE_RECEIVED Table Structure +PROMPT ========================================================================= +@@93_MARS_835_PREHOOK_rollback_SOURCE_FILE_RECEIVED_table.sql + +PROMPT +PROMPT ========================================================================= +PROMPT Step 4: Track Rollback Version PROMPT ========================================================================= @@track_package_versions.sql PROMPT PROMPT ========================================================================= -PROMPT Step 4: Verify Package Versions After Rollback +PROMPT Step 5: Verify Package Versions After Rollback PROMPT ========================================================================= @@verify_packages_version.sql diff --git a/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_version/A_SOURCE_FILE_RECEIVED.sql b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_version/A_SOURCE_FILE_RECEIVED.sql new file mode 100644 index 0000000..4e5bbea --- /dev/null +++ b/MARS_Packages/REL01_ADDITIONS/MARS-835-PREHOOK/rollback_version/A_SOURCE_FILE_RECEIVED.sql @@ -0,0 +1,29 @@ +-- ==================================================================== +-- A_SOURCE_FILE_RECEIVED Table +-- ==================================================================== +-- Purpose: Track received files and their processing status +-- ==================================================================== + +CREATE TABLE CT_MRDS.A_SOURCE_FILE_RECEIVED ( + A_SOURCE_FILE_RECEIVED_KEY NUMBER(38,0) NOT NULL ENABLE, + A_SOURCE_FILE_CONFIG_KEY NUMBER(38,0) NOT NULL ENABLE, + SOURCE_FILE_NAME VARCHAR2(1000) NOT NULL, + CHECKSUM VARCHAR2(128), + CREATED TIMESTAMP(6) WITH TIME ZONE, + BYTES NUMBER, + RECEPTION_DATE DATE NOT NULL, + PROCESSING_STATUS VARCHAR2(200), + EXTERNAL_TABLE_NAME VARCHAR2(200), + PARTITION_YEAR VARCHAR2(4), + PARTITION_MONTH VARCHAR2(2), + ARCH_FILE_NAME VARCHAR2(1000), + CONSTRAINT A_SOURCE_FILE_RECEIVED_PK PRIMARY KEY (A_SOURCE_FILE_RECEIVED_KEY), + CONSTRAINT ASFR_A_SOURCE_FILE_CONFIG_KEY_FK FOREIGN KEY(A_SOURCE_FILE_CONFIG_KEY) REFERENCES CT_MRDS.A_SOURCE_FILE_CONFIG(A_SOURCE_FILE_CONFIG_KEY), + CONSTRAINT A_SOURCE_FILE_RECEIVED_CHK CHECK (PROCESSING_STATUS IN ('RECEIVED', 'VALIDATED', 'READY_FOR_INGESTION', 'INGESTED', 'ARCHIVED')) +) TABLESPACE "DATA"; + +-- Unique index for file identification (workaround for TIMESTAMP WITH TIMEZONE constraint limitation) +CREATE UNIQUE INDEX CT_MRDS.A_SOURCE_FILE_RECEIVED_UK1 +ON CT_MRDS.A_SOURCE_FILE_RECEIVED(CHECKSUM, CREATED, BYTES); + +GRANT SELECT, INSERT, UPDATE, DELETE ON CT_MRDS.A_SOURCE_FILE_RECEIVED TO MRDS_LOADER_ROLE; \ No newline at end of file