Oracle & SQL Server
catalog.schema.tableOracle and SQL Server catalogs are read through ODBC. You query them like any
other catalog, join them with your other catalogs, and Thunderduck pushes
filters and LIMIT down to the remote database where it can.
These catalogs are read-only. You can query them and copy their data into another catalog, but you cannot
INSERT,UPDATE,DELETE,CREATE,DROPorALTERanything in Oracle or SQL Server through Thunderduck. See Read-only.
What you need
Oracle
| Field | Notes |
|---|---|
| Host, port | Port defaults to 1521 |
| Service name | For example ORCL |
| User, password | A read-only user is enough |
| Schema | Optional. Limits schema browsing; comma-separated for several |
SQL Server
| Field | Notes |
|---|---|
| Host, port | Port defaults to 1433 |
| Database | One catalog is one database |
| User, password | A read-only login is enough |
| Encrypt | Defaults to yes |
| Trust server certificate | Defaults to no |
| Schema | Optional. Limits schema browsing; comma-separated for several |
Network reachability
The database must be reachable from Thunderduck's network: either a private RDS instance in the same VPC, or a host reachable from Thunderduck.
SQL Server encryption
With Encrypt on and Trust server certificate off, Thunderduck validates the server certificate, so the server needs a certificate signed by a public CA or by Amazon RDS (Thunderduck trusts the RDS CA for every region). For other self-signed certificates, turn Trust server certificate on.
Example
SELECT e.employee_id, e.last_name, SUM(o.total) AS revenue
FROM ora.hr.employees e
JOIN pg.public.orders o ON o.sales_rep_id = e.employee_id
WHERE o.created_at >= DATE '2026-01-01'
GROUP BY e.employee_id, e.last_name;Read-only
Every statement that would change an Oracle or SQL Server catalog is refused before it runs, whatever your role grants:
Oracle and SQL Server catalogs are read-onlyThis covers INSERT, UPDATE, DELETE, MERGE, CREATE, DROP and ALTER,
and CREATE VIEW over these catalogs. It does not depend on the database login:
even a login that may write cannot write through Thunderduck, so a read-only
login is all you need to give it.
Reading from them into a writable catalog works. Copy a table into Iceberg, or deliver results into PostgreSQL:
CREATE TABLE lake.default.employees AS
SELECT * FROM ora.hr.employees;
INSERT INTO reporting_pg.public.sqlserver_orders
SELECT * FROM mssql.dbo.orders
WHERE order_date >= DATE '2026-10-01';Pushdown
Filters and LIMIT run on the remote database, with two exceptions:
- Oracle: conditions involving an empty string
''run in Thunderduck, because Oracle treats''asNULL. - SQL Server:
LIKEis not pushed down.
SQL Server comparisons follow the database collation, which is usually
case-insensitive, unlike DuckDB. This is a documented difference: 'a' = 'A'
can match on the remote side.
Each statement sent to Oracle or SQL Server carries a -- Thunderduck Query.
comment with the Thunderduck query and user id, so you can find it in the
database's own SQL log; see Query attribution.
Limitations
- Read-only. Writes are refused; see Read-only.
- Not available in dbt pipelines.
- At most 16 Oracle or SQL Server table references in one query.
- No views over these catalogs.
CREATE VIEWis refused; query the tables directly. - Single-threaded scans. Each referenced table is fetched over its own connection, single-threaded per reference.
- Oracle schema browsing needs Oracle 12.2 or later.