I could never get the small test cases to block.
-- Assume: Users fklock, t1, t2.
SET DEFINE OFF;
DROP TABLE fklock.fj13 CASCADE CONSTRAINTS PURGE;
DROP TABLE fklock.fe05 CASCADE CONSTRAINTS PURGE;
CREATE TABLE fklock.fe05
(
wkccd VARCHAR2 (2) NOT NULL,
cowke VARCHAR2 (3) NOT NULL,
joser VARCHAR2 (5) NOT NULL,
kopcd VARCHAR2 (1) NOT NULL,
kowkt VARCHAR2 (2) NOT NULL,
r1ldate DATE NOT NULL,
r1luser VARCHAR2 (8),
r1crusr VARCHAR2 (8),
r1crdte DATE NOT NULL,
koesd DATE,
evnbr VARCHAR2 (4),
koarc VARCHAR2 (2),
shnbrk VARCHAR2 (2),
wcnbrk VARCHAR2 (4),
kossd DATE,
koscd DATE,
koccd VARCHAR2 (1),
kopri VARCHAR2 (1),
kottl VARCHAR2 (25),
kofma VARCHAR2 (1),
sched VARCHAR2 (2),
kowsc VARCHAR2 (1),
koclc VARCHAR2 (1),
kosid DATE,
korec VARCHAR2 (3),
kosyc VARCHAR2 (6),
koerv VARCHAR2 (2),
koarv VARCHAR2 (2),
koacc VARCHAR2 (1),
r3dydur VARCHAR2 (3),
kolcd DATE,
kotby VARCHAR2 (8),
znmgr VARCHAR2 (4),
kotfl NUMBER (4),
kompn NUMBER (2),
koerd DATE,
koard DATE,
koasd DATE,
koacd DATE,
korsd DATE,
korcd DATE,
kocld DATE,
kojci VARCHAR2 (1),
korsr VARCHAR2 (2),
korsc VARCHAR2 (3),
komsn VARCHAR2 (4),
kowmc VARCHAR2 (1),
kowic VARCHAR2 (1),
kofcc VARCHAR2 (1),
konrs NUMBER (2),
konrc NUMBER (2),
kopcp NUMBER (3),
kecmo NUMBER (12, 2),
keomo NUMBER (12, 2),
kedmi NUMBER (12, 2),
kodcl DATE,
kecoo NUMBER (10, 2),
kecco NUMBER (10, 2),
keooo NUMBER (10, 2),
keoco NUMBER (10, 2),
activity_sa_id NUMBER NOT NULL,
fiscal_year_id NUMBER (4) NOT NULL,
created_user_sa_id NUMBER (9),
lastmod_user_sa_id NUMBER (9)
)
TABLESPACE users
PARTITION BY LIST (fiscal_year_id)
SUBPARTITION BY LIST (activity_sa_id)
(PARTITION
fy15
VALUES (2015)
(
SUBPARTITION fe05jrmc15 VALUES (8),
SUBPARTITION fe05nnsy15 VALUES (3),
SUBPARTITION fe05marmc15 VALUES (5),
SUBPARTITION fe05phnsy15 VALUES (1),
SUBPARTITION fe05pnsy15 VALUES (2),
SUBPARTITION fe05psnsy15 VALUES (4),
SUBPARTITION fe05sermc15 VALUES (6),
SUBPARTITION fe05swrmc15 VALUES (7)),
PARTITION
fy16
VALUES (2016)
(
SUBPARTITION fe05jrmc16 VALUES (8),
SUBPARTITION fe05nnsy16 VALUES (3),
SUBPARTITION fe05marmc16 VALUES (5),
SUBPARTITION fe05phnsy16 VALUES (1),
SUBPARTITION fe05pnsy16 VALUES (2),
SUBPARTITION fe05psnsy16 VALUES (4),
SUBPARTITION fe05sermc16 VALUES (6),
SUBPARTITION fe05swrmc16 VALUES (7)))
ROWDEPENDENCIES;
CREATE TABLE fklock.fj13
(
wkccdi VARCHAR2 (2) NOT NULL,
cowkei VARCHAR2 (3) NOT NULL,
joseri VARCHAR2 (5) NOT NULL,
wkccdf VARCHAR2 (2) NOT NULL,
cowkef VARCHAR2 (3) NOT NULL,
joserf VARCHAR2 (5) NOT NULL,
kolbp NUMBER (4, 1) NOT NULL,
komlp NUMBER (4, 1) NOT NULL,
r1ldate DATE NOT NULL,
r1luser VARCHAR2 (8),
r1crusr VARCHAR2 (8),
r1crdte DATE NOT NULL,
kopcd VARCHAR2 (1),
kowkt VARCHAR2 (2),
shnbr VARCHAR2 (2),
wcnbr VARCHAR2 (4),
activity_sa_id NUMBER NOT NULL,
fiscal_year_id NUMBER (4) NOT NULL,
created_user_sa_id NUMBER (9),
lastmod_user_sa_id NUMBER (9)
)
TABLESPACE users
PARTITION BY LIST (fiscal_year_id)
SUBPARTITION BY LIST (activity_sa_id)
(PARTITION
fy15
VALUES (2015)
(
SUBPARTITION fj13jrmc15 VALUES (8),
SUBPARTITION fj13nnsy15 VALUES (3),
SUBPARTITION fj13marmc15 VALUES (5),
SUBPARTITION fj13phnsy15 VALUES (1),
SUBPARTITION fj13pnsy15 VALUES (2),
SUBPARTITION fj13psnsy15 VALUES (4),
SUBPARTITION fj13sermc15 VALUES (6),
SUBPARTITION fj13swrmc15 VALUES (7)),
PARTITION
fy16
VALUES (2016)
(
SUBPARTITION fj13jrmc16 VALUES (8),
SUBPARTITION fj13nnsy16 VALUES (3),
SUBPARTITION fj13marmc16 VALUES (5),
SUBPARTITION fj13phnsy16 VALUES (1),
SUBPARTITION fj13pnsy16 VALUES (2),
SUBPARTITION fj13psnsy16 VALUES (4),
SUBPARTITION fj13sermc16 VALUES (6),
SUBPARTITION fj13swrmc16 VALUES (7)))
ROWDEPENDENCIES;
CREATE UNIQUE INDEX fklock.fe05_pk
ON fklock.fe05 (activity_sa_id,
fiscal_year_id,
wkccd,
cowke,
joser,
kopcd,
kowkt)
LOCAL;
CREATE INDEX fklock.fj1301_ndx
ON fklock.fj13 (activity_sa_id,
fiscal_year_id,
wkccdf,
cowkef,
joserf,
wkccdi,
cowkei,
joseri)
LOCAL;
CREATE UNIQUE INDEX fklock.fj13_uk
ON fklock.fj13 (activity_sa_id,
fiscal_year_id,
wkccdi,
cowkei,
joseri,
kopcd,
kowkt,
wkccdf,
cowkef,
joserf,
shnbr,
wcnbr)
LOCAL;
CREATE OR REPLACE FUNCTION fklock.vpd_act_predicate (
pvar_schema_nm IN VARCHAR2,
pvar_object_nm IN VARCHAR2)
RETURN VARCHAR2
AS
/*
||===================================================================
|| Description:
||
|| Pre:
||
|| Post:
||
|| Modification History:
||===================================================================
*/
lvar_where_clause VARCHAR2 (4000) := NULL;
BEGIN
-- if NOT 'Multi-UIC' mode
IF USER = 'T1'
THEN
lvar_where_clause := 'activity_sa_id = 5';
-- else, 'Multi-UIC' mode
ELSE
lvar_where_clause := 'activity_sa_id = 8';
END IF;
RETURN lvar_where_clause;
END vpd_act_predicate;
/
BEGIN
sys.DBMS_RLS.add_policy (
object_schema => 'FKLOCK',
object_name => 'FE05',
policy_name => 'ACTIVITY_ACCESS_POLICY',
function_schema => 'FKLOCK',
policy_function => 'VPD_ACT_PREDICATE',
statement_types => 'SELECT,INSERT,UPDATE,DELETE',
policy_type => DBMS_RLS.dynamic,
long_predicate => FALSE,
update_check => TRUE,
static_policy => FALSE,
enable => TRUE);
END;
/
BEGIN
sys.DBMS_RLS.add_policy (
object_schema => 'FKLOCK',
object_name => 'FJ13',
policy_name => 'ACTIVITY_ACCESS_POLICY',
function_schema => 'FKLOCK',
policy_function => 'VPD_ACT_PREDICATE',
statement_types => 'SELECT,INSERT,UPDATE,DELETE',
policy_type => DBMS_RLS.dynamic,
long_predicate => FALSE,
update_check => TRUE,
static_policy => FALSE,
enable => TRUE);
END;
/
ALTER TABLE fklock.fe05 ADD (
CONSTRAINT fe05_pk
PRIMARY KEY
(activity_sa_id, fiscal_year_id, wkccd, cowke, joser, kopcd, kowkt)
USING INDEX LOCAL
ENABLE VALIDATE);
ALTER TABLE fklock.fj13 ADD (
CONSTRAINT fj13_uk
UNIQUE (activity_sa_id, fiscal_year_id, wkccdi, cowkei, joseri, kopcd, kowkt, wkccdf, cowkef, joserf, shnbr, wcnbr)
USING INDEX LOCAL
ENABLE VALIDATE);
ALTER TABLE fklock.fj13 ADD (
CONSTRAINT fj1303_fk
FOREIGN KEY (activity_sa_id, fiscal_year_id, wkccdi, cowkei, joseri, kopcd, kowkt)
REFERENCES fklock.fe05 (activity_sa_id,fiscal_year_id,wkccd,cowke,joser,kopcd,kowkt)
ENABLE VALIDATE);
ALTER TABLE fklock.fj13 ADD (
CONSTRAINT fj1304_fk
FOREIGN KEY (activity_sa_id, fiscal_year_id, wkccdf, cowkef, joserf, kopcd, kowkt)
REFERENCES fklock.fe05 (activity_sa_id,fiscal_year_id,wkccd,cowke,joser,kopcd,kowkt)
ENABLE VALIDATE);
GRANT SELECT, UPDATE ON fklock.fe05 TO t1;
GRANT SELECT, UPDATE ON fklock.fj13 TO t1;
GRANT SELECT, UPDATE ON fklock.fe05 TO t2;
GRANT SELECT, UPDATE ON fklock.fj13 TO t2;
INSERT INTO fklock.fe05 (wkccd,
cowke,
joser,
kopcd,
kowkt,
r1ldate,
r1luser,
r1crusr,
r1crdte,
koesd,
evnbr,
koarc,
shnbrk,
wcnbrk,
kossd,
koscd,
koccd,
kopri,
kottl,
kofma,
sched,
kowsc,
koclc,
kosid,
korec,
kosyc,
koerv,
koarv,
koacc,
r3dydur,
kolcd,
kotby,
znmgr,
kotfl,
kompn,
koerd,
koard,
koasd,
koacd,
korsd,
korcd,
kocld,
kojci,
korsr,
korsc,
komsn,
kowmc,
kowic,
kofcc,
konrs,
konrc,
kopcp,
kecmo,
keomo,
kedmi,
kodcl,
kecoo,
kecco,
keooo,
keoco,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('16',
'67D',
'51111',
'A',
'01',
TO_DATE ('01/20/2016 04:55:25', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('02/12/2015 14:29:45', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
'0',
'0',
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
TO_DATE ('01/20/2016 04:55:25', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
NULL,
8,
2015,
1996,
NULL);
INSERT INTO fklock.fe05 (wkccd,
cowke,
joser,
kopcd,
kowkt,
r1ldate,
r1luser,
r1crusr,
r1crdte,
koesd,
evnbr,
koarc,
shnbrk,
wcnbrk,
kossd,
koscd,
koccd,
kopri,
kottl,
kofma,
sched,
kowsc,
koclc,
kosid,
korec,
kosyc,
koerv,
koarv,
koacc,
r3dydur,
kolcd,
kotby,
znmgr,
kotfl,
kompn,
koerd,
koard,
koasd,
koacd,
korsd,
korcd,
kocld,
kojci,
korsr,
korsc,
komsn,
kowmc,
kowic,
kofcc,
konrs,
konrc,
kopcp,
kecmo,
keomo,
kedmi,
kodcl,
kecoo,
kecco,
keooo,
keoco,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('38',
'67D',
'51101',
'A',
'01',
TO_DATE ('02/12/2015 14:22:41', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('02/12/2015 12:51:52', 'MM/DD/YYYY HH24:MI:SS'),
TO_DATE ('02/12/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
'72',
'WHR1',
NULL,
NULL,
NULL,
NULL,
'#1A GTM BI',
'F',
NULL,
'0',
'0',
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
8,
2015,
1996,
1996);
INSERT INTO fklock.fe05 (wkccd,
cowke,
joser,
kopcd,
kowkt,
r1ldate,
r1luser,
r1crusr,
r1crdte,
koesd,
evnbr,
koarc,
shnbrk,
wcnbrk,
kossd,
koscd,
koccd,
kopri,
kottl,
kofma,
sched,
kowsc,
koclc,
kosid,
korec,
kosyc,
koerv,
koarv,
koacc,
r3dydur,
kolcd,
kotby,
znmgr,
kotfl,
kompn,
koerd,
koard,
koasd,
koacd,
korsd,
korcd,
kocld,
kojci,
korsr,
korsc,
komsn,
kowmc,
kowic,
kofcc,
konrs,
konrc,
kopcp,
kecmo,
keomo,
kedmi,
kodcl,
kecoo,
kecco,
keooo,
keoco,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('38',
'TN1',
'NSS01',
'A',
'02',
TO_DATE ('01/12/2015 10:52:02', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('01/12/2015 10:18:27', 'MM/DD/YYYY HH24:MI:SS'),
TO_DATE ('01/12/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
'13',
'QB1Q',
NULL,
NULL,
NULL,
NULL,
'SHIP LVL R',
'F',
NULL,
'0',
'0',
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
5,
2015,
3172,
3172);
INSERT INTO fklock.fe05 (wkccd,
cowke,
joser,
kopcd,
kowkt,
r1ldate,
r1luser,
r1crusr,
r1crdte,
koesd,
evnbr,
koarc,
shnbrk,
wcnbrk,
kossd,
koscd,
koccd,
kopri,
kottl,
kofma,
sched,
kowsc,
koclc,
kosid,
korec,
kosyc,
koerv,
koarv,
koacc,
r3dydur,
kolcd,
kotby,
znmgr,
kotfl,
kompn,
koerd,
koard,
koasd,
koacd,
korsd,
korcd,
kocld,
kojci,
korsr,
korsc,
komsn,
kowmc,
kowic,
kofcc,
konrs,
konrc,
kopcp,
kecmo,
keomo,
kedmi,
kodcl,
kecoo,
kecco,
keooo,
keoco,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('16',
'TN1',
'NSS34',
'A',
'02',
TO_DATE ('01/20/2016 04:55:58', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('01/12/2015 10:18:28', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
'0',
'0',
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
TO_DATE ('01/20/2016 04:55:58', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
0,
NULL,
NULL,
NULL,
5,
2015,
3172,
NULL);
COMMIT;
INSERT INTO fklock.fj13 (wkccdi,
cowkei,
joseri,
wkccdf,
cowkef,
joserf,
kolbp,
komlp,
r1ldate,
r1luser,
r1crusr,
r1crdte,
kopcd,
kowkt,
shnbr,
wcnbr,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('38',
'67D',
'51101',
'16',
'67D',
'51111',
100,
100,
TO_DATE ('02/12/2015 14:52:31', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('02/12/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),
'A',
'01',
NULL,
NULL,
8,
2015,
1996,
2623);
INSERT INTO fklock.fj13 (wkccdi,
cowkei,
joseri,
wkccdf,
cowkef,
joserf,
kolbp,
komlp,
r1ldate,
r1luser,
r1crusr,
r1crdte,
kopcd,
kowkt,
shnbr,
wcnbr,
activity_sa_id,
fiscal_year_id,
created_user_sa_id,
lastmod_user_sa_id)
VALUES ('38',
'TN1',
'NSS01',
'16',
'TN1',
'NSS34',
100,
100,
TO_DATE ('01/29/2015 13:15:11', 'MM/DD/YYYY HH24:MI:SS'),
NULL,
NULL,
TO_DATE ('01/29/2015 13:15:11', 'MM/DD/YYYY HH24:MI:SS'),
'A',
'02',
NULL,
NULL,
5,
2015,
3172,
3172);
COMMIT;
CREATE OR REPLACE TRIGGER fklock.fe05_cu
BEFORE INSERT OR UPDATE
ON fklock.fe05
FOR EACH ROW
DECLARE
v_user_sa_id NUMBER := 0;
v_cfy_id NUMBER (4) := 2016;
BEGIN
SELECT SYS_CONTEXT ('APP_USER_CTX', 'USER') INTO v_user_sa_id FROM DUAL;
IF 1 = 2
THEN
:new.fiscal_year_id := v_cfy_id;
END IF;
:new.r1ldate := CURRENT_DATE;
:new.lastmod_user_sa_id := v_user_sa_id;
IF INSERTING
THEN
:new.r1crdte := CURRENT_DATE;
:new.created_user_sa_id := v_user_sa_id;
END IF;
END;
/
/*
2. SQLPLUS t1 and run without commit
UPDATE fklock.fe05
SET koacd = CURRENT_DATE, kecoo = 0
WHERE fiscal_year_id = 2015
AND wkccd = '16'
AND cowke = '67D'
AND joser = '51111'
AND kopcd = 'A'
AND kowkt = '01';
3. SQLPLUS t2 and run...it is blocked.
UPDATE fklock.fe05
SET koacd = CURRENT_DATE, kecoo = 0
WHERE fiscal_year_id = 2015
AND wkccd = '16'
AND cowke = 'TN1'
AND joser = 'NSS34'
AND kopcd = 'A'
AND kowkt = '02';
*/