Commit ac0f4a88 authored by Ajit Deshmukh's avatar Ajit Deshmukh

Implemented DDL execution enhancements for Pilot and Read schemas

- Added DB_PILOT handling in schema execution rules
- Restricted DDL execution to DB_MAIN schema only
- Added synonym creation for DB_READ and DB_PILOT on object creation/replacement
- Added object-specific grant handling for TABLE, VIEW, SEQUENCE, PROCEDURE, FUNCTION, PACKAGE, and TYPE
- Granted SELECT, INSERT, UPDATE, DELETE privileges on TABLES to DB_PILOT
- Granted SELECT privilege on TABLES, VIEWS, and SEQUENCES to DB_READ
- Granted EXECUTE privilege on PROCEDURE, FUNCTION, PACKAGE, and TYPE objects to DB_READ and DB_PILOT
- Added logging for schema and grant execution details
parent 935fbde8
...@@ -514,7 +514,9 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -514,7 +514,9 @@ public class ManageSqlConf extends ActionHandlerEJB {
linNo, linNo,
requestID, requestID,
userId, userId,
chgTerm); chgTerm,
"Q"
);
} }
// For PILOT, look up DB_PILOT from enterprise table using the main // For PILOT, look up DB_PILOT from enterprise table using the main
...@@ -572,12 +574,10 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -572,12 +574,10 @@ public class ManageSqlConf extends ActionHandlerEJB {
entSavepoint = con.setSavepoint("SP_" + QcDevEnterprise); entSavepoint = con.setSavepoint("SP_" + QcDevEnterprise);
if ("P".equalsIgnoreCase(execRights)) { if ("P".equalsIgnoreCase(execRights)) {
// PILOT: DB_PILOT is a schema name, not an enterprise code,
// so processSqlForEnterprise cannot look it up. Instead, apply
// schema injection and call executeAndLog directly using the
// main enterprise for connection lookup and DB_PILOT as target schema.
String pilotInputSql = oracleStatment; String pilotInputSql = oracleStatment;
String upperSqlP = checkNull(pilotInputSql).trim().toUpperCase(); String upperSqlP = checkNull(pilotInputSql).trim().toUpperCase();
boolean isPlSqlBodyP = upperSqlP.startsWith("CREATE OR REPLACE FUNCTION") boolean isPlSqlBodyP = upperSqlP.startsWith("CREATE OR REPLACE FUNCTION")
|| upperSqlP.startsWith("CREATE FUNCTION") || upperSqlP.startsWith("CREATE FUNCTION")
|| upperSqlP.startsWith("CREATE OR REPLACE PROCEDURE") || upperSqlP.startsWith("CREATE OR REPLACE PROCEDURE")
...@@ -589,22 +589,162 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -589,22 +589,162 @@ public class ManageSqlConf extends ActionHandlerEJB {
|| upperSqlP.startsWith("CREATE OR REPLACE TRIGGER") || upperSqlP.startsWith("CREATE OR REPLACE TRIGGER")
|| upperSqlP.startsWith("CREATE TRIGGER") || upperSqlP.startsWith("CREATE TRIGGER")
|| upperSqlP.contains("NONEDITIONABLE"); || upperSqlP.contains("NONEDITIONABLE");
if (!isPlSqlBodyP) { if (!isPlSqlBodyP) {
pilotInputSql = injectSchemaPlaceholderSafe(pilotInputSql); pilotInputSql = injectSchemaPlaceholderSafe(pilotInputSql);
} }
//Made changes by Ajit D. on 10-June for No DDL should get executed in PILOT schema & READ schema
// and Only DML will get executed in PILOT schema
// DDL check
boolean isPilotDDL = (upperSqlP.startsWith("CREATE")
|| upperSqlP.startsWith("ALTER")
|| upperSqlP.startsWith("DROP"))
&& !upperSqlP.startsWith("CREATE SYNONYM")
&& !upperSqlP.startsWith("DROP SYNONYM");
if (isPilotDDL) {
BaseLogger.log(
"3",
null,
null,
"Pilot DDL detected. Executing through LIVE flow.");
BaseLogger.log(
"3",
null,
null,
"Multiple schema execution :: SQL :: " + oracleStatment +
" :: enterprises :: [" + selectedEnterprise + "]");
// VERY IMPORTANT
con.setAutoCommit(false);
// TO fetch the schemaName and enterprise for live[START]
Connection entCon = null;
ConnDriver connDriver = new ConnDriver();
entCon = connDriver.getConnectDB("Driver");
ResultSet rsToFetchEntForP = null;
// Added by Gagan B. on 13-NOV-25 [make connection with Driver for ENTERPRISE]
// -- END
String EnterPriseInFormat = getFormattedStringBuff(mainEnterprise);
sql = "SELECT SCHEMA_NAME,ENTERPRISE FROM ENTERPRISE WHERE ENTERPRISE IN("
+ EnterPriseInFormat + ") ";
pstmt = entCon.prepareStatement(sql);
rsToFetchEntForP = pstmt.executeQuery();
while (rsToFetchEntForP.next()) {
// schemaName = checkNull( rs.getString("SCHEMA_NAME") );
// enterpriseSQL = checkNull( rs.getString("ENTERPRISE") );
// schemaListMap.put(schemaName,enterpriseSQL);
enterpriseArrayList.add(checkNull(rsToFetchEntForP.getString("ENTERPRISE")));
}
if (pstmt != null) {
pstmt.close();
pstmt = null;
}
if (rsToFetchEntForP != null) {
rsToFetchEntForP.close();
rsToFetchEntForP = null;
}
// Added by Gagan B. on 13-NOV-25 [make connection with Driver for ENTERPRISE]
// -- START
if (entCon != null && !entCon.isClosed()) {
System.out.println("Closing entCon ");
entCon.close();
entCon = null;
connDriver = null;
}
// TO fetch the enterprise for live[START]
BaseLogger.log("1", null, null,
"enterpriseArrayList :: " + enterpriseArrayList);
String[] enterpriseArr = null;
enterpriseArr = enterpriseArrayList.toArray(new String[0]);
// Commented by Gagan B. on 02-FEB-26 to resolve the issue of when multiple
// enterprise selected using checkbox, SQL only got executed in one single
// enterprise.
/*
* if(applDB.equalsIgnoreCase("S")) {
* enterpriseArr = enterpriseArrayList.get(0).split(",");
* }else if(applDB.equalsIgnoreCase("E")){
*
* // Values are NOT comma-separated � copy list directly
* enterpriseArr = enterpriseArrayList.toArray(new String[0]);
* }
*/
BaseLogger.log("1", null, null,
"enterpriseArr :: " + Arrays.toString(enterpriseArr));
for (String enterpriseForExec : enterpriseArr) {
BaseLogger.log("1", null, null,
"enterpriseForExec :: " + enterpriseForExec);
String ent = enterpriseForExec.trim();
if (ent.isEmpty()) {
continue;
}
Savepoint entSavepointForPilot = null;
try {
//  ENTERPRISE-LEVEL SAVEPOINT
entSavepointForPilot = con.setSavepoint("SP_" + ent);
processSqlForEnterprise(
con,
ent,
pilotInputSql,
tranId,
linNo,
requestID,
userId,
chgTerm,
"P"
);
//  commit enterprise success
con.commit();
} catch (Exception e) {
// L rollback ONLY this enterprise
if (entSavepointForPilot != null) {
con.rollback(entSavepointForPilot);
}
BaseLogger.log("1", null, null,
"Enterprise execution failed :: " + ent + " :: "
+ e.getMessage());
// continue next enterprise
}
}
continue;
} else {
executeAndLog( executeAndLog(
QcDevEnterprise, // DB_PILOT schema name (target schema for SQL) QcDevEnterprise,
pilotInputSql, pilotInputSql,
tranId, tranId,
enterpriser, // main enterprise code (for connection lookup and logging) enterpriser,
linNo, linNo,
requestID, requestID,
userId, userId,
chgTerm, chgTerm,
dbMainForPilot, // DB_MAIN (for synonym/grant references) dbMainForPilot,
"P", "P",
false); false);
}
} else if ("C".equalsIgnoreCase(execRights)) { } else if ("C".equalsIgnoreCase(execRights)) {
// CLIENT DEV: DB_DEV is a schema name, not an enterprise code, // CLIENT DEV: DB_DEV is a schema name, not an enterprise code,
// so processSqlForEnterprise cannot look it up. Instead, apply // so processSqlForEnterprise cannot look it up. Instead, apply
...@@ -715,7 +855,9 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -715,7 +855,9 @@ public class ManageSqlConf extends ActionHandlerEJB {
linNo, linNo,
requestID, requestID,
userId, userId,
chgTerm); chgTerm,
"A"
);
//  commit enterprise success //  commit enterprise success
con.commit(); con.commit();
...@@ -1697,7 +1839,8 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1697,7 +1839,8 @@ public class ManageSqlConf extends ActionHandlerEJB {
String linNo, String linNo,
String requestID, String requestID,
String userId, String userId,
String chgTerm) throws Exception { String chgTerm,
String execRights) throws Exception {
// Change by Gagan B. on 16-JAN-26 // Change by Gagan B. on 16-JAN-26
// --- FIX: Don't inject placeholders into PL/SQL Bodies --- // --- FIX: Don't inject placeholders into PL/SQL Bodies ---
...@@ -1727,7 +1870,7 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1727,7 +1870,7 @@ public class ManageSqlConf extends ActionHandlerEJB {
String query = "SELECT DB_DEV, DB_MAIN, DB_READ, DB_PILOT " + String query = "SELECT DB_DEV, DB_MAIN, DB_READ, DB_PILOT " +
"FROM enterprise WHERE enterprise = ?"; "FROM enterprise WHERE enterprise = ?";
String dbMain, dbRead; String dbMain, dbRead, dbPilot;
try (PreparedStatement ps = conn.prepareStatement(query)) { try (PreparedStatement ps = conn.prepareStatement(query)) {
ps.setString(1, enterpriseCode); ps.setString(1, enterpriseCode);
...@@ -1737,9 +1880,10 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1737,9 +1880,10 @@ public class ManageSqlConf extends ActionHandlerEJB {
} }
dbMain = rs.getString("DB_MAIN"); dbMain = rs.getString("DB_MAIN");
dbRead = rs.getString("DB_READ"); dbRead = rs.getString("DB_READ");
dbPilot = rs.getString("DB_PILOT");
} }
} }
BaseLogger.log("3", null, null, "dbMain:: " + dbMain+ " dbRead:: "+dbRead+ " dbPilot:: "+dbPilot);
/* /*
* ------------------------------- * -------------------------------
* Get CURRENT_USER * Get CURRENT_USER
...@@ -1753,7 +1897,7 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1753,7 +1897,7 @@ public class ManageSqlConf extends ActionHandlerEJB {
currentUser = rs.getString(1); currentUser = rs.getString(1);
} }
System.out.println("CURRENT_USER ::: " + currentUser); System.out.println("CURRENT_USER :::: " + currentUser);
/* /*
* ------------------------------- * -------------------------------
...@@ -1765,6 +1909,13 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1765,6 +1909,13 @@ public class ManageSqlConf extends ActionHandlerEJB {
//schemaRules.put(dbDev, "ALL"); //schemaRules.put(dbDev, "ALL");
schemaRules.put(dbRead, "SYN"); schemaRules.put(dbRead, "SYN");
//schemaRules.put(dbPilot, "SYN"); //schemaRules.put(dbPilot, "SYN");
System.out.println("execRights ::: " + execRights);
if ("P".equalsIgnoreCase(execRights)
&& dbPilot != null
&& !dbPilot.trim().isEmpty()) {
schemaRules.put(dbPilot, "SYN");
}
String createObjectType = getCreateObjectType(inputSql); String createObjectType = getCreateObjectType(inputSql);
boolean isCreateObject = createObjectType != null; boolean isCreateObject = createObjectType != null;
...@@ -1772,7 +1923,7 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1772,7 +1923,7 @@ public class ManageSqlConf extends ActionHandlerEJB {
System.out.println("objectName ::: " + objectName); System.out.println("objectName ::: " + objectName);
System.out.println("createObjectType ::: " + createObjectType); System.out.println("createObjectType ::: " + createObjectType);
System.out.println("schemaRules:: "+schemaRules);
/* /*
* ------------------------------- * -------------------------------
* Execute per schema * Execute per schema
...@@ -1782,6 +1933,8 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1782,6 +1933,8 @@ public class ManageSqlConf extends ActionHandlerEJB {
String schemaName = entry.getKey(); String schemaName = entry.getKey();
String rule = entry.getValue(); String rule = entry.getValue();
System.out.println("schemaName ::: " + schemaName);
System.out.println("rule ::: " + rule);
if (schemaName == null || schemaName.trim().isEmpty()) if (schemaName == null || schemaName.trim().isEmpty())
continue; continue;
...@@ -1846,8 +1999,24 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1846,8 +1999,24 @@ public class ManageSqlConf extends ActionHandlerEJB {
*/ */
String grantSql = null; String grantSql = null;
if ("TABLE".equalsIgnoreCase(createObjectType) //For Pilot transaction Create Table query grant rights of SELECT, INSERT, UPDATE, DELETE
|| "VIEW".equalsIgnoreCase(createObjectType) if ("TABLE".equalsIgnoreCase(createObjectType)) {
if ("P".equalsIgnoreCase(execRights)
&& schemaName.equalsIgnoreCase(dbPilot)) {
grantSql = "GRANT SELECT, INSERT, UPDATE, DELETE ON "
+ dbMain + "." + objectName
+ " TO " + schemaName;
} else {
grantSql = "GRANT SELECT ON "
+ dbMain + "." + objectName
+ " TO " + schemaName;
}
}
else if ("VIEW".equalsIgnoreCase(createObjectType)
|| "SEQUENCE".equalsIgnoreCase(createObjectType)) { || "SEQUENCE".equalsIgnoreCase(createObjectType)) {
grantSql = "GRANT SELECT ON " + dbMain + "." + objectName + grantSql = "GRANT SELECT ON " + dbMain + "." + objectName +
...@@ -1861,7 +2030,28 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1861,7 +2030,28 @@ public class ManageSqlConf extends ActionHandlerEJB {
grantSql = "GRANT EXECUTE ON " + dbMain + "." + objectName + grantSql = "GRANT EXECUTE ON " + dbMain + "." + objectName +
" TO " + schemaName; " TO " + schemaName;
} }
BaseLogger.log(
"3",
null,
null,
"grantSql [[" + grantSql + "]");
BaseLogger.log(
"3",
null,
null,
"schemaName [" + schemaName + "]");
BaseLogger.log(
"3",
null,
null,
"dbMain [" + dbMain + "]");
BaseLogger.log(
"3",
null,
null,
"dbRead [" + dbRead + "]");
if (grantSql != null) { if (grantSql != null) {
executeAndLog( executeAndLog(
schemaName, schemaName,
...@@ -1931,13 +2121,35 @@ public class ManageSqlConf extends ActionHandlerEJB { ...@@ -1931,13 +2121,35 @@ public class ManageSqlConf extends ActionHandlerEJB {
boolean rethrow) throws Exception { boolean rethrow) throws Exception {
Connection conn = null; Connection conn = null;
Connection connForQueryExec = null; Connection connForQueryExec = null;
Connection connForPilotSchema = null;
ConnDriver connDriverForPilotSchema = new ConnDriver();
ConnDriver connDriver = new ConnDriver(); ConnDriver connDriver = new ConnDriver();
ConnDriver connDriver1 = new ConnDriver(); ConnDriver connDriver1 = new ConnDriver();
String connForExec = ""; String connForExec = "";
String schemaForPilot = "";
BaseLogger.log("3", null, null, "executeAndLog inputSql: [" + inputSql + "]"); BaseLogger.log("3", null, null, "executeAndLog inputSql: [" + inputSql + "]");
//Changes by Ajit D. on 08-JUNE-26 for Pilot Transaction schema name fetched it from USERS
if(execRights.trim().equalsIgnoreCase("P")){
BaseLogger.log("3", null, null, "For Pilot schemaName: [" + schemaName + "]");
BaseLogger.log("3", null, null, "executeAndLog inputSql: [" + inputSql + "]");
connForPilotSchema = connDriverForPilotSchema.getConnectDB(schemaName);
String schemaForPilotSql = "SELECT USER FROM DUAL";
PreparedStatement schemaForPilotPs = connForPilotSchema.prepareStatement(schemaForPilotSql);
ResultSet schemaForPilotRs = schemaForPilotPs.executeQuery();
while(schemaForPilotRs.next()){
schemaForPilot = checkNull(schemaForPilotRs.getString("USER"));
}
BaseLogger.log("3", null, null, "schemaForPilot: [" + schemaForPilot + "]");
schemaName = schemaForPilot;
}
String finalSql = applySchema(inputSql, schemaName); String finalSql = applySchema(inputSql, schemaName);
// Change by Gagan B. on 16-JAN-26 // Change by Gagan B. on 16-JAN-26
......
...@@ -391,5 +391,6 @@ Insert into MESSAGES (MSG_NO,MSG_STR,MSG_DESCR,MSG_TYPE,MSG_OPT,MSG_TIME,ALARM,E ...@@ -391,5 +391,6 @@ Insert into MESSAGES (MSG_NO,MSG_STR,MSG_DESCR,MSG_TYPE,MSG_OPT,MSG_TIME,ALARM,E
-----------28May-------------- -----------28May--------------
update user_rights set RIGHTS = 'TEPSA' where obj_name = 'sql_changes' and profile_id = 'MSDEVTL'; update user_rights set RIGHTS = 'TEPSA' where obj_name = 'sql_changes' and profile_id = 'MSDEVTL';
----------10th June------------
update messages set MSG_TYPE = 'W' where msg_no = 'INVENTRPRS';
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment