Purpose:
========
This PL/SQL procedure will identity the users having both "provisioned" and "provisioning" accounts.
Once such users are identified, It will cleanup the 'Provisioning' accounts without touching 'Provisioned' account.
Customer will not see the duplicate account anymore on the UI.
User can have one or more 'Provisioning' accounts.
Note :
A) Access policy name (We don't touch other accounts provisioned by other AP).
B) Resource Object name
Output :
It cleans up the records in UD Parent table, ORC, OIU, OSI,OTI, OBI tables and Executed in a order to avoid referential integrity constraints. Also, we don't need to delete records in child table as there won't be any records because the account will be in 'Provisioning' status.
DECLARE V_SDKKEY SDK.SDK_KEY%type := NULL; V_SDKNAME SDK.SDK_NAME%type := null; V_ARRAY_USRKEYS OIM_TYP_NUMBERARR := OIM_TYP_NUMBERARR(); -- Will store USR_KEYS V_ARRAY_ORCKEYS OIM_TYP_NUMBERARR := OIM_TYP_NUMBERARR(); V_ARRAY_OIUKEYS OIM_TYP_NUMBERARR := OIM_TYP_NUMBERARR(); V_STRSQL varchar2(10000) := null; -- Will store the dynamic query V_OBJNAME OBJ.OBJ_NAME%type := 'DC1'; --Resource object name V_APNAME POL.POL_NAME%type := 'DCAcessPolicy'; --Access Policy name V_OBJKEY OBJ.OBJ_KEY%type := null; -- Will store the OBJ_KEY for the selected RO. V_POLKEY POL.POL_KEY%type := null; V_USRKEY USR.USR_KEY%type := null; V_ArrayKeys varchar2(2000) := ''; begin -- Step-1 : Get the OBJ_KEY for the selected Resource Object. V_STRSQL := 'SELECT obj_key FROM obj WHERE obj_name= :1'; dbms_output.put_line('v_strSql: ' || v_strSql); EXECUTE IMMEDIATE v_strSql INTO v_ObjKey USING V_OBJNAME; DBMS_OUTPUT.PUT_LINE(' Resource Object: ' || V_OBJNAME || ', OBJ_KEY is: ' || V_OBJKEY); -- Step-2 : Get the POL_KEY for the selected access policy having the configured
-- resource object . V_STRSQL := 'SELECT pol_key FROM pol WHERE pol_name= :1'; dbms_output.put_line('v_strSql: ' || v_strSql); execute immediate V_STRSQL into V_POLKEY using V_APNAME; DBMS_OUTPUT.PUT_LINE(' Access Policy name is : ' || V_APNAME || ', POL_KEY is: ' || V_PolKey); -- Step-3 : Get the parent SDK name for the selected Resource Object. V_STRSQL := 'SELECT sdk.sdk_key, sdk.sdk_name FROM obj, pkg , tos, sdk WHERE obj.obj_key = pkg.obj_key AND tos.pkg_key = pkg.pkg_key AND tos.sdk_key = sdk.sdk_key AND sdk.sdk_type = ''P'' AND obj.obj_key = :1'; dbms_output.put_line('v_strSql: ' || v_strSql); EXECUTE IMMEDIATE v_strSql INTO v_SdkKey,v_SdkName USING v_ObjKey; DBMS_OUTPUT.PUT_LINE('Resource Object: ' || V_OBJNAME || ', Parent SDK_KEY is: ' || V_SDKKEY || ' and Parent SDK_NAME is: ' || V_SDKNAME); --Get the list of user having the duplicate account provisioned.
--The users having both 'Provisioned'/'Enabled' and 'Provisioning' accounts. SELECT USR_KEY BULK COLLECT INTO V_ARRAY_USRKEYS FROM ( SELECT OIU.USR_KEY from OIU,OBI,OBJ,OST, POL where OIU.OBI_KEY = OBI.OBI_KEY and OBI.OBJ_KEY =OBJ.OBJ_KEY and OBJ.OBJ_KEY = OST.OBJ_KEY and OIU.OST_KEY =OST.OST_KEY and OIU.POL_KEY = POL.POL_KEY and OBJ.OBJ_KEY =V_OBJKEY and OIU.POL_KEY = V_POLKEY AND OST.OST_STATUS IN ('Provisioned', 'Enabled') INTERSECT SELECT OIU.USR_KEY FROM OIU,OBI,OBJ,OST ,POL WHERE OIU.OBI_KEY =OBI.OBI_KEY AND OBI.OBJ_KEY =OBJ.OBJ_KEY AND OBJ.OBJ_KEY =OST.OBJ_KEY AND OIU.OST_KEY =OST.OST_KEY and OIU.POL_KEY = POL.POL_KE and OIU.POL_KEY =V_POLKEY and OBJ.OBJ_KEY =V_OBJKEY AND OST.OST_STATUS IN ('Provisioning')); DBMS_OUTPUT.PUT_LINE('Executed the main query '); FOR IDX in 1 .. V_ARRAY_USRKEYS.COUNT LOOP V_USRKEY := V_ARRAY_USRKEYS(IDX); --For each the selected user, let's get the ORC_KEY and OIU_KEY for an account in
--'provisioning' status V_STRSQL := 'select OIU.OIU_KEY,OIU.ORC_KEY from OIU, OBI, OBJ, OST, POL where OIU.OBI_KEY=OBI.OBI_KEY and OBI.OBJ_KEY=OBJ.OBJ_KEY and OBJ.OBJ_KEY=OST.OBJ_KEY and OIU.OST_KEY=OST.OST_KEY and OIU.POL_KEY = POL.POL_KEY and OIU.POL_KEY = ' || V_POLKEY || ' AND OBJ.OBJ_KEY = ' || V_OBJKEY || ' and OST.OST_STATUS in (''Provisioning'') and OIU.USR_KEY= ' || V_UsrKey; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL bulk collect into V_ARRAY_OIUKEYS,V_ARRAY_ORCKEYS; DBMS_OUTPUT.PUT_LINE('User : ' || V_USRKEY || ' is having ' ||
V_ARRAY_ORCKEYS.COUNT || ' Provisioning accounts. These accounts will be deleted now'); FOR k in 1 .. V_ARRAY_ORCKEYS.COUNT LOOP DBMS_OUTPUT.PUT_LINE('V_ARRAY_ORCKEYS : ' || V_ARRAY_ORCKEYS(k)); if (K != 1) then V_ARRAYKEYS := V_ARRAYKEYS || ''',''' || V_ARRAY_ORCKEYS(K) || ''''; DBMS_OUTPUT.PUT_LINE('ORC KEYs: ' || V_ARRAYKEYS); ELSE V_ARRAYKEYS := V_ARRAYKEYS || '''' || V_ARRAY_ORCKEYS(K); DBMS_OUTPUT.PUT_LINE('ORC 1: ' || V_ARRAYKEYS); END IF; end LOOP; DBMS_OUTPUT.PUT_LINE('ORC KEYs: ' || V_ARRAYKEYS); --delete from UD parent table. No need to delete the records in child table as the
--entitltments will NOT be provisioned for an account which is 'Provisoning' status. V_STRSQL := 'DELETE FROM /*+ PARALLEL */' || V_SDKNAME || ' WHERE orc_key in (' || V_ARRAYKEYS || ') and pol_key=' || V_POLKEY; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: ' || v_SdkName); --Delete from OSI V_STRSQL := 'DELETE FROM /*+ PARALLEL */ OSI WHERE orc_key in (' || V_ARRAYKEYS || ')'; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: OSI' ); --Delete from oti V_STRSQL := 'DELETE FROM /*+ PARALLEL */ OTI WHERE orc_key in (' || V_ARRAYKEYS || ') and OBJ_KEY=' || V_OBJKEY; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: OTI'); --Delete from obi V_STRSQL := 'DELETE FROM /*+ PARALLEL */ obi WHERE orc_key in (' || V_ARRAYKEYS || ')'; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: OBI'); --Delete from oiu V_STRSQL := 'DELETE FROM /*+ PARALLEL */ OIU WHERE orc_key in (' || V_ARRAYKEYS || ')'; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: OIU'); --Delete from orc V_STRSQL := 'DELETE FROM /*+ PARALLEL */ ORC WHERE orc_key in (' || V_ARRAYKEYS || ')'; DBMS_OUTPUT.PUT_LINE('v_strSql: ' || V_STRSQL); execute immediate V_STRSQL; DBMS_OUTPUT.PUT_LINE(' Deleted the records in table: ORC '); Commit; DBMS_OUTPUT.PUT_LINE('******Completed the cleanup script*****: '); END LOOP; END;
No comments:
Post a Comment