Showing posts with label data access. Show all posts
Showing posts with label data access. Show all posts

Wednesday, January 28, 2026

Understanding Table Hyperlinks (PAR URLs) with Private Endpoints in Autonomous AI Database

Oracle Autonomous AI Database (ADB) provides a powerful feature called Table Hyperlinks, also known as Pre-Authenticated Request (PAR) URLs, which allows you to securely access query results over HTTPS without exposing database credentials.
 
When private endpoints enter the picture, especially with “Allow public access” enabled, the behaviour of these URLs can be a little confusing. In this post, we’ll walk through:
  • What URLs are generated
  • How public and private PAR URLs differ
  • Why one works only inside a VCN
  • What to expect when accessing them from outside
 
Scenario Setup
  • Database type: Autonomous AI Database
  • Connectivity: Private Endpoint enabled
  • Private endpoint setting: Allow public access = Enabled
 
With this configuration, ADB is reachable:
  • Privately from within the VCN
  • Publicly through Oracle-managed public endpoints 
Now let’s see what happens when we create a table hyperlink.
 
rajesh@ADB26> declare
  2     l_status long;
  3  begin
  4     dbms_data_access.create_url(
  5          sql_statement => ' select * from DEPT '
  6         , service_name =>'LOW'
  7         , inherit_acl => TRUE
  8         , result => l_status );
  9     dbms_output.put_line( l_status );
 10  end;
 11* /
{
  "status" : "SUCCESS",
  "id" : "N6Xz9aBiKGxtIcFhUneVYKatytDgmJERzQsY_Wi1PoaAeBS5nrM2WF0OQl4Vi1Pf",
  "preauth_url" : "https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/3wVmqlHLmedig2SvPAka6LfvBpDGbPEuHa8dmgl3D80J4Pl1TO13Qsqpd_wup98-5te4uhOCwNk/data",
  "private_preauth_url" : "https://l1aoobfh.adb.us-ashburn-1.oraclecloudapps.com/adb/p/3wVmqlHLmedig2SvPAka6LfvBpDGbPEuHa8dmgl3D80J4Pl1TO13Qsqpd_wup98-5te4uhOCwNk/data",
  "expiration_ts" : "2026-04-20T07:34:14.072Z"
}

Notice the two different URLs returned.
 


 
The preauth_url it is of this format
 
https://dataaccess.adb.<region>.oraclecloudapps.com/adb/p/<token>/data
 
this preauth_url uses Oracle’s public ADB data access endpoint, accessible over the internet, inherits ADB’s network access control list (ACL’s) and expiration time, and this will works when the database has the private endpoint (as longs as public access is allowed)
 
the private_preauth_url  is of this format
 
https://<private-endpoint>.adb.<region>.oraclevcn.com/adb/p/<token>/data
 
this private_preauth_url resolves to a VCN-Scoped private DNS names , only resolves inside the VCN, intended for workloads running within the OCI ( OKE, Compute, Bastion etc )
 
 when the request is made for accessing the private PAR url from the host within the VCN, everything works as expected.

 
demo@ADB26ai> $ curl https://l1aoobfh.adb.us-ashburn-1.oraclevcn.com/adb/p/3wVmqlHLmedig2SvPAka6LfvBpDGbPEuHa8dmgl3D80J4Pl1TO13Qsqpd_wup98-5te4uhOCwNk/data
 
{
  "items": [
    {
      "DEPTNO": 10,
      "DNAME": "ACCOUNTING",
      "LOC": "NEW YORK"
    },
    {
      "DEPTNO": 20,
      "DNAME": "RESEARCH",
      "LOC": "DALLAS"
    },
    {
      "DEPTNO": 30,
      "DNAME": "SALES",
      "LOC": "CHICAGO"
    },
    {
      "DEPTNO": 40,
      "DNAME": "OPERATIONS",
      "LOC": "BOSTON"
    }
  ],
  "hasMore": false,
  "limit": 1000,
  "offset": 0,
  "count": 4,
  "links": [
    {
      "rel": "self",
      "href": "https://l1aoobfh.adb.us-ashburn-1.oraclevcn.com/adb/p/3wVmqlHLmedig2SvPAka6LfvBpDGbPEuHa8dmgl3D80J4Pl1TO13Qsqpd_wup98-5te4uhOCwNk/data"
    }
  ]
}
 
The private endpoint DNS resolves correctly, the request reaches the ADB private endpoint and the data is returned successfully.
 
Now accessing the same URL from any system outside the VCN connectivity
 
curl https://l1aoobfh.adb.us-ashburn-1.oraclevcn.com/adb/p/3wVmqlHLmedig2SvPAka6LfvBpDGbPEuHa8dmgl3D80J4Pl1TO13Qsqpd_wup98-5te4uhOCwNk/data
 
curl: (6) Could not resolve host: l1aoobfh.adb.us-ashburn-1.oraclevcn.com
 


 
this behaviour is expected and by design the oraclevcn.com domain is private DNS, it is only resolvable from within the OCI VCN, public DNS servers has no knowledge of this hostname, so even though “Allow public access” is enabled, the Private PAR URL remains private and inaccessible from the internet. 
 
So the key takeaways are when creating table hyperlink on an ADB with private endpoints, we will received both private and public PAR urls, we can use private_preauth_url when accessing the data within the VCN , from OCI compute, OKE, Bastion host etc, use preauth_url when accessing the data from outside the VCN – on prem systems or external services – so DNS resolution failures outside the VCN are not the bug , but a security feature.
 
Table Hyperlinks combined with private endpoints give you a lot of flexibility—but only if you clearly understand which URL is meant for which network boundary. If you’re designing integrations or sharing PAR URLs with external consumers, always make sure you’re distributing the public preauth_url, not the private one.

 
 


Wednesday, December 17, 2025

Federated Tables in ADB-S : Simplifying Cross-Database Data Access

In the past, we have discussed accessing table hyperlinks (also known as PAR URLs) using external tables. This post focuses on a new enhancement in the Autonomous Database – Shared Infrastructure (ADB-S) platform called Federated Tables.

 

Federated Tables automate the creation of table hyperlinks, map them to external tables, and provide read-only SQL access to remote data—without requiring manual PAR URL management.

 



 

In this example, the setup is done between two databases running in OCI:

  • Source (Producer): Oracle Autonomous Database 19c
  • Target (Consumer): Oracle Autonomous Database 26ai

 

Both databases reside within the same OCI compartment. 

Step 1: Grant Scope Registration Privilege on the Source Database 

First, grant the scope registration privilege to the schema that owns the data in the source database.

 admin@ATP19C> exec dbms_data_access_admin.grant_register('DEMO',scope=>'MY$COMPARTMENT');

 PL/SQL procedure successfully completed.

  

This grants the DEMO schema permission to share data at the compartment level.

 


Step 2: Register the Creation Scope for Shared Objects

 

Next, the data owner registers the creation scope for specific objects. This authorizes consumer databases in the same compartment to create table hyperlinks remotely.

demo@ATP19C> begin
  2     dbms_data_access_scope.register_creation_scope(
  3         schema_name => user
  4         , schema_object_list => '["DEPT","BIG_TABLE"]'
  5         , scope=>'MY$COMPARTMENT' );
  6  end;
  7* /

PL/SQL procedure successfully completed.

demo@ATP19C>

 This step explicitly defines which objects can be shared. To make this sharing to happen at schema level (or) for all the (existing/upcoming) objects in the schema we can pass schema_object_list parameter as NULL

 Step 3: Grant Read Access on the Target (Consumer) Database 


On the target database, grant the required privileges to the consumer schema. 

admin@ADB26ai> grant execute on dbms_data_access to DEMO_USER; 

Grant succeeded. 


Then below grant will provide read access to the remote schema and object to the target schema DEMO_USER in the consumer database. 

Step 4: Create the Federated Table on the Consumer Database

admin@ADB26ai> begin
  2     DBMS_DATA_ACCESS_ADMIN.GRANT_READ(
  3         username => 'DEMO_USER'
  4         , remote_schema_name => 'DEMO'
  5         , remote_schema_object_name => 'DEPT' );
  6  end;
  7* / 

PL/SQL procedure successfully completed.
 
Finally, create the federated external table using the CREATE_FEDERATED_TABLE procedure. 

demo-user@ADB26ai> begin
  2     dbms_data_access.create_federated_table(
  3         table_name => 'MY_DEPT_DEMO'
  4         , remote_schema_name =>'DEMO'
  5         , remote_schema_object_name =>'DEPT'
  6         , db_ocids => '[{"region":"IAD","db_ocid":"OCID1.AUTONOMOUSDATABASE.OC1.IAD.ANUWCLJS3CXJV6AALSKNDVN2XUPBL46LP53FXJQYGOOU5K77X7BTIX2GIFKQ"}]' );
  7  end;
  8* / 

PL/SQL procedure successfully completed. 

The region and db_ocid in the above method, refers to the source (producer) database where the data resides. 

Step 5: Query the Federated Table
 
Once created, the federated table can be queried like a regular table.
 
demo-user@ADB26ai> select * from MY_DEPT_DEMO ;
 
   DEPTNO DNAME         LOC
_________ _____________ ___________
       10 ACCOUNTING    NEW YORK
       20 RESEARCH      DALLAS
       30 SALES         CHICAGO
       40 OPERATIONS    BOSTON

 

Inspecting the table metadata shows that the federated table is implemented as an external table backed by a table hyperlink.

 

demo-user@ADB26ai> select dbms_metadata.get_ddl('TABLE','MY_DEPT_DEMO') ; 
DBMS_METADATA.GET_DDL('TABLE','MY_DEPT_DEMO')
________________________________________________________________ 
  CREATE TABLE "DEMO_USER"."MY_DEPT_DEMO"
   (    "DEPTNO" NUMBER,
        "DNAME" VARCHAR2(14) COLLATE "USING_NLS_COMP",
        "LOC" VARCHAR2(13) COLLATE "USING_NLS_COMP"
   )  DEFAULT COLLATION "USING_NLS_COMP"
   ORGANIZATION EXTERNAL
    ( TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "DATA_PUMP_DIR"
      ACCESS PARAMETERS
      ( RECORDS ESCAPE CHARACTERSET AL32UTF8 ALLOW MISSING FILES DELIMITED BY NEWLINE NOLOGFILE NOBADFILE NODISCARDFILE READSIZE=10000000
    FIELDS CSV WITHOUT EMBEDDED TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' MISSING FIELD VALUES ARE NULL   NOTRIM )
      LOCATION
       ( 'https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/8ldGfvy2qeSeJzDaZ_rtf2aTjutCJAURrI5yKLrk8z743dvC64fYj4IwkUzp54cw9dsHPKpaPjc/data*')
    )
   REJECT LIMIT 0
  PARALLEL

 

The LOCATION clause points to a secure HTTPS endpoint, which is the generated table hyperlink.

 

The same table hyperlink can be accessed using any REST client (such as curl, Postman, or Insomnia)

 

$ curl --location 'https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/8ldGfvy2qeSeJzDaZ_rtf2aTjutCJAURrI5yKLrk8z743dvC64fYj4IwkUzp54cw9dsHPKpaPjc/data'

{
  "items": [
    {
      "DEPTNO": 10,
      "DNAME": "ACCOUNTING",
      "LOC": "NEW YORK"
    },
    {
      "DEPTNO": 20,
      "DNAME": "RESEARCH",
      "LOC": "DALLAS"
    },
    {
      "DEPTNO": 30,
      "DNAME": "SALES",
      "LOC": "CHICAGO"
    },
    {
      "DEPTNO": 40,
      "DNAME": "OPERATIONS",
      "LOC": "BOSTON"
    }
  ],
  "hasMore": false,
  "limit": 1000,
  "offset": 0,
  "count": 4,
  "links": [
    {
      "rel": "self",
      "href": "https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/8ldGfvy2qeSeJzDaZ_rtf2aTjutCJAURrI5yKLrk8z743dvC64fYj4IwkUzp54cw9dsHPKpaPjc/data"
    }
  ]
}
 
 

Federated Tables in ADB-S provide a secure and streamlined way to:

  • Share data across Autonomous Databases
  • Eliminate manual PAR URL handling
  • Access remote data using standard SQL
  • Consume the same data via REST endpoints 

This feature significantly simplifies cross-database data sharing while maintaining strong access controls. 

 

 


Thursday, November 27, 2025

Creating and Using Table Hyperlink Groups in Oracle Autonomous Database

Table Hyperlinks in Oracle Autonomous Database provide a secure and convenient way to expose database objects and SQL query results through pre-authenticated URLs.
 
A recent enhancement extends this capability even further—Table Hyperlink Groups, which allow a single URL to represent multiple hyperlinks, each pointing to a table, view, or SQL query.
 
A Hyperlink Group allows you to bundle several table hyperlinks into a single group URL.
This is useful when: 
  • You want a single API endpoint that exposes multiple datasets
  • You want to simplify integration for downstream systems
  • You want to centralize access control under one pre-authenticated URL
  • You want to organize multiple SQL queries or objects logically
 
Below is a conceptual representation:



 
In this example, we will see how to create a Table Hyperlink Group using two data sources — one defined by a SQL query and the other referencing a table.
 
demo-user@ATP19C> declare
  2     l_status long;
  3  begin
  4     dbms_data_access.create_url(
  5             sqls => '[
  6                               {
  7                                     "name": "Employees table",
  8                                     "description": "Employees details",
  9                                     "sql_statement": " select empno,ename,hiredate,job,deptno from emp "
 10                               },
 11                               {
 12                                     "name": "Department table",
 13                                     "description": "Department details",
 14                                     "schema_name": "DEMO_USER",
 15                                     "schema_object_name": "DEPT"
 16                               }
 17                             ]'
 18             , result => l_status );
 19     dbms_output.put_line( l_status );
 20  end;
 21  /
{
  "status" : "SUCCESS",
  "id" : "JxfkVbJGWKYbD83nyC1wgcGTEuO2-6lzJDgN68V5Z7_Xf4OUTERg7CeUmXnU0RQh",
  "preauth_url" : "https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data",
  "member_ids" :
  [
    "T_mxypj7jytHDoW5Li--q0Agxk_TKL3s2SZ46bJ0R6rMrDFa-X8lTLV5KjHsnEUk",
    "9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J"
  ],
  "expiration_ts" : "2026-02-23T16:33:47.309Z"
}
 
PL/SQL procedure successfully completed.
 
demo-user@ATP19C>
 
Calling the group URL returns information about all member hyperlinks:
 
$ curl https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data
 
{
  "member_urls": [
    {
      "id": "T_mxypj7jytHDoW5Li--q0Agxk_TKL3s2SZ46bJ0R6rMrDFa-X8lTLV5KjHsnEUk",
      "name": "Employees table",
      "description": "Employees details"
    },
    {
      "id": "9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J",
      "name": "Department table",
      "description": "Department details"
    }
  ]
}
 
 
To query data from a specific member in the group, supply its member_id:
 
$ curl https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data?member_id=9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J
 
{
  "items": [
    {
      "DEPTNO": 10,
      "DNAME": "ACCOUNTING",
      "LOC": "NEW YORK"
    },
    {
      "DEPTNO": 20,
      "DNAME": "RESEARCH",
      "LOC": "DALLAS"
    },
    {
      "DEPTNO": 30,
      "DNAME": "SALES",
      "LOC": "CHICAGO"
    },
    {
      "DEPTNO": 40,
      "DNAME": "OPERATIONS",
      "LOC": "BOSTON"
    }
  ],
  "hasMore": false,
  "limit": 1000,
  "offset": 0,
  "count": 4,
  "links": [
    {
      "rel": "self",
      "href": "https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data?member_id=9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J"
    }
  ]
}
 
You can list all active hyperlinks — including groups — using json_table on dbms_data_access.list_active_urls:
 
demo-user@ATP19C> select *
  2  from
  3      json_table ( dbms_data_access.list_active_urls, '$[*]'
  4          columns (
  5              id
  6          , created_by
  7          , access_count
  8          , created path '$.created.timestamp()'
  9         , sql_statement
 10         , is_group_url
 11         )
 12*    ) ;
 
ID                                                                  CREATED_BY    ACCESS_COUNT    CREATED                            SQL_STATEMENT                                                       IS_GROUP_URL
___________________________________________________________________ _____________ _______________ __________________________________ ___________________________________________________________________ _______________
4PVOG8xtDt7CXzyhcKDcbAkW2rnXAWrzMAGt9W7D5IAOQwjPkrZbSGwRpsR7UNkP    DEMO_USER     1               15-NOV-25 03.54.44.291000000 PM     select * from emp where hiredate = :b1
JxfkVbJGWKYbD83nyC1wgcGTEuO2-6lzJDgN68V5Z7_Xf4OUTERg7CeUmXnU0RQh    DEMO_USER     4               25-NOV-25 04.33.47.333000000 PM                                                                        true
vzCL8zVM2Vj5Z0jGqhIb-56J7SlRvvnnqdelPVmUhOcRz2NbgG4BMVnGqY5dxCzU    DEMO_USER     4               16-NOV-25 03.57.59.390000000 PM     select * from emp where deptno = 10
v09slcWFCCHUgaH3XEEqqwMQClpSHabYebpYPaFp6Z3vsdnT6An8CZeCmfJv0-Oy    DEMO_USER     5               15-NOV-25 01.16.01.541000000 PM     select * from emp where deptno = :deptId
sfBVyDyNXhkwsodUQDHMnAaa4nrlAeVt4_2SE0F5yX0iMwfJNgUhScUlZ2Og8u0I    DEMO_USER     2               15-NOV-25 03.57.33.997000000 PM     select * from emp where hiredate >= to_date(:b1,'dd-mon-yyyy')
gTqfJcv0JfckskdR7eI77QCUrMcMe5N4k1iXeeWstlo6c7uKxXQbyQQPotFTi10E    DEMO_USER     12              21-NOV-25 02.58.18.205000000 PM     select * from emp where deptno = :b1 and job = :b2
 
6 rows selected.
 
is_group_url = TRUE identifies group hyperlinks
 
To list the member hyperlinks of an existing table hyperlink group, we can do the below pl/sql call.

 
demo-user@ATP19C> declare
  2     l_status clob;
  3  begin
  4     dbms_data_access.list_members(
  5         id => 'JxfkVbJGWKYbD83nyC1wgcGTEuO2-6lzJDgN68V5Z7_Xf4OUTERg7CeUmXnU0RQh'
  6         , result => l_status );
  7     dbms_output.put_line( l_status );
  8  end;
  9* /
{
  "members" :
  [
    {
      "id" : "T_mxypj7jytHDoW5Li--q0Agxk_TKL3s2SZ46bJ0R6rMrDFa-X8lTLV5KjHsnEUk",
      "consistent" : false,
      "sql_statement" : " select empno,ename,hiredate,job,deptno from emp ",
      "name" : "Employees table",
      "description" : "Employees details"
    },
    {
      "id" : "9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J",
      "consistent" : false,
      "schema_name" : "DEMO_USER",
      "schema_object_name" : "DEPT",
      "name" : "Department table",
      "description" : "Department details"
    }
  ]
}
 
You can add an existing standalone hyperlink to a group using add_member:
 
demo-user@ATP19C> declare
  2     l_status clob ;
  3  begin
  4     dbms_data_access.add_member(
  5         id => 'JxfkVbJGWKYbD83nyC1wgcGTEuO2-6lzJDgN68V5Z7_Xf4OUTERg7CeUmXnU0RQh'
  6         , member_id =>'v09slcWFCCHUgaH3XEEqqwMQClpSHabYebpYPaFp6Z3vsdnT6An8CZeCmfJv0-Oy'
  7         , result => l_status );
  8     dbms_output.put_line( l_status );
  9  end;
 10* /
{
  "status" : "SUCCESS"
}
 
 
Verifying the update group members
 
demo-user@ATP19C> declare
  2     l_status clob;
  3  begin
  4     dbms_data_access.list_members(
  5         id => 'JxfkVbJGWKYbD83nyC1wgcGTEuO2-6lzJDgN68V5Z7_Xf4OUTERg7CeUmXnU0RQh'
  6         , result => l_status );
  7     dbms_output.put_line( l_status );
  8  end;
  9* /
{
  "members" :
  [
    {
      "id" : "T_mxypj7jytHDoW5Li--q0Agxk_TKL3s2SZ46bJ0R6rMrDFa-X8lTLV5KjHsnEUk",
      "consistent" : false,
      "sql_statement" : " select empno,ename,hiredate,job,deptno from emp ",
      "name" : "Employees table",
      "description" : "Employees details"
    },
    {
      "id" : "v09slcWFCCHUgaH3XEEqqwMQClpSHabYebpYPaFp6Z3vsdnT6An8CZeCmfJv0-Oy",
      "consistent" : false,
      "sql_statement" : " select * from emp where deptno = :deptId "
    },
    {
      "id" : "9I6oXda2SKvyDfTu8cCsr8c9T_BOUqIHT0kz4qgvWWAHG3dWYfoWmrDTdriNHp0J",
      "consistent" : false,
      "schema_name" : "DEMO_USER",
      "schema_object_name" : "DEPT",
      "name" : "Department table",
      "description" : "Department details"
    }
  ]
}
 
 
Accessing the New Member with Bind Variables, include them as query parameters:
 
$ curl --location 'https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data?member_id=v09slcWFCCHUgaH3XEEqqwMQClpSHabYebpYPaFp6Z3vsdnT6An8CZeCmfJv0-Oy&deptId=10'
 
{
  "items": [
    {
      "EMPNO": 7839,
      "ENAME": "KING",
      "JOB": "PRESIDENT",
      "HIREDATE": "1981-11-17T00:00:00",
      "SAL": 5000,
      "DEPTNO": 10
    },
    {
      "EMPNO": 7782,
      "ENAME": "CLARK",
      "JOB": "MANAGER",
      "MGR": 7839,
      "HIREDATE": "1981-06-09T00:00:00",
      "SAL": 2450,
      "DEPTNO": 10
    },
    {
      "EMPNO": 7934,
      "ENAME": "MILLER",
      "JOB": "CLERK",
      "MGR": 7782,
      "HIREDATE": "1982-01-23T00:00:00",
      "SAL": 1300,
      "DEPTNO": 10
    }
  ],
  "hasMore": false,
  "limit": 1000,
  "offset": 0,
  "count": 3,
  "links": [
    {
      "rel": "self",
      "href": "https://dataaccess.adb.us-ashburn-1.oraclecloudapps.com/adb/p/GW147LdUM4iIPKAsgNe2NIoByKCCGThJN4RKlrxHkcv7x_erMFkD8GQsgjprD64on7lQML_f2v8/data?member_id=v09slcWFCCHUgaH3XEEqqwMQClpSHabYebpYPaFp6Z3vsdnT6An8CZeCmfJv0-Oy&deptId=10"
    }
  ]
}
 
 
 
Table Hyperlink Groups provide: 
  •  A single, central access point for multiple data sources
  • Simplified integration with external applications
  • Easier control over permissions and lifecycle
  • Support for both object-based and SQL-query-based hyperlinks
  • Flexibility through bind variables 
This feature is particularly valuable when building lightweight APIs, exposing curated datasets, or integrating with downstream data pipelines.