[Developer] #567 expose VPD effective SQL trace
This commit is contained in:
@@ -249,12 +249,30 @@ public class OrdsMetadataService {
|
||||
.map(column -> "o." + column)
|
||||
.reduce((left, right) -> left + ",\n " + right)
|
||||
.orElseThrow();
|
||||
String traceSelectColumns = columns.stream()
|
||||
.map(column -> "o." + column)
|
||||
.reduce((left, right) -> left + ", " + right)
|
||||
.orElseThrow();
|
||||
return """
|
||||
DECLARE
|
||||
v_rows SYS_REFCURSOR;
|
||||
v_vpd_predicate VARCHAR2(32767);
|
||||
v_effective_sql VARCHAR2(32767);
|
||||
BEGIN
|
||||
cb_ords_handler_pkg.set_vpd_context(:auth_header);
|
||||
|
||||
-- This is the same predicate function invoked by DBMS_RLS for the
|
||||
-- SELECT below. It is returned only as diagnostic metadata.
|
||||
BEGIN
|
||||
v_vpd_predicate := admin.cb_agent_doc_vpd_filter('%s', '%s');
|
||||
v_effective_sql := 'SELECT %s FROM %s.%s o WHERE (' || v_vpd_predicate
|
||||
|| ') AND ROWNUM <= LEAST(GREATEST(NVL(:row_limit, 50), 1), 500)';
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
v_vpd_predicate := NULL;
|
||||
v_effective_sql := NULL;
|
||||
END;
|
||||
|
||||
OPEN v_rows FOR
|
||||
SELECT %s
|
||||
FROM %s.%s o
|
||||
@@ -266,6 +284,10 @@ public class OrdsMetadataService {
|
||||
OWA_UTIL.HTTP_HEADER_CLOSE;
|
||||
|
||||
APEX_JSON.OPEN_OBJECT;
|
||||
IF v_effective_sql IS NOT NULL THEN
|
||||
APEX_JSON.WRITE('vpd_predicate', v_vpd_predicate);
|
||||
APEX_JSON.WRITE('effective_sql', v_effective_sql);
|
||||
END IF;
|
||||
APEX_JSON.WRITE('items', v_rows);
|
||||
APEX_JSON.CLOSE_OBJECT;
|
||||
|
||||
@@ -279,9 +301,17 @@ public class OrdsMetadataService {
|
||||
OWA_UTIL.HTTP_HEADER_CLOSE;
|
||||
APEX_JSON.OPEN_OBJECT;
|
||||
APEX_JSON.WRITE('error', SQLERRM);
|
||||
APEX_JSON.CLOSE_OBJECT;
|
||||
APEX_JSON.CLOSE_OBJECT;
|
||||
END;
|
||||
""".formatted(selectColumns, object.owner(), object.objectName());
|
||||
""".formatted(
|
||||
object.owner(),
|
||||
object.objectName(),
|
||||
traceSelectColumns,
|
||||
object.owner(),
|
||||
object.objectName(),
|
||||
selectColumns,
|
||||
object.owner(),
|
||||
object.objectName());
|
||||
}
|
||||
|
||||
private void rejectGenericVectorHandler(ProtectedObject object) {
|
||||
|
||||
Reference in New Issue
Block a user