select t.obj#,
decode (
-- Condition 1: Table has FGAC for SELECT enabled?
(select count(*) from rls$ r where r.obj#=t.obj#
and r.enable_flag=1 and bitand(r.stmt_type,1)=1)
+ -- Condition 2 and 3: Encrypted cols or queue table?
bitand(t.trigflag, 65536+8388608)
+ -- Condition 4a: BFILE columns?
bitand(t.property, 32768)
+ -- Condition 4b: Opaque columns?
(select count(*) FROM opqtype$ o where o.obj# = t.obj#)
+ -- Condition 5: Cols of evolved types that need upgrading?
(select count(*) FROM coltype$ c where c.obj#=t.obj# and
bitand(c.flags,256)>0)
+ -- Condition 6: Any LONG or LONG RAW columns that are not last?
(select count(*) from col$ c where c.obj#=t.obj# and c.type# IN (8,24)
and c.segcol# !=
(select MAX(c2.segcol#) from col$ c2 where c2.obj#=t.obj#) )
+ -- Condition 7: Columns with embedded opaques?
(select count(*) from coltype$ c, type$ ty where c.obj#=t.obj# and
c.toid=ty.toid and bitand(ty.properties, 4096) > 0)
+ -- Condition 8: table with column added that has NOT NULL and
-- DEFAULT VALUE specified
(select count(*) from ecol$ e where e.tabobj# = t.obj#)
+ -- Condition 9: target is 10g instance and table contains subtype,
-- sql_plan_allstat_row_type. This subtype does not exist in 10.2.
(select count(*) from subcoltype$ sc where sc.obj# = t.obj# and
sc.toid = '00000000000000000000000000020215' and
dbms_metadata.get_version < '11.00.00.00.00')
+ -- Condition 10: table with a RADM masking policy
(select count(*) from radm$ r where r.obj# = t.obj#)
+ -- Condition 11: table is ILM enabled
-- KQLDTVCP2_LIFECYCLE 0x00008000
(bitand(t.property,(32768*4294967296)))
, 0, 1, 4),
--
-- NOTE: The values 1 and 4 from the decode above correspond to the constants
-- prefer_direct and require_external from the package kupd$data_int defined in
-- datapump/dml/prvthpdi. If these values ever change in the package, they must
-- be changed here as well. Can't use pkg's constants because catmeta executes
-- before pkg header is installed.
--
--
-- Ext. Tbls. cannot unload in parallel if:
-- 1. FGAC (row level security) is enabled (Why? see comment below...)
-- 2. It's a nested table
-- 3. Table contains a LOB (possible with columns of type adt, refs,
-- varray or lob).
--
-- The data layer must execute as invoker's rights for unload on FGAC-enabled
-- tables so the security of the caller is enforced (security hole if SYS
-- as definer unloaded the table). But, kxfp processes started in response to
-- a parallel ET unload would also run as the unprived invoker and they then
-- fail calling our internal definer's pkg's like queueing and file mgt.
-- Forcing parallel=1 in this case stays in the context of the worker process
-- which *can* see the internal pkgs because they share the same owner (SYS).
--
decode (
(select count(*) from rls$ r where r.obj#=t.obj# and r.enable_flag=1)
+
bitand(t.property, 2+8+16+8192+262144)
, 0, 1, 0) -- 1: Can do ET parallel unload 0: Can't
from tab$ t
SELECT T.OBJ#
,
DECODE (
-- CONDITION 1: TABLE HAS FGAC FOR SELECT ENABLED?
(SELECT COUNT(*)
FROM RLS$ R
WHERE R.OBJ#=T.OBJ#
AND R.ENABLE_FLAG=1
AND BITAND(R.STMT_TYPE
, 1)=1)
+ -- CONDITION 2
AND 3: ENCRYPTED COLS OR QUEUE TABLE?
BITAND(T.TRIGFLAG
, 65536+8388608)
+ -- CONDITION 4A: BFILE COLUMNS?
BITAND(T.PROPERTY
, 32768)
+ -- CONDITION 4B: OPAQUE COLUMNS?
(SELECT COUNT(*)
FROM OPQTYPE$ O
WHERE O.OBJ# = T.OBJ#)
+ -- CONDITION 5: COLS OF EVOLVED TYPES THAT NEED UPGRADING?
(SELECT COUNT(*)
FROM COLTYPE$ C
WHERE C.OBJ#=T.OBJ# AND
BITAND(C.FLAGS
, 256)>0)
+ -- CONDITION 6: ANY LONG OR LONG RAW COLUMNS THAT ARE NOT LAST?
(SELECT COUNT(*)
FROM COL$ C
WHERE C.OBJ#=T.OBJ#
AND C.TYPE# IN (8
, 24)
AND C.SEGCOL# !=
(SELECT MAX(C2.SEGCOL#)
FROM COL$ C2
WHERE C2.OBJ#=T.OBJ#) )
+ -- CONDITION 7: COLUMNS WITH EMBEDDED OPAQUES?
(SELECT COUNT(*)
FROM COLTYPE$ C
, TYPE$ TY
WHERE C.OBJ#=T.OBJ# AND
C.TOID=TY.TOID
AND BITAND(TY.PROPERTIES
, 4096) > 0)
+ -- CONDITION 8: TABLE WITH COLUMN ADDED THAT HAS NOT NULL AND
-- DEFAULT VALUE SPECIFIED
(SELECT COUNT(*)
FROM ECOL$ E
WHERE E.TABOBJ# = T.OBJ#)
+ -- CONDITION 9: TARGET IS 10G INSTANCE
AND TABLE CONTAINS SUBTYPE
,
-- SQL_PLAN_ALLSTAT_ROW_TYPE. THIS SUBTYPE DOES NOT EXIST IN 10.2.
(SELECT COUNT(*)
FROM SUBCOLTYPE$ SC
WHERE SC.OBJ# = T.OBJ# AND
SC.TOID = '00000000000000000000000000020215' AND
DBMS_METADATA.GET_VERSION < '11.00.00.00.00')
+ -- CONDITION 10: TABLE WITH A RADM MASKING POLICY
(SELECT COUNT(*)
FROM RADM$ R
WHERE R.OBJ# = T.OBJ#)
+ -- CONDITION 11: TABLE IS ILM ENABLED
-- KQLDTVCP2_LIFECYCLE 0X00008000
(BITAND(T.PROPERTY
, (32768*4294967296)))
, 0
, 1
, 4)
,
--
-- NOTE: THE VALUES 1
AND 4
FROM THE DECODE ABOVE CORRESPOND TO THE CONSTANTS
-- PREFER_DIRECT
AND REQUIRE_EXTERNAL
FROM THE PACKAGE KUPD$DATA_INT DEFINED IN
-- DATAPUMP/DML/PRVTHPDI. IF THESE VALUES EVER CHANGE IN THE PACKAGE
, THEY MUST
-- BE CHANGED HERE AS WELL. CAN'T USE PKG'S CONSTANTS BECAUSE CATMETA EXECUTES
-- BEFORE PKG HEADER IS INSTALLED.
--
--
-- EXT. TBLS. CANNOT UNLOAD IN PARALLEL IF:
-- 1. FGAC (ROW LEVEL SECURITY) IS ENABLED (WHY? SEE COMMENT BELOW...)
-- 2. IT'S A NESTED TABLE
-- 3. TABLE CONTAINS A LOB (POSSIBLE WITH COLUMNS OF TYPE ADT
, REFS
,
-- VARRAY OR LOB).
--
-- THE DATA LAYER MUST EXECUTE AS INVOKER'S RIGHTS FOR UNLOAD ON FGAC-ENABLED
-- TABLES SO THE SECURITY OF THE CALLER IS ENFORCED (SECURITY HOLE IF SYS
-- AS DEFINER UNLOADED THE TABLE). BUT
, KXFP PROCESSES STARTED IN RESPONSE TO
-- A PARALLEL ET UNLOAD WOULD ALSO RUN AS THE UNPRIVED INVOKER
AND THEY THEN
-- FAIL CALLING OUR INTERNAL DEFINER'S PKG'S LIKE QUEUEING
AND FILE MGT.
-- FORCING PARALLEL=1 IN THIS CASE STAYS IN THE CONTEXT OF THE WORKER PROCESS
-- WHICH *CAN* SEE THE INTERNAL PKGS BECAUSE THEY SHARE THE SAME OWNER (SYS).
--
DECODE (
(SELECT COUNT(*)
FROM RLS$ R
WHERE R.OBJ#=T.OBJ#
AND R.ENABLE_FLAG=1)
+
BITAND(T.PROPERTY
, 2+8+16+8192+262144)
, 0
, 1
, 0) -- 1: CAN DO ET PARALLEL UNLOAD 0: CAN'T
FROM TAB$ T
|
|
|