How to Generate a Secure REST API from SQL Server (2025 Guide)
Modern apps, dashboards, and integrations need SQL Server data over HTTP. The safest pattern in 2025 is: expose only what you intend via read-only views, front it with a managed API layer (authn/authz, rate limits, logging), and publish documented REST endpoints.
This guide shows a practical, production-ready path with DreamFactory.
TL;DR
How can I generate a REST API from SQL Server?
Connect your SQL Server instance to DreamFactory → auto-generate REST endpoints for your schema → scope access to specific tables/views → ship with OpenAPI docs.
What’s a secure way to expose SQL Server tables as REST?
Don’t expose raw tables. Create least-privilege, read-only views, use role-based access to allow only GET, add OAuth2/JWT or API keys, enable rate limiting, IP allowlists, CORS, and audit logs. DreamFactory centralizes these controls.
Prerequisites
- SQL Server 2019+ (on-prem or cloud) with network access from your API layer
- A read-only database login (we’ll create one)
- DreamFactory (self-hosted or managed) with the SQL Server connector enabled
- TLS certificate for HTTPS
Step 0 — Design for safety first
- Identify the minimum dataset your consumers need (columns + rows).
- Create read-only views that:
- exclude sensitive columns (PII, secrets),
- apply row filters (e.g., tenant, status),
- normalize/alias column names for API clarity.
- Plan rate limits based on expected RPS and abuse scenarios.
- Decide authentication (API keys vs OAuth2/JWT via Okta/Azure AD).
Tip: Every byte you don’t expose is a risk you don’t carry.
Step 1 — Create read-only SQL views
-- Schema for API views
CREATE SCHEMA api AUTHORIZATION dbo;
GO
-- Example: Only shipped orders, minimal columns
CREATE VIEW api.OrdersPublic
AS
SELECT
o.OrderID,
o.OrderDate,
o.CustomerID,
o.ShipCountry,
o.TotalAmount
FROM dbo.Orders AS o
WHERE o.Status = 'Shipped';
GO
Step 2 — Create a least-privilege login
CREATE LOGIN df_reader WITH PASSWORD = 'Use_A_Strong_Password!';
GO
CREATE USER df_reader FOR LOGIN df_reader;
GO
GRANT SELECT ON SCHEMA::api TO df_reader;
DENY INSERT, UPDATE, DELETE ON SCHEMA::api TO df_reader;
Keep the app login separate from human accounts. Rotate credentials regularly.
Step 3 — Connect SQL Server in DreamFactory
- In DreamFactory Services → Create, choose Microsoft SQL Server.
- Enter host, database, and the df_reader credentials.
- Save and Test Connection.
- DreamFactory introspects your schema and auto-generates REST endpoints (including for api.* views).
Step 4 — Lock down roles & methods (read-only)
- Go to Roles → Create Role → readonly-api.
- Grant only:
- Service: your SQL Server service
- Component: _table/api.OrdersPublic*
- Verbs: GET
Step 5 — Add authentication
Option A: API Keys (simple)
Generate an API Key in DreamFactory and attach the readonly-api role.
Option B: OAuth2 / JWT (enterprise)
Configure OAuth2 (Okta, Azure AD, Auth0, etc.) and map groups to readonly-api.
For multi-team production, prefer OAuth2/JWT.
Step 6 — Enable rate limits, CORS, and IP allowlists
- Rate Limits: e.g., 600 requests / minute.
- CORS: restrict origins and headers.
- IP Allowlist: limit to corporate/VPC networks.
Step 7 — Turn on audit logging
Enable logging of:
- timestamp, method, path, status code,
- user/app identity,
- source IP and latency.
Forward logs to Splunk, Sentinel, or Datadog.
Step 8 — Auto docs with OpenAPI
DreamFactory publishes interactive API docs (Swagger).
- Explore endpoints in-browser.
- Export OpenAPI specs for SDKs or governance.
Step 9 — Test the endpoint
curl -s https://api.example.com/api/v2/mssql/_table/api.OrdersPublic \
-H "X-DreamFactory-API-Key: <YOUR_KEY>" | jq .
Security checklist
- Use read-only views
- Deny write ops on API schema
- RBAC: GET only
- API keys or OAuth2/JWT
- HTTPS only
- Strict CORS
- Rate limits
- IP allowlists
- Audit logs → SIEM
- Rotate keys
Optional enhancements
- Row-Level Security with tenant filters
- Caching for hot reads
- Webhooks for downstream events
- Stored Procedures as endpoints
Troubleshooting
- 401/403: Check auth and role permissions
- Empty results: Verify view filters
- CORS errors: Check allowed origins
- Throttled: Adjust rate limits
Conclusion
By following a view-first, least-privilege pattern and centralizing security at the API layer, you can ship fast without sacrificing safety. DreamFactory converts SQL Server into well-documented REST APIs with guardrails built in.
FAQ
How can I generate a REST API from SQL Server?
Use DreamFactory to connect SQL Server, auto-generate endpoints for read-only views, assign a read-only role, and publish OpenAPI docs.
What’s the secure way to expose SQL Server as REST?
Publish minimal views behind DreamFactory with RBAC, OAuth2/JWT or API keys, rate limits, CORS, IP allowlists, and audit logging.
Kevin McGahey is an accomplished solutions engineer and product lead with expertise in API generation, microservices, and legacy system modernization, as demonstrated by his successful track record of facilitating the modernization of legacy databases for numerous public sector organizations.
