diff --git a/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_agent.sql b/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_agent.sql index 2b979d0..34205ea 100644 --- a/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_agent.sql +++ b/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_agent.sql @@ -42,19 +42,30 @@ VAR v_ai_profile_name VARCHAR2(128) EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; - - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; - - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; - - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; diff --git a/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_tools.sql b/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_tools.sql index a6758d0..39a3255 100644 --- a/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_tools.sql +++ b/autonomous-ai-agents/cloud_repo_connector/cloud_repo_connector_tools.sql @@ -76,7 +76,17 @@ IS ); PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + FOR i IN 1 .. p_objects.COUNT LOOP BEGIN EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema; diff --git a/autonomous-ai-agents/database_inspect/README.md b/autonomous-ai-agents/database_inspect/README.md index 926fc4f..58de424 100644 --- a/autonomous-ai-agents/database_inspect/README.md +++ b/autonomous-ai-agents/database_inspect/README.md @@ -1,8 +1,9 @@ -# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent +# Select AI Inspect - Database Inspection Tool Built Using Select AI Agent (23ai/26ai) ## Overview Select AI Inspect is an AI-powered database inspection tool built using the **Select AI Agent** framework. It enables users to explore, understand, and interact with database objects and their metadata using natural language. +This agent is supported only on Oracle Database **23ai** and **26ai**. For definitions of **Tool**, **Task**, **Agent**, and **Agent Team**, see the top-level guide: [README](../README.md#simple-agent-execution-flow). @@ -48,7 +49,7 @@ Users may define the inspection scope either at the individual object level or a ## Prerequisites -- Oracle Autonomous AI Database (26ai recommended) +- Oracle Database 23ai or 26ai (Autonomous AI Database supported) - Select AI and `DBMS_CLOUD_AI_AGENT` enabled - `ADMIN` or equivalent privileged user for installation - A Select AI profile created with `DBMS_CLOUD_AI.CREATE_PROFILE` @@ -79,27 +80,37 @@ You can also execute the contents of `database_inspect_tool.sql` and `database_i ## Architecture Overview -Run `database_inspect_tool.sql` to install `DATABASE_INSPECT` package and tools - ↓ -Run `database_inspect_agent.sql` to configure and create the inspect agent team - ↓ -execute `DATABASE_INSPECT.create_inspect_agent_team(, )` to create an Inspect agent; - ↓ +```text +Run database_inspect_tool.sql to install DATABASE_INSPECT package and tools + | + v +Run database_inspect_agent.sql to configure and create the inspect agent team + | + v +Execute DATABASE_INSPECT.create_inspect_agent_team(, ) +to create an inspect agent + | + v User query - ↓ + | + v - ↓ -Agent Reasoning - ├── LIST_OBJECTS - ├── LIST_INCOMING_DEPENDENCIES - ├── LIST_OUTGOING_DEPENDENCIES - ├── RETRIEVE_OBJECT_METADATA - ├── RETRIEVE_OBJECT_METADATA_CHUNKS - ├── EXPAND_OBJECT_METADATA_CHUNK - ├── SUMMARIZE_OBJECT - └── GENERATE_PLDOC - ↓ -Final Verified Answer + | + v +Agent reasoning + | + +-- LIST_OBJECTS + +-- LIST_INCOMING_DEPENDENCIES + +-- LIST_OUTGOING_DEPENDENCIES + +-- RETRIEVE_OBJECT_METADATA + +-- RETRIEVE_OBJECT_METADATA_CHUNKS + +-- EXPAND_OBJECT_METADATA_CHUNK + +-- SUMMARIZE_OBJECT + `-- GENERATE_PLDOC + | + v +Final verified answer +``` --- diff --git a/autonomous-ai-agents/database_inspect/database_inspect_agent.sql b/autonomous-ai-agents/database_inspect/database_inspect_agent.sql index 66662e3..4f0a5c9 100644 --- a/autonomous-ai-agents/database_inspect/database_inspect_agent.sql +++ b/autonomous-ai-agents/database_inspect/database_inspect_agent.sql @@ -95,30 +95,41 @@ EXEC :v_team_attributes_json := '&TEAM_ATTRIBUTES_JSON'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_REPO TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - BEGIN - l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || :v_schema; + l_sql := 'GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO ' || l_schema; EXECUTE IMMEDIATE l_sql; - EXCEPTION - WHEN OTHERS THEN - DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM); - END; + + BEGIN + l_sql := 'GRANT EXECUTE ON CTXSYS.CTX_DDL TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + EXCEPTION + WHEN OTHERS THEN + DBMS_OUTPUT.PUT_LINE('Warning: failed to grant CTXSYS.CTX_DDL - ' || SQLERRM); + END; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; diff --git a/autonomous-ai-agents/database_inspect/database_inspect_tool.sql b/autonomous-ai-agents/database_inspect/database_inspect_tool.sql index 5774693..de41711 100644 --- a/autonomous-ai-agents/database_inspect/database_inspect_tool.sql +++ b/autonomous-ai-agents/database_inspect/database_inspect_tool.sql @@ -65,7 +65,17 @@ IS p_objects IN priv_list_t ) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + FOR i IN 1 .. p_objects.COUNT LOOP BEGIN EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema; diff --git a/autonomous-ai-agents/jira_insight/jira_insight_agent.sql b/autonomous-ai-agents/jira_insight/jira_insight_agent.sql index 1e6757c..6a1c2d2 100644 --- a/autonomous-ai-agents/jira_insight/jira_insight_agent.sql +++ b/autonomous-ai-agents/jira_insight/jira_insight_agent.sql @@ -92,16 +92,27 @@ VAR v_ai_profile_name VARCHAR2(128) EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; - - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; - - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; diff --git a/autonomous-ai-agents/jira_insight/jira_insight_tools.sql b/autonomous-ai-agents/jira_insight/jira_insight_tools.sql index a99247e..3d80db5 100644 --- a/autonomous-ai-agents/jira_insight/jira_insight_tools.sql +++ b/autonomous-ai-agents/jira_insight/jira_insight_tools.sql @@ -111,7 +111,17 @@ IS ); PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + FOR i IN 1 .. p_objects.COUNT LOOP BEGIN EXECUTE IMMEDIATE 'GRANT EXECUTE ON ' || p_objects(i) || ' TO ' || p_schema; diff --git a/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_agent.sql b/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_agent.sql index 1f91dcc..5925060 100644 --- a/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_agent.sql +++ b/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_agent.sql @@ -111,16 +111,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; @@ -285,4 +296,4 @@ PROMPT ====================================================== PROMPT Installation finished successfully PROMPT ====================================================== -alter session set current_schema = ADMIN; \ No newline at end of file +alter session set current_schema = ADMIN; diff --git a/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_tool.sql b/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_tool.sql index 08ae964..45e0b92 100644 --- a/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_tool.sql +++ b/autonomous-ai-agents/nl2sql_data_retrieval/nl2sql_data_retrieval_tool.sql @@ -163,7 +163,17 @@ IS -- Helper: grant execute on list of objects ---------------------------------------------------------------------------- PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema; FOR i IN 1 .. p_objects.COUNT LOOP BEGIN @@ -649,11 +659,11 @@ AS method => 'GET', uri => url ); - - l_result := DBMS_LOB.SUBSTR(DBMS_VECTOR_CHAIN.UTL_TO_TEXT(DBMS_CLOUD.GET_RESPONSE_RAW(l_resp)), 32767, 1); + l_result := DBMS_CLOUD.GET_RESPONSE_TEXT(l_resp); + l_result := DBMS_LOB.SUBSTR(l_result, 32767, 1); RETURN l_result; - + END get_url_content; FUNCTION get_distinct_values_func ( @@ -1073,6 +1083,3 @@ END; alter session set current_schema = ADMIN; - - - diff --git a/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_agent.sql b/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_agent.sql index b9f3916..15aaff5 100644 --- a/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_agent.sql +++ b/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_agent.sql @@ -115,16 +115,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; @@ -259,4 +270,4 @@ PROMPT Installation finished successfully PROMPT ====================================================== -alter session set current_schema = ADMIN; \ No newline at end of file +alter session set current_schema = ADMIN; diff --git a/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_tools.sql b/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_tools.sql index 8a26508..a62eeca 100644 --- a/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_tools.sql +++ b/autonomous-ai-agents/oci_autonomous_database/oci_autonomous_database_tools.sql @@ -143,7 +143,17 @@ IS -- Helper: grant execute on list of objects ---------------------------------------------------------------------------- PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema; FOR i IN 1 .. p_objects.COUNT LOOP BEGIN diff --git a/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_agent.sql b/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_agent.sql index a26a5a6..a1580bd 100644 --- a/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_agent.sql +++ b/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_agent.sql @@ -113,16 +113,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; @@ -254,4 +265,4 @@ alter session set current_schema = ADMIN; PROMPT ====================================================== PROMPT Installation finished successfully -PROMPT ====================================================== \ No newline at end of file +PROMPT ====================================================== diff --git a/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_tools.sql b/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_tools.sql index e442e7a..75336f3 100644 --- a/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_tools.sql +++ b/autonomous-ai-agents/oci_network_load_balancer/oci_network_load_balancer_tools.sql @@ -149,7 +149,17 @@ IS -- Helper: grant execute on list of objects ---------------------------------------------------------------------------- PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema; FOR i IN 1 .. p_objects.COUNT LOOP BEGIN diff --git a/autonomous-ai-agents/oci_object_storage/oci_object_storage_agent.sql b/autonomous-ai-agents/oci_object_storage/oci_object_storage_agent.sql index bd6ae40..79abdcf 100644 --- a/autonomous-ai-agents/oci_object_storage/oci_object_storage_agent.sql +++ b/autonomous-ai-agents/oci_object_storage/oci_object_storage_agent.sql @@ -112,16 +112,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; @@ -171,13 +182,11 @@ BEGIN || '- Bullet points for simple lists. ' || '- Indented JSON for structured responses. ' || 'Use LIST_COMPARTMENTS_TOOL to list compartments. ' - || 'Use LIST_SUBSCRIBED_REGIONS_TOOL to list regions and confirm with user. ' || 'Automatically derive namespace using GET_NAMESPACE_TOOL. ' || 'Confirm destructive actions before execution. ' || 'User request: {query}", "tools": [ "LIST_COMPARTMENTS_TOOL", - "LIST_SUBSCRIBED_REGIONS_TOOL", "GET_NAMESPACE_TOOL", "CREATE_BUCKET_TOOL", "DELETE_BUCKET_TOOL", diff --git a/autonomous-ai-agents/oci_object_storage/oci_object_storage_tools.sql b/autonomous-ai-agents/oci_object_storage/oci_object_storage_tools.sql index 9ace742..47a72c3 100644 --- a/autonomous-ai-agents/oci_object_storage/oci_object_storage_tools.sql +++ b/autonomous-ai-agents/oci_object_storage/oci_object_storage_tools.sql @@ -216,7 +216,17 @@ IS -- Helper: grant execute on list of objects ---------------------------------------------------------------------------- PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema; FOR i IN 1 .. p_objects.COUNT LOOP BEGIN @@ -791,6 +801,10 @@ AS region IN VARCHAR2 ) RETURN CLOB; + -- Helper: gets the list of compartments using configured credentials + FUNCTION list_compartments + RETURN CLOB; + END oci_object_storage_agents; / @@ -920,6 +934,45 @@ AS RETURN l_result_json.to_clob(); END list_compartments; + -- Helper: gets the list of compartments using configured credentials + FUNCTION list_compartments + RETURN CLOB + IS + l_result_json JSON_OBJECT_T := JSON_OBJECT_T(); + l_current_user VARCHAR2(128) := SYS_CONTEXT('USERENV', 'CURRENT_USER'); + l_cfg_json CLOB; + l_cfg JSON_OBJECT_T; + l_params JSON_OBJECT_T; + l_credential_name VARCHAR2(256); + BEGIN + l_cfg_json := get_agent_config( + l_current_user, + 'SELECTAI_AGENT_CONFIG', + 'OCI_OBJECT_STORAGE' + ); + l_cfg := JSON_OBJECT_T.parse(l_cfg_json); + + IF l_cfg.get_string('status') = 'success' THEN + l_params := l_cfg.get_object('config_params'); + l_credential_name := l_params.get_string('CREDENTIAL_NAME'); + END IF; + + IF l_credential_name IS NULL OR TRIM(l_credential_name) IS NULL THEN + l_result_json.put('status', 'error'); + l_result_json.put('message', 'Credential name is not configured. Set CREDENTIAL_NAME in SELECTAI_AGENT_CONFIG before calling this tool.'); + RETURN l_result_json.to_clob(); + END IF; + + RETURN list_compartments(credential_name => l_credential_name); + + EXCEPTION + WHEN OTHERS THEN + l_result_json := JSON_OBJECT_T(); + l_result_json.put('status', 'error'); + l_result_json.put('message', 'Error: ' || SQLERRM); + RETURN l_result_json.to_clob(); + END list_compartments; + -- Helper: gets the compartment ocid with the given compatment name FUNCTION get_compartment_ocid_by_name( compartment_name IN VARCHAR2 @@ -4170,6 +4223,20 @@ IS END IF; END drop_tool_if_exists; BEGIN + ------------------------------------------------------------------------ + -- AI TOOL: LIST_COMPARTMENTS_TOOL + -- maps to oci_object_storage_agents.list_compartments + ------------------------------------------------------------------------ + drop_tool_if_exists(tool_name => 'LIST_COMPARTMENTS_TOOL'); + DBMS_CLOUD_AI_AGENT.CREATE_TOOL( + tool_name => 'LIST_COMPARTMENTS_TOOL', + attributes => '{ + "instruction": "List compartments visible to the configured tenancy and credentials, including OCID and lifecycle metadata.", + "function": "oci_object_storage_agents.list_compartments" + }', + description => 'Tool for listing OCI compartments' + ); + ------------------------------------------------------------------------ -- AI TOOL: LIST_OBJECTS_TOOL -- maps to oci_object_storage_agents.list_objects @@ -4774,4 +4841,4 @@ BEGIN END; / -alter session set current_schema = ADMIN; \ No newline at end of file +alter session set current_schema = ADMIN; diff --git a/autonomous-ai-agents/oci_vault/oci_vault_agent.sql b/autonomous-ai-agents/oci_vault/oci_vault_agent.sql index 3642c29..dfb9486 100644 --- a/autonomous-ai-agents/oci_vault/oci_vault_agent.sql +++ b/autonomous-ai-agents/oci_vault/oci_vault_agent.sql @@ -108,16 +108,27 @@ EXEC :v_ai_profile_name := '&AI_PROFILE_NAME'; -- 1. Grants (safe to re-run) ---------------------------------------------------------------- DECLARE - l_sql VARCHAR2(500); + l_sql VARCHAR2(500); + l_schema VARCHAR2(128); + l_session_user VARCHAR2(128); BEGIN - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_schema := DBMS_ASSERT.SIMPLE_SQL_NAME(:v_schema); + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + -- Avoid self-grant errors (ORA-01749) when target schema == connected user. + IF UPPER(l_schema) <> UPPER(l_session_user) THEN + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI_AGENT TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; - l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || :v_schema; - EXECUTE IMMEDIATE l_sql; + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD_AI TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + + l_sql := 'GRANT EXECUTE ON DBMS_CLOUD TO ' || l_schema; + EXECUTE IMMEDIATE l_sql; + ELSE + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || l_schema || + ' (same as session user).'); + END IF; DBMS_OUTPUT.PUT_LINE('Grants completed.'); END; @@ -250,4 +261,4 @@ alter session set current_schema = ADMIN; PROMPT ====================================================== PROMPT Installation finished successfully -PROMPT ====================================================== \ No newline at end of file +PROMPT ====================================================== diff --git a/autonomous-ai-agents/oci_vault/oci_vault_tools.sql b/autonomous-ai-agents/oci_vault/oci_vault_tools.sql index 3da0e0c..46108e4 100644 --- a/autonomous-ai-agents/oci_vault/oci_vault_tools.sql +++ b/autonomous-ai-agents/oci_vault/oci_vault_tools.sql @@ -143,7 +143,17 @@ IS -- Helper: grant execute on list of objects ---------------------------------------------------------------------------- PROCEDURE execute_grants(p_schema IN VARCHAR2, p_objects IN priv_list_t) IS + l_session_user VARCHAR2(128); BEGIN + l_session_user := SYS_CONTEXT('USERENV', 'SESSION_USER'); + + -- Avoid self-grant errors (ORA-01749) when installer schema == connected user. + IF UPPER(p_schema) = UPPER(l_session_user) THEN + DBMS_OUTPUT.PUT_LINE('Skipping grants for schema ' || p_schema || + ' (same as session user).'); + RETURN; + END IF; + EXECUTE IMMEDIATE 'GRANT SELECT ON SYS.V_$PDBS TO ' || p_schema; FOR i IN 1 .. p_objects.COUNT LOOP BEGIN