Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.
Connect PostgreSQL to Oleria to see every role, grant, and access path across your self-hosted or cloud-managed Postgres databases. Oleria also flags risky privileges, such as superuser accounts and row-level security bypass.
This integration supports self-hosted PostgreSQL, Google Cloud SQL, AWS RDS/Aurora, and Azure Database for PostgreSQL Flexible Server. Pick the setup path that matches your deployment below.
PostgreSQL login roles (rolcanlogin = true), including Google Cloud SQL’s IAM-authenticated roles. PostgreSQL roles have no email field - Oleria synthesizes one from the role name and connection host for identity matching.
Roles and groups
Every PostgreSQL role, login and non-login. A non-login role whose only members are login roles is modeled as a group; other non-login roles are modeled as roles, along with direct role-to-role membership.
Resources
Databases, schemas, tables, sequences, foreign servers, and functions (including SECURITY DEFINER functions), plus the containment hierarchy from database down to table.
Access grants
Direct object grants, database-level CONNECT/TEMP/CREATE grants, and default privilege grants (ALTER DEFAULT PRIVILEGES) that apply to future objects.
Impersonation
SET ROLE assumption paths, a superuser’s implicit ability to assume any role, and SECURITY DEFINER function execution paths.
Risk signals
Superuser accounts, row-level security bypass (bypassrls), replication privilege, expired credentials (rolvaliduntil in the past), role grants with ADMIN OPTION, and CREATEROLE privilege.
Activity
Parsed pgaudit log entries - DDL changes, role grants and revokes, and connect/disconnect events. Requires pgaudit and log access configured for your deployment - see setup below.
Optional: grant that same role CREATEROLE (or superuser), if you also want to run remediation actions.
PostgreSQL superusers bypass every object-level grant. Rather than showing a misleadingly empty access list for a superuser account, Oleria models that bypass explicitly as access to every database.
CREATE ROLE oleria_connector WITH LOGIN PASSWORD 'your-password';GRANT CONNECT ON DATABASE your_database TO oleria_connector;
Repeat the GRANT CONNECT for every database you want Oleria to see.
To also run remediation actions, grant CREATEROLE instead of a plain role: ALTER ROLE oleria_connector WITH CREATEROLE;
2
Enable pgaudit for activity (optional)
Oleria reads activity directly from your PostgreSQL log file over the same connection, using pg_read_file() - no separate log shipping is needed.
This approach requires PostgreSQL to write logs to a file at a known path. It does not work with the official Postgres Docker image (which logs to container stdout) or deployments that route logs to syslog or systemd journal only. For those setups, skip this step - Oleria will connect successfully but won’t show activity.
Install the pgaudit extension and enable it in postgresql.conf:
log_line_prefix must include both %p (the backend process id) and %u (the session user). %p lets Oleria correlate a pgaudit entry with the connection it came from to fill in the client IP and database; %u attributes the entry to the right actor. Dropping either still captures entries, but with a blank actor (%u) or blank IP/database (%p).
pgaudit has no dedicated class for connect/disconnect events - those come from PostgreSQL’s own log_connections/log_disconnections output, which default to off. Without them, DDL and role changes are still captured, but no connect/disconnect activity will show up.
Restart PostgreSQL, then run CREATE EXTENSION pgaudit; in each database.
Reading the log file requires two separate grants, not just one - a role with only pg_read_server_files will still fail:
GRANT pg_read_server_files TO oleria_connector;GRANT EXECUTE ON FUNCTION pg_catalog.pg_current_logfile() TO oleria_connector;
pg_read_server_files covers reading the log file itself, but Oleria also calls pg_current_logfile() to locate it, and PostgreSQL restricts that function to superuser by default (and, from PostgreSQL 17 only, the pg_monitor role). The explicit GRANT EXECUTE above works on every supported version. Skipping this step doesn’t break setup; Oleria simply won’t show activity.
1
Create a connector database user
Create a PostgreSQL login role in Cloud SQL and grant it CONNECT on every database you want Oleria to see. Oleria’s role and grant discovery queries are all against pg_catalog, which is readable by any connected user - no elevated database privilege is needed for discovery.
To also run remediation actions (assign or remove role membership), grant this user CREATEROLE as well.
2
Note your Cloud SQL connection name
On the instance’s Overview page, copy the Connection name - it’s in project:region:instance format. Oleria uses this to route through the Cloud SQL connector rather than a raw IP address, so no IP allowlisting is required.
3
Create a service account for connector and log access
In IAM & Admin, create a service account.
Grant it Cloud SQL Client (roles/cloudsql.client) at the project level - the Cloud SQL Connector uses this to authorize the connection at the IAM level before the PostgreSQL handshake.
Grant it Private Logs Viewer (roles/logging.privateLogViewer) at the project level, not the more common Logs Viewer role. pgAudit entries on Cloud SQL are delivered as Data Access audit logs, which only Private Logs Viewer can read.
Create a JSON key for the service account and download it - you’ll paste its contents into Oleria’s GCP Service Account Key field.
The connection form requires this key, because Oleria has no default credentials to use for your project.
4
Enable pgAudit and Data Access audit logging
Without this step, no pgAudit entries ever reach Cloud Logging, regardless of how the service account is configured.
Set the cloudsql.enable_pgaudit database flag to On on the instance (Edit -> Flags). This restarts the instance.
Connect to each database and run CREATE EXTENSION pgaudit;.
Set the pgaudit.log database flag to the statement classes you want audited (for example ddl, role).
Also set the log_connections and log_disconnections database flags to On. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which Cloud SQL leaves off by default. Skipping this step still delivers DDL and role changes; you’ll just see no connect/disconnect activity.
In IAM & Admin -> Audit Logs, find Cloud SQL API, and enable the Data Read and Data Write log types. Data Access audit logs are off by default - this is what actually routes pgAudit entries into Cloud Logging.
1
Create a connector database user
Connect to the database and create a login role for Oleria, then grant it CONNECT on every database you want Oleria to see, the same as the self-hosted flow:
CREATE ROLE oleria_connector WITH LOGIN PASSWORD 'your-password';GRANT CONNECT ON DATABASE your_database TO oleria_connector;
2
Optional: use AWS IAM database authentication
By default Oleria signs in with the password above. If you prefer short-lived IAM tokens instead of a stored password, enable IAM database authentication on the RDS or Aurora instance (Modify -> Additional configuration), then run:
GRANT rds_iam TO oleria_connector;
You then select Use AWS IAM database authentication (instead of a password) in the connection form and don’t enter a password.
3
Create the Oleria access role with CloudFormation
You don’t grant Oleria access to your AWS account by hand. When you select Connect in Oleria, Oleria opens an AWS CloudFormation quick-create link in a new tab. Launch the stack in your AWS account. It creates a read-only IAM role that only Oleria can assume, and it gives the role permission to read the PostgreSQL log group, describe your RDS instances and clusters, and, if you use IAM database authentication, connect with rds-db:connect. When the stack finishes, copy the RoleArn from its Outputs tab. See Connect PostgreSQL to Oleria.
4
Enable pgaudit and CloudWatch Logs export
Oleria reads activity from the PostgreSQL log RDS exports to CloudWatch Logs - there’s no separate log-shipping agent to install.
Skipping this step means Oleria won’t show activity for this connection, the same as the other three deployment paths - it doesn’t fail the sync.
In the parameter group attached to your instance, add pgaudit to shared_preload_libraries. This is a static parameter - RDS requires a reboot for it to take effect.
In the same parameter group, set pgaudit.log to the statement classes you want audited (for example ddl, role), and set log_connections and log_disconnections to 1. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which RDS leaves off by default.
Connect to each database and run CREATE EXTENSION pgaudit;.
On the instance, go to Modify -> Log exports, and enable PostgreSQL log. This ships postgresql.log to a CloudWatch Logs log group. For a plain RDS instance, this group is named /aws/rds/instance/<your-instance-identifier>/postgresql, which Oleria derives automatically. For an Aurora cluster, the log group is named /aws/rds/cluster/<your-cluster-identifier>/postgresql instead - enter this in the CloudWatch Log Group connection field, since Oleria can’t derive the cluster form automatically.
No extra IAM grant is needed for the log group. The role that the CloudFormation stack creates can already read RDS log groups.
The RDS Instance Identifier field is required in practice, even though Oleria’s connection form doesn’t mark it as such. Without it, Oleria can’t resolve the instance’s hostname, and - for a plain RDS instance - can’t locate the activity log either. For Aurora, enter a DB instance identifier (for example, the writer), not the cluster identifier.
1
Enable Microsoft Entra authentication
On the Flexible Server, enable Microsoft Entra authentication and set a Microsoft Entra admin.
2
Register an application and grant database access
In the Azure Portal, register an application in Microsoft Entra ID and create a client secret for it (Certificates & secrets -> New client secret).
As the Microsoft Entra admin, create a PostgreSQL role for the application and grant it CONNECT on every database you want Oleria to see.
3
Enable pgaudit (optional, for activity)
Under Settings -> Server parameters, allowlist and load pgaudit (azure.extensions and shared_preload_libraries), then set pgaudit.log to the statement classes you want audited (for example ddl, role). Azure requires each class spelled out individually - it doesn’t support the - shortcut from pgaudit’s own docs.
In the same Server parameters page, set log_connections and log_disconnections to ON. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which Azure leaves off by default.
Connect to each database and run CREATE EXTENSION pgaudit;.
4
Route logs to Log Analytics
On the Flexible Server, go to Monitoring -> Diagnostic settings and add a diagnostic setting.
Select the PostgreSQLLogs category, choose Send to Log Analytics workspace, and pick your workspace.
Azure diagnostic settings offer two destination table options: Resource specific and Azure diagnostics. You must select Resource specific - Oleria queries the per-resource-type PGSQLServerLogs table, not the legacy shared AzureDiagnostics table the other option writes to. Picking Azure diagnostics results in a connection that syncs normally but shows no activity, with nothing indicating why.
5
Note your server, tenant, and Log Analytics details
Collect the Flexible Server name, your Microsoft Entra tenant ID, the app’s client ID and secret, and the Log Analytics Workspace ID from the diagnostic setting above.
Sign in to your Oleria workspace and navigate to Integrations -> PostgreSQL -> Connect.
2
Complete the connection form
Select your Cloud Provider first - the form updates to show only the fields that provider needs.
Self-hosted
Google Cloud SQL
AWS RDS / Aurora
Azure Flexible Server
Field
Notes
Cloud Provider
Select None (self-hosted).
Host
Required. The hostname or IP of your PostgreSQL server.
Port
Defaults to 5432.
Database
Defaults to postgres.
User
Required. The role you created above.
Password
Required.
Oleria auto-detects your pgaudit log file’s path via pg_current_logfile() - there is no field to override it today. If your log file lives somewhere Postgres doesn’t report (an unusual logging setup), contact Oleria Support.
Field
Notes
Cloud Provider
Select Google Cloud SQL.
Database
Defaults to postgres.
User
Required. The role you created above.
Password
Required.
Cloud SQL Connection Name
Required. Found on the instance’s Overview page in project:region:instance format.
GCP Service Account Key (JSON)
Required. Paste the entire downloaded JSON key file. Used for both the Cloud SQL database connection and Cloud Logging access. The service account needs the Cloud SQL Client role.
Field
Notes
Cloud Provider
Select AWS RDS / Aurora.
Database
Defaults to postgres.
User
Required. The role you created above.
Password
Required, unless you select Use AWS IAM database authentication (instead of a password). The field is hidden when you do.
AWS Region
Required. The region your RDS instance is in (for example, us-east-1).
RDS Instance Identifier
Required in practice - see the warning above.
CloudWatch Log Group (optional, Aurora only)
Overrides the CloudWatch Logs log group used for activity. Aurora exports logs under a cluster-form path Oleria can’t derive automatically - see the pgaudit/CloudWatch Logs export step above. Leave blank for a plain RDS instance.
Use AWS IAM database authentication (instead of a password)
Optional checkbox. Select it only if you completed the IAM database authentication step above.
Select Connect. Oleria opens a CloudFormation link in a new tab. Launch the stack in your AWS account, then return to Oleria and provide:
Field
Notes
Role ARN
Required. The RoleArn output of the CloudFormation stack.
Confirm that the role is created using CloudFormation successfully
Required checkbox. Select it once the stack is created.
Select Authenticate. Don’t go back through the first step after you create the stack, because each pass generates a new external ID that an existing stack rejects.
Field
Notes
Cloud Provider
Select Azure Flexible Server.
Database
Defaults to postgres.
User
Required. The role you created above.
Server Name
Required. The Flexible Server hostname (for example, myserver.postgres.database.azure.com).
Azure Tenant ID
Required.
Azure Client ID
Required.
Azure Client Secret
Required.
Log Analytics Workspace ID
Required.
3
Complete the connection
Select Connect (Authenticate on the AWS Role ARN step). Oleria validates the connection, discovers your PostgreSQL roles, resources, and access, and begins the first sync.
Confirm PostgreSQL appears on the Connected tab of your Oleria Integrations page. After the first sync completes, you can review the discovered roles, resources, access grants, and activity in your Oleria workspace.
No account lifecycle: Oleria can grant or revoke role membership, but can’t create, disable, or delete a PostgreSQL role. This integration remediates access, not identity lifecycle.
Synthetic email: PostgreSQL roles have no native email field. Oleria synthesizes one from the role name and connection host, which may not match a real address used elsewhere in your organization.
Auth method visibility: Oleria can show a role’s configured authentication method only when the connector role is a true superuser able to call pg_hba_file_rules(). This is unavailable on Google Cloud SQL, which restricts that function even for superuser-equivalent roles - Oleria falls back gracefully with no error.
Column-level grants: only columns with an explicit grant are inventoried; columns covered solely by a table-wide grant aren’t listed individually.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Oleria Identity Security","colors":{"primary":"#027864","light":"#027864","dark":"#58D5BA"},"logo":{"light":"https://mintcdn.com/oleria/KyPIHO-0OF6fE_DF/images/OleriaLightMode-1.png?fit=max\u0026auto=format\u0026n=KyPIHO-0OF6fE_DF\u0026q=85\u0026s=906d33a8c505e2a96b7c6a1583335e1d","dark":"https://mintcdn.com/oleria/9Xgkiz4uBKa5_MIM/images/Oleria_Dark_2.png?fit=max\u0026auto=format\u0026n=9Xgkiz4uBKa5_MIM\u0026q=85\u0026s=eed2ceca9aaaa1597123d7edabce3ce2"},"favicon":"https://mintcdn.com/oleria/rpFX8xIzvg2xF0B0/images/favicon.png?fit=max\u0026auto=format\u0026n=rpFX8xIzvg2xF0B0\u0026q=85\u0026s=b2b79fcf5eaf05bffa7866fe11571fd9","appearance":{"default":"light"},"background":{"color":{"light":"#ffffff"}},"navbar":{"links":[{"href":"mailto:support@oleria.com","label":"Support"}]},"footer":{"socials":{"website":"https://oleria.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"oleria","hasAudioNarration":false,"actualSubdomain":"oleria","customDomains":["docs.oleria.com"],"gitSource":{"type":"github","owner":"roanokedatasecurity","repo":"oleria-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af5df3c001a52763c476103","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"Integrations","count":369},{"language":"default","tag":"Applications","count":310},{"language":"default","tag":"API Reference","count":98},{"language":"default","tag":"Inventory \u0026 Actions","count":72},{"language":"default","tag":"Product","count":69},{"language":"default","tag":"Security and compliance","count":52},{"language":"default","tag":"Developer tools","count":48},{"language":"default","tag":"Collaboration and productivity","count":39},{"language":"default","tag":"Data and analytics","count":36},{"language":"default","tag":"Finance and operations","count":29}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@oleria.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"integrations/postgresql","slug":"/integrations/postgresql","pageMetadata":{"title":"PostgreSQL","description":"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.","href":"/integrations/postgresql"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Connect PostgreSQL to Oleria to see every role, grant, and access path across your self-hosted or cloud-managed Postgres databases. Oleria also flags risky privileges, such as superuser accounts and row-level security bypass.`}),`\n`,_jsx(Note,{children:`This integration supports self-hosted PostgreSQL, Google Cloud SQL, AWS RDS/Aurora, and Azure Database for PostgreSQL Flexible Server. Pick the setup path that matches your deployment below.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-oleria-discovers`,children:`What Oleria discovers`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Area`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Detail`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Accounts`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`PostgreSQL login roles (`,_jsx(_components.code,{children:`rolcanlogin = true`}),`), including Google Cloud SQL’s IAM-authenticated roles. PostgreSQL roles have no email field - Oleria synthesizes one from the role name and connection host for identity matching.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Roles and groups`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Every PostgreSQL role, login and non-login. A non-login role whose only members are login roles is modeled as a group; other non-login roles are modeled as roles, along with direct role-to-role membership.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Resources`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Databases, schemas, tables, sequences, foreign servers, and functions (including `,_jsx(_components.code,{children:`SECURITY DEFINER`}),` functions), plus the containment hierarchy from database down to table.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Access grants`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Direct object grants, database-level `,_jsx(_components.code,{children:`CONNECT`}),`/`,_jsx(_components.code,{children:`TEMP`}),`/`,_jsx(_components.code,{children:`CREATE`}),` grants, and default privilege grants (`,_jsx(_components.code,{children:`ALTER DEFAULT PRIVILEGES`}),`) that apply to future objects.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Impersonation`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.code,{children:`SET ROLE`}),` assumption paths, a superuser’s implicit ability to assume any role, and `,_jsx(_components.code,{children:`SECURITY DEFINER`}),` function execution paths.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Risk signals`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Superuser accounts, row-level security bypass (`,_jsx(_components.code,{children:`bypassrls`}),`), replication privilege, expired credentials (`,_jsx(_components.code,{children:`rolvaliduntil`}),` in the past), role grants with `,_jsx(_components.code,{children:`ADMIN OPTION`}),`, and `,_jsx(_components.code,{children:`CREATEROLE`}),` privilege.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Activity`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Parsed pgaudit log entries - DDL changes, role grants and revokes, and connect/disconnect events. Requires pgaudit and log access configured for your deployment - see setup below.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A PostgreSQL role with `,_jsx(_components.strong,{children:`CONNECT`}),` privilege on every database you want Oleria to see. Discovery doesn’t require superuser.`]}),`\n`,_jsxs(_components.li,{children:[`Cloud-provider access matching your deployment - see `,_jsx(_components.a,{href:`#set-up-the-integration`,children:`Set up the integration`}),` below.`]}),`\n`,_jsxs(_components.li,{children:[`Optional: grant that same role `,_jsx(_components.strong,{children:`CREATEROLE`}),` (or superuser), if you also want to run remediation actions.`]}),`\n`]}),`\n`,_jsx(Note,{children:`PostgreSQL superusers bypass every object-level grant. Rather than showing a misleadingly empty access list for a superuser account, Oleria models that bypass explicitly as access to every database.`}),`\n`,_jsx(Heading,{level:`2`,id:`set-up-the-integration`,children:`Set up the integration`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Self-hosted`,id:`self-hosted`,children:_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a connector role`,children:[_jsx(_components.p,{children:`Connect as an admin and create a role for Oleria:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`CREATE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ROLE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WITH`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` LOGIN`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` PASSWORD`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'your-password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CONNECT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` DATABASE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` your_database `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector;`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Repeat the `,_jsx(_components.code,{children:`GRANT CONNECT`}),` for every database you want Oleria to see.`]}),_jsxs(Note,{children:[`To also run remediation actions, grant `,_jsx(_components.strong,{children:`CREATEROLE`}),` instead of a plain role: `,_jsx(_components.code,{children:`ALTER ROLE oleria_connector WITH CREATEROLE;`})]})]}),_jsxs(Step,{title:`Enable pgaudit for activity (optional)`,children:[_jsxs(_components.p,{children:[`Oleria reads activity directly from your PostgreSQL log file over the same connection, using `,_jsx(_components.code,{children:`pg_read_file()`}),` - no separate log shipping is needed.`]}),_jsxs(Warning,{children:[`This approach requires PostgreSQL to write logs to a file at a known path. It does `,_jsx(_components.strong,{children:`not`}),` work with the official Postgres Docker image (which logs to container stdout) or deployments that route logs to syslog or systemd journal only. For those setups, skip this step - Oleria will connect successfully but won’t show activity.`]}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Install the `,_jsx(_components.code,{children:`pgaudit`}),` extension and enable it in `,_jsx(_components.code,{children:`postgresql.conf`}),`:`]}),`\n`]}),_jsx(CodeBlock,{numberOfLines:`9`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`shared_preload_libraries = 'pgaudit'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`logging_collector = on`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`log_directory = 'log'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`log_destination = 'stderr'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`log_line_prefix = '%m [%p] user=%u '`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`log_connections = on`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`log_disconnections = on`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`pgaudit.log = 'ddl, role'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(Note,{children:[_jsx(_components.code,{children:`log_line_prefix`}),` must include both `,_jsx(_components.code,{children:`%p`}),` (the backend process id) and `,_jsx(_components.code,{children:`%u`}),` (the session user). `,_jsx(_components.code,{children:`%p`}),` lets Oleria correlate a pgaudit entry with the connection it came from to fill in the client IP and database; `,_jsx(_components.code,{children:`%u`}),` attributes the entry to the right actor. Dropping either still captures entries, but with a blank actor (`,_jsx(_components.code,{children:`%u`}),`) or blank IP/database (`,_jsx(_components.code,{children:`%p`}),`).`]}),_jsxs(Note,{children:[_jsx(_components.code,{children:`pgaudit`}),` has no dedicated class for connect/disconnect events - those come from PostgreSQL’s own `,_jsx(_components.code,{children:`log_connections`}),`/`,_jsx(_components.code,{children:`log_disconnections`}),` output, which default to off. Without them, DDL and role changes are still captured, but no connect/disconnect activity will show up.`]}),_jsxs(_components.ol,{start:`2`,children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Restart PostgreSQL, then run `,_jsx(_components.code,{children:`CREATE EXTENSION pgaudit;`}),` in each database.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Reading the log file requires two separate grants, not just one - a role with only `,_jsx(_components.code,{children:`pg_read_server_files`}),` will still fail:`]}),`\n`]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` pg_read_server_files `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` EXECUTE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` FUNCTION`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` pg_catalog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`pg_current_logfile`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector;`})]}),`\n`]})})}),_jsxs(Warning,{children:[_jsx(_components.code,{children:`pg_read_server_files`}),` covers reading the log file itself, but Oleria also calls `,_jsx(_components.code,{children:`pg_current_logfile()`}),` to locate it, and PostgreSQL restricts that function to superuser by default (and, from PostgreSQL 17 only, the `,_jsx(_components.code,{children:`pg_monitor`}),` role). The explicit `,_jsx(_components.code,{children:`GRANT EXECUTE`}),` above works on every supported version. Skipping this step doesn’t break setup; Oleria simply won’t show activity.`]})]})]})}),_jsx(Tab,{title:`Google Cloud SQL`,id:`google-cloud-sql`,children:_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a connector database user`,children:[_jsxs(_components.p,{children:[`Create a PostgreSQL login role in Cloud SQL and grant it `,_jsx(_components.strong,{children:`CONNECT`}),` on every database you want Oleria to see. Oleria’s role and grant discovery queries are all against `,_jsx(_components.code,{children:`pg_catalog`}),`, which is readable by any connected user - no elevated database privilege is needed for discovery.`]}),_jsxs(Note,{children:[`To also run remediation actions (assign or remove role membership), grant this user `,_jsx(_components.strong,{children:`CREATEROLE`}),` as well.`]})]}),_jsx(Step,{title:`Note your Cloud SQL connection name`,children:_jsxs(_components.p,{children:[`On the instance’s `,_jsx(_components.strong,{children:`Overview`}),` page, copy the `,_jsx(_components.strong,{children:`Connection name`}),` - it’s in `,_jsx(_components.code,{children:`project:region:instance`}),` format. Oleria uses this to route through the Cloud SQL connector rather than a raw IP address, so no IP allowlisting is required.`]})}),_jsxs(Step,{title:`Create a service account for connector and log access`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`IAM \u0026 Admin`}),`, create a service account.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Grant it `,_jsx(_components.strong,{children:`Cloud SQL Client`}),` (`,_jsx(_components.code,{children:`roles/cloudsql.client`}),`) at the project level - the Cloud SQL Connector uses this to authorize the connection at the IAM level before the PostgreSQL handshake.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Grant it `,_jsx(_components.strong,{children:`Private Logs Viewer`}),` (`,_jsx(_components.code,{children:`roles/logging.privateLogViewer`}),`) at the project level, not the more common Logs Viewer role. pgAudit entries on Cloud SQL are delivered as Data Access audit logs, which only Private Logs Viewer can read.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Create a JSON key for the service account and download it - you’ll paste its contents into Oleria’s `,_jsx(_components.strong,{children:`GCP Service Account Key`}),` field.`]}),`\n`]}),`\n`]}),_jsx(Note,{children:`The connection form requires this key, because Oleria has no default credentials to use for your project.`})]}),_jsxs(Step,{title:`Enable pgAudit and Data Access audit logging`,children:[_jsx(_components.p,{children:`Without this step, no pgAudit entries ever reach Cloud Logging, regardless of how the service account is configured.`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Set the `,_jsx(_components.code,{children:`cloudsql.enable_pgaudit`}),` database flag to `,_jsx(_components.strong,{children:`On`}),` on the instance (`,_jsx(_components.strong,{children:`Edit`}),` -> `,_jsx(_components.strong,{children:`Flags`}),`). This restarts the instance.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Connect to each database and run `,_jsx(_components.code,{children:`CREATE EXTENSION pgaudit;`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Set the `,_jsx(_components.code,{children:`pgaudit.log`}),` database flag to the statement classes you want audited (for example `,_jsx(_components.code,{children:`ddl, role`}),`).`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Also set the `,_jsx(_components.code,{children:`log_connections`}),` and `,_jsx(_components.code,{children:`log_disconnections`}),` database flags to `,_jsx(_components.strong,{children:`On`}),`. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which Cloud SQL leaves off by default. Skipping this step still delivers DDL and role changes; you’ll just see no connect/disconnect activity.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`IAM \u0026 Admin`}),` -> `,_jsx(_components.strong,{children:`Audit Logs`}),`, find `,_jsx(_components.strong,{children:`Cloud SQL API`}),`, and enable the `,_jsx(_components.strong,{children:`Data Read`}),` and `,_jsx(_components.strong,{children:`Data Write`}),` log types. Data Access audit logs are off by default - this is what actually routes pgAudit entries into Cloud Logging.`]}),`\n`]}),`\n`]})]})]})}),_jsxs(Tab,{title:`AWS RDS / Aurora`,id:`aws-rds-%2F-aurora`,children:[_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a connector database user`,children:[_jsxs(_components.p,{children:[`Connect to the database and create a login role for Oleria, then grant it `,_jsx(_components.strong,{children:`CONNECT`}),` on every database you want Oleria to see, the same as the self-hosted flow:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`CREATE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ROLE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WITH`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` LOGIN`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` PASSWORD`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'your-password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CONNECT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` DATABASE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` your_database `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector;`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Optional: use AWS IAM database authentication`,children:[_jsxs(_components.p,{children:[`By default Oleria signs in with the password above. If you prefer short-lived IAM tokens instead of a stored password, enable `,_jsx(_components.strong,{children:`IAM database authentication`}),` on the RDS or Aurora instance (`,_jsx(_components.strong,{children:`Modify`}),` -> `,_jsx(_components.strong,{children:`Additional configuration`}),`), then run:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` rds_iam `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oleria_connector;`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`You then select `,_jsx(_components.strong,{children:`Use AWS IAM database authentication (instead of a password)`}),` in the connection form and don’t enter a password.`]})]}),_jsx(Step,{title:`Create the Oleria access role with CloudFormation`,children:_jsxs(_components.p,{children:[`You don’t grant Oleria access to your AWS account by hand. When you select `,_jsx(_components.strong,{children:`Connect`}),` in Oleria, Oleria opens an AWS CloudFormation quick-create link in a new tab. Launch the stack in your AWS account. It creates a read-only IAM role that only Oleria can assume, and it gives the role permission to read the PostgreSQL log group, describe your RDS instances and clusters, and, if you use IAM database authentication, connect with `,_jsx(_components.code,{children:`rds-db:connect`}),`. When the stack finishes, copy the `,_jsx(_components.strong,{children:`RoleArn`}),` from its `,_jsx(_components.strong,{children:`Outputs`}),` tab. See `,_jsx(_components.a,{href:`#connect-postgresql-to-oleria`,children:`Connect PostgreSQL to Oleria`}),`.`]})}),_jsxs(Step,{title:`Enable pgaudit and CloudWatch Logs export`,children:[_jsx(_components.p,{children:`Oleria reads activity from the PostgreSQL log RDS exports to CloudWatch Logs - there’s no separate log-shipping agent to install.`}),_jsx(Warning,{children:`Skipping this step means Oleria won’t show activity for this connection, the same as the other three deployment paths - it doesn’t fail the sync.`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In the parameter group attached to your instance, add `,_jsx(_components.code,{children:`pgaudit`}),` to `,_jsx(_components.code,{children:`shared_preload_libraries`}),`. This is a static parameter - RDS requires a reboot for it to take effect.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In the same parameter group, set `,_jsx(_components.code,{children:`pgaudit.log`}),` to the statement classes you want audited (for example `,_jsx(_components.code,{children:`ddl, role`}),`), and set `,_jsx(_components.code,{children:`log_connections`}),` and `,_jsx(_components.code,{children:`log_disconnections`}),` to `,_jsx(_components.code,{children:`1`}),`. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which RDS leaves off by default.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Connect to each database and run `,_jsx(_components.code,{children:`CREATE EXTENSION pgaudit;`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`On the instance, go to `,_jsx(_components.strong,{children:`Modify`}),` -> `,_jsx(_components.strong,{children:`Log exports`}),`, and enable `,_jsx(_components.strong,{children:`PostgreSQL log`}),`. This ships `,_jsx(_components.code,{children:`postgresql.log`}),` to a CloudWatch Logs log group. For a plain RDS instance, this group is named `,_jsx(_components.code,{children:`/aws/rds/instance/\u003cyour-instance-identifier>/postgresql`}),`, which Oleria derives automatically. `,_jsx(_components.strong,{children:`For an Aurora cluster`}),`, the log group is named `,_jsx(_components.code,{children:`/aws/rds/cluster/\u003cyour-cluster-identifier>/postgresql`}),` instead - enter this in the `,_jsx(_components.strong,{children:`CloudWatch Log Group`}),` connection field, since Oleria can’t derive the cluster form automatically.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`No extra IAM grant is needed for the log group. The role that the CloudFormation stack creates can already read RDS log groups.`}),`\n`]}),`\n`]})]})]}),_jsxs(Warning,{children:[`The `,_jsx(_components.strong,{children:`RDS Instance Identifier`}),` field is required in practice, even though Oleria’s connection form doesn’t mark it as such. Without it, Oleria can’t resolve the instance’s hostname, and - for a plain RDS instance - can’t locate the activity log either. For Aurora, enter a DB instance identifier (for example, the writer), not the cluster identifier.`]})]}),_jsx(Tab,{title:`Azure Flexible Server`,id:`azure-flexible-server`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Enable Microsoft Entra authentication`,children:_jsxs(_components.p,{children:[`On the Flexible Server, enable `,_jsx(_components.strong,{children:`Microsoft Entra authentication`}),` and set a Microsoft Entra admin.`]})}),_jsx(Step,{title:`Register an application and grant database access`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In the Azure Portal, register an application in `,_jsx(_components.strong,{children:`Microsoft Entra ID`}),` and create a client secret for it (`,_jsx(_components.strong,{children:`Certificates \u0026 secrets`}),` -> `,_jsx(_components.strong,{children:`New client secret`}),`).`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`As the Microsoft Entra admin, create a PostgreSQL role for the application and grant it `,_jsx(_components.strong,{children:`CONNECT`}),` on every database you want Oleria to see.`]}),`\n`]}),`\n`]})}),_jsx(Step,{title:`Enable pgaudit (optional, for activity)`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Settings`}),` -> `,_jsx(_components.strong,{children:`Server parameters`}),`, allowlist and load `,_jsx(_components.code,{children:`pgaudit`}),` (`,_jsx(_components.code,{children:`azure.extensions`}),` and `,_jsx(_components.code,{children:`shared_preload_libraries`}),`), then set `,_jsx(_components.code,{children:`pgaudit.log`}),` to the statement classes you want audited (for example `,_jsx(_components.code,{children:`ddl, role`}),`). Azure requires each class spelled out individually - it doesn’t support the `,_jsx(_components.code,{children:`-`}),` shortcut from pgaudit’s own docs.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In the same `,_jsx(_components.strong,{children:`Server parameters`}),` page, set `,_jsx(_components.code,{children:`log_connections`}),` and `,_jsx(_components.code,{children:`log_disconnections`}),` to `,_jsx(_components.strong,{children:`ON`}),`. pgAudit has no class of its own for connect/disconnect events - those come from PostgreSQL’s own connection logging, which Azure leaves off by default.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Connect to each database and run `,_jsx(_components.code,{children:`CREATE EXTENSION pgaudit;`}),`.`]}),`\n`]}),`\n`]})}),_jsxs(Step,{title:`Route logs to Log Analytics`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`On the Flexible Server, go to `,_jsx(_components.strong,{children:`Monitoring`}),` -> `,_jsx(_components.strong,{children:`Diagnostic settings`}),` and add a diagnostic setting.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Select the `,_jsx(_components.strong,{children:`PostgreSQLLogs`}),` category, choose `,_jsx(_components.strong,{children:`Send to Log Analytics workspace`}),`, and pick your workspace.`]}),`\n`]}),`\n`]}),_jsxs(Warning,{children:[`Azure diagnostic settings offer two destination table options: `,_jsx(_components.strong,{children:`Resource specific`}),` and `,_jsx(_components.strong,{children:`Azure diagnostics`}),`. You must select `,_jsx(_components.strong,{children:`Resource specific`}),` - Oleria queries the per-resource-type `,_jsx(_components.code,{children:`PGSQLServerLogs`}),` table, not the legacy shared `,_jsx(_components.code,{children:`AzureDiagnostics`}),` table the other option writes to. Picking `,_jsx(_components.strong,{children:`Azure diagnostics`}),` results in a connection that syncs normally but shows no activity, with nothing indicating why.`]})]}),_jsx(Step,{title:`Note your server, tenant, and Log Analytics details`,children:_jsx(_components.p,{children:`Collect the Flexible Server name, your Microsoft Entra tenant ID, the app’s client ID and secret, and the Log Analytics Workspace ID from the diagnostic setting above.`})})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-postgresql-to-oleria`,children:`Connect PostgreSQL to Oleria`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the integration`,children:_jsxs(_components.p,{children:[`Sign in to your Oleria workspace and navigate to `,_jsx(_components.strong,{children:`Integrations`}),` -> `,_jsx(_components.strong,{children:`PostgreSQL`}),` -> `,_jsx(_components.strong,{children:`Connect`}),`.`]})}),_jsxs(Step,{title:`Complete the connection form`,children:[_jsxs(_components.p,{children:[`Select your `,_jsx(_components.strong,{children:`Cloud Provider`}),` first - the form updates to show only the fields that provider needs.`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Self-hosted`,id:`self-hosted-2`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Field`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Cloud Provider`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Select `,_jsx(_components.strong,{children:`None (self-hosted)`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Host`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required. The hostname or IP of your PostgreSQL server.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Port`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Defaults to `,_jsx(_components.code,{children:`5432`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Database`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Defaults to `,_jsx(_components.code,{children:`postgres`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`User`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required. The role you created above.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Password`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]})]})]}),_jsxs(_components.p,{children:[`Oleria auto-detects your pgaudit log file’s path via `,_jsx(_components.code,{children:`pg_current_logfile()`}),` - there is no field to override it today. If your log file lives somewhere Postgres doesn’t report (an unusual logging setup), contact Oleria Support.`]})]}),_jsx(Tab,{title:`Google Cloud SQL`,id:`google-cloud-sql-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Field`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Cloud Provider`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Select `,_jsx(_components.strong,{children:`Google Cloud SQL`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Database`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Defaults to `,_jsx(_components.code,{children:`postgres`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`User`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required. The role you created above.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Password`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Cloud SQL Connection Name`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required. Found on the instance’s Overview page in `,_jsx(_components.code,{children:`project:region:instance`}),` format.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`GCP Service Account Key (JSON)`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required. Paste the entire downloaded JSON key file. Used for both the Cloud SQL database connection and Cloud Logging access. The service account needs the `,_jsx(_components.strong,{children:`Cloud SQL Client`}),` role.`]})]})]})]})}),_jsxs(Tab,{title:`AWS RDS / Aurora`,id:`aws-rds-%2F-aurora-2`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Field`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Cloud Provider`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Select `,_jsx(_components.strong,{children:`AWS RDS / Aurora`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Database`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Defaults to `,_jsx(_components.code,{children:`postgres`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`User`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required. The role you created above.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Password`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required, unless you select `,_jsx(_components.strong,{children:`Use AWS IAM database authentication (instead of a password)`}),`. The field is hidden when you do.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`AWS Region`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required. The region your RDS instance is in (for example, `,_jsx(_components.code,{children:`us-east-1`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`RDS Instance Identifier`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required in practice - see the warning above.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`CloudWatch Log Group (optional, Aurora only)`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Overrides the CloudWatch Logs log group used for activity. Aurora exports logs under a cluster-form path Oleria can’t derive automatically - see the pgaudit/CloudWatch Logs export step above. Leave blank for a plain RDS instance.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Use AWS IAM database authentication (instead of a password)`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Optional checkbox. Select it only if you completed the IAM database authentication step above.`})]})]})]}),_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Connect`}),`. Oleria opens a CloudFormation link in a new tab. Launch the stack in your AWS account, then return to Oleria and provide:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Field`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Role ARN`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required. The `,_jsx(_components.strong,{children:`RoleArn`}),` output of the CloudFormation stack.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Confirm that the role is created using CloudFormation successfully`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required checkbox. Select it once the stack is created.`})]})]})]}),_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Authenticate`}),`. Don’t go back through the first step after you create the stack, because each pass generates a new external ID that an existing stack rejects.`]})]}),_jsx(Tab,{title:`Azure Flexible Server`,id:`azure-flexible-server-2`,children:_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Field`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Cloud Provider`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Select `,_jsx(_components.strong,{children:`Azure Flexible Server`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Database`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Defaults to `,_jsx(_components.code,{children:`postgres`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`User`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required. The role you created above.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Server Name`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Required. The Flexible Server hostname (for example, `,_jsx(_components.code,{children:`myserver.postgres.database.azure.com`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Azure Tenant ID`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Azure Client ID`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Azure Client Secret`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Log Analytics Workspace ID`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Required.`})]})]})]})})]})]}),_jsx(Step,{title:`Complete the connection`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Connect`}),` (`,_jsx(_components.strong,{children:`Authenticate`}),` on the AWS Role ARN step). Oleria validates the connection, discovers your PostgreSQL roles, resources, and access, and begins the first sync.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`verify-the-integration`,children:`Verify the integration`}),`\n`,_jsxs(_components.p,{children:[`Confirm PostgreSQL appears on the `,_jsx(_components.strong,{children:`Connected`}),` tab of your Oleria `,_jsx(_components.strong,{children:`Integrations`}),` page. After the first sync completes, you can review the discovered roles, resources, access grants, and activity in your Oleria workspace.`]}),`\n`,_jsx(Heading,{level:`2`,id:`remediation-actions`,children:`Remediation actions`}),`\n`,_jsxs(_components.p,{children:[`Both remediation actions need the connector role to hold `,_jsx(_components.strong,{children:`CREATEROLE`}),` or superuser, and both require approval before Oleria runs them.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Action`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Assign role`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Grants a PostgreSQL role to another role (`,_jsx(_components.code,{children:`GRANT role TO grantee`}),`). Fully reversible.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Remove role`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Revokes a PostgreSQL role from another role (`,_jsx(_components.code,{children:`REVOKE role FROM grantee`}),`). Fully reversible.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`known-limitations`,children:`Known limitations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No account lifecycle:`}),` Oleria can grant or revoke role membership, but can’t create, disable, or delete a PostgreSQL role. This integration remediates access, not identity lifecycle.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Synthetic email:`}),` PostgreSQL roles have no native email field. Oleria synthesizes one from the role name and connection host, which may not match a real address used elsewhere in your organization.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Auth method visibility:`}),` Oleria can show a role’s configured authentication method only when the connector role is a true superuser able to call `,_jsx(_components.code,{children:`pg_hba_file_rules()`}),`. This is unavailable on Google Cloud SQL, which restricts that function even for superuser-equivalent roles - Oleria falls back gracefully with no error.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Column-level grants:`}),` only columns with an explicit grant are inventoried; columns covered solely by a table-wide grant aren’t listed individually.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`contact-us`,children:`Contact us`}),`\n`,_jsxs(_components.p,{children:[`For questions about this integration, contact us at `,_jsx(_components.a,{href:`mailto:support@oleria.com`,children:`support@oleria.com`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"PostgreSQL","description":"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.","href":"/integrations/postgresql"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What Oleria discovers","slug":"what-oleria-discovers","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Set up the integration","slug":"set-up-the-integration","depth":2,"children":[]},{"title":"Connect PostgreSQL to Oleria","slug":"connect-postgresql-to-oleria","depth":2,"children":[]},{"title":"Verify the integration","slug":"verify-the-integration","depth":2,"children":[]},{"title":"Remediation actions","slug":"remediation-actions","depth":2,"children":[]},{"title":"Known limitations","slug":"known-limitations","depth":2,"children":[]},{"title":"Contact us","slug":"contact-us","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"oleria","siteName":"Oleria Identity Security","title":"PostgreSQL - Oleria Identity Security","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T09:31:25.483Z","originalFileLocation":"integrations/postgresql.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Oleria Identity Security\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"PostgreSQL - Oleria Identity Security\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Oleria Identity Security\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.oleria.com/integrations/postgresql\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://oleria.mintlify.site/_mintlify/api/og/v2?division=Data+and+analytics\u0026amp;title=PostgreSQL\u0026amp;description=Connect+self-hosted+or+cloud-managed+PostgreSQL+so+Oleria+can+discover+roles%2C+grants%2C+and+access+paths+across+your+databases.\u0026amp;theme=3bcc8de81f9c4fb7d592f688\u0026amp;signature=7619975a3c4a840c06dd9cc6a706b590ff839b6fa3e55635a0d702272c2bd4e1\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"PostgreSQL - Oleria Identity Security\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://oleria.mintlify.site/_mintlify/api/og/v2?division=Data+and+analytics\u0026amp;title=PostgreSQL\u0026amp;description=Connect+self-hosted+or+cloud-managed+PostgreSQL+so+Oleria+can+discover+roles%2C+grants%2C+and+access+paths+across+your+databases.\u0026amp;theme=3bcc8de81f9c4fb7d592f688\u0026amp;signature=7619975a3c4a840c06dd9cc6a706b590ff839b6fa3e55635a0d702272c2bd4e1\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/oleria/VFsEjt_GQ9jb2s6K/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Oleria Identity Security\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#027864\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.oleria.com/integrations/postgresql\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/postgresql.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.oleria.com/#organization\",\"name\":\"Oleria Identity Security\",\"url\":\"https://docs.oleria.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/oleria/KyPIHO-0OF6fE_DF/images/OleriaLightMode-1.png?fit=max\u0026auto=format\u0026n=KyPIHO-0OF6fE_DF\u0026q=85\u0026s=906d33a8c505e2a96b7c6a1583335e1d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.oleria.com#website\",\"name\":\"Oleria Identity Security\",\"url\":\"https://docs.oleria.com\",\"publisher\":{\"@id\":\"https://docs.oleria.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.oleria.com/integrations/postgresql#webpage\",\"url\":\"https://docs.oleria.com/integrations/postgresql\",\"name\":\"PostgreSQL\",\"description\":\"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\",\"dateModified\":\"2026-10-23T09:31:25.483Z\",\"isPartOf\":{\"@id\":\"https://docs.oleria.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.oleria.com/integrations/postgresql#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.oleria.com/integrations/postgresql#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Applications\",\"item\":\"https://docs.oleria.com/integrations/automation-anywhere\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data and analytics\",\"item\":\"https://docs.oleria.com/integrations/airbyte\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PostgreSQL\",\"item\":\"https://docs.oleria.com/integrations/postgresql\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.oleria.com/integrations/postgresql#article\",\"headline\":\"PostgreSQL\",\"name\":\"PostgreSQL\",\"description\":\"Connect self-hosted or cloud-managed PostgreSQL so Oleria can discover roles, grants, and access paths across your databases.\",\"url\":\"https://docs.oleria.com/integrations/postgresql\",\"mainEntityOfPage\":{\"@id\":\"https://docs.oleria.com/integrations/postgresql#webpage\"},\"dateModified\":\"2026-10-23T09:31:25.483Z\",\"publisher\":{\"@id\":\"https://docs.oleria.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.oleria.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Oleria Identity Security\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Oleria Identity Security\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/integrations/postgresql.md","siteName":"Oleria Identity Security","nav":{"global":null,"tabs":[{"tab":"Product","pages":[{"title":"Product","href":"/introduction/overview"}]},{"tab":"Integrations","groups":[{"group":"Overview","pages":[{"title":"Integrations overview","href":"/integrations/overview"},{"title":"All integrations","href":"/integrations/directory"},{"title":"Integration capabilities","href":"/integrations/integration-capabilities"}]},{"group":"Generic connectors","pages":[{"title":"Integration Studio","href":"/integrations/integration-studio"},{"title":"Ticketing Studio","href":"/integrations/ticketing-studio"},{"title":"SCIM Connector","href":"/integrations/scim"},{"title":"Custom Application","href":"/integrations/custom-application"}]},{"group":"Identity providers","pages":[{"title":"1Kosmos","href":"/integrations/1kosmos"},{"title":"Active Directory","href":"/integrations/active-directory"},{"title":"CyberArk Identity","href":"/integrations/cyberark"},{"title":"Descope","href":"/integrations/descope"},{"title":"FusionAuth","href":"/integrations/fusionauth"},{"title":"Google Admin and Drive","href":"/integrations/google-workspace"},{"title":"IBM Verify","href":"/integrations/ibm-verify"},{"title":"JumpCloud","href":"/integrations/jumpcloud"},{"title":"Microsoft Entra ID and M365 SharePoint","href":"/integrations/microsoft-entra-id"},{"title":"Okta","href":"/integrations/okta"},{"title":"OneLogin","href":"/integrations/onelogin"},{"title":"Ping Directory","href":"/integrations/ping-directory"},{"title":"PingFederate","href":"/integrations/pingfederate"},{"title":"PingOne","href":"/integrations/pingone"},{"title":"SailPoint","href":"/integrations/sailpoint"},{"title":"Thales SafeNet Trusted Access","href":"/integrations/thales-sta"},{"title":"ZITADEL","href":"/integrations/zitadel"}]},{"group":"HR systems","pages":[{"title":"ADP Workforce Now","href":"/integrations/adp"},{"title":"BambooHR","href":"/integrations/bamboohr"},{"title":"Dayforce","href":"/integrations/dayforce"},{"title":"Deel","href":"/integrations/deel"},{"title":"Factorial","href":"/integrations/factorial"},{"title":"greytHR","href":"/integrations/greythr"},{"title":"Gusto","href":"/integrations/gusto"},{"title":"HiBob","href":"/integrations/hibob"},{"title":"Oracle HCM","href":"/integrations/oracle-hcm"},{"title":"Oracle PeopleSoft","href":"/integrations/peoplesoft"},{"title":"Paycom","href":"/integrations/paycom"},{"title":"Rippling","href":"/integrations/rippling"},{"title":"SAP Fieldglass","href":"/integrations/sap-fieldglass"},{"title":"SAP SuccessFactors","href":"/integrations/sap-success-factors"},{"title":"TriNet","href":"/integrations/trinet"},{"title":"UKG Pro","href":"/integrations/ukg-pro"},{"title":"UKG Ready","href":"/integrations/ukg-ready"},{"title":"Workable","href":"/integrations/workable"},{"title":"Workday","href":"/integrations/workday"}]},{"group":"Cloud infrastructure","pages":[{"title":"Alibaba Cloud","href":"/integrations/alibaba-cloud"},{"title":"AWS IAM and S3","href":"/integrations/aws-iam-and-s3"},{"title":"Azure","href":"/integrations/azure"},{"title":"Cloud Foundry","href":"/integrations/cloud-foundry"},{"title":"Google Cloud Platform","href":"/integrations/gcp"},{"title":"IBM Cloud","href":"/integrations/ibm-cloud"},{"title":"Kubernetes","href":"/integrations/kubernetes"},{"title":"Netlify","href":"/integrations/netlify"},{"title":"Oracle Cloud","href":"/integrations/oracle-cloud"},{"title":"Render","href":"/integrations/render"},{"title":"Vercel","href":"/integrations/vercel"},{"title":"Vultr","href":"/integrations/vultr"}]},{"group":"Applications","pages":[{"group":"AI and automation","pages":[{"title":"Automation Anywhere","href":"/integrations/automation-anywhere"},{"title":"Boomi","href":"/integrations/boomi"},{"title":"Celigo","href":"/integrations/celigo"},{"title":"ChatGPT \u0026 Codex","href":"/integrations/chatgpt"},{"title":"Claude","href":"/integrations/claude"},{"title":"Cursor","href":"/integrations/cursor"},{"title":"LiteLLM","href":"/integrations/litellm"},{"title":"Tines","href":"/integrations/tines"},{"title":"UiPath Orchestrator","href":"/integrations/uipath"},{"title":"Workato","href":"/integrations/workato"},{"title":"Zapier","href":"/integrations/zapier"}]},{"group":"Collaboration and productivity","pages":[{"title":"Aha!","href":"/integrations/aha"},{"title":"Airtable","href":"/integrations/airtable"},{"title":"Asana","href":"/integrations/asana"},{"title":"Atlassian Cloud","href":"/integrations/atlassian-cloud"},{"title":"Box","href":"/integrations/box"},{"title":"Calendly","href":"/integrations/calendly"},{"title":"ClickUp","href":"/integrations/clickup"},{"title":"Coda","href":"/integrations/coda"},{"title":"Discourse","href":"/integrations/discourse"},{"title":"Document360","href":"/integrations/document360"},{"title":"DocuWare","href":"/integrations/docuware"},{"title":"Dropbox","href":"/integrations/dropbox"},{"title":"Egnyte","href":"/integrations/egnyte"},{"title":"FileCloud","href":"/integrations/filecloud"},{"title":"Files.com","href":"/integrations/files-com"},{"title":"Grammarly","href":"/integrations/grammarly"},{"title":"Grist","href":"/integrations/grist"},{"title":"Guru","href":"/integrations/guru"},{"title":"Liferay","href":"/integrations/liferay"},{"title":"Linear","href":"/integrations/linear"},{"title":"Lucid","href":"/integrations/lucid"},{"title":"Maze","href":"/integrations/maze"},{"title":"Microsoft Teams","href":"/integrations/microsoft-teams"},{"title":"Miro","href":"/integrations/miro"},{"title":"monday.com","href":"/integrations/monday"},{"title":"Mural","href":"/integrations/mural"},{"title":"Notion","href":"/integrations/notion"},{"title":"Outline","href":"/integrations/outline"},{"title":"Procore","href":"/integrations/procore"},{"title":"Productboard","href":"/integrations/productboard"},{"title":"ShareFile","href":"/integrations/sharefile"},{"title":"Shortcut","href":"/integrations/shortcut"},{"title":"Smartsheet","href":"/integrations/smartsheet"},{"title":"SurveyMonkey","href":"/integrations/surveymonkey"},{"title":"Teamwork.com","href":"/integrations/teamwork"},{"title":"Trello","href":"/integrations/trello"},{"title":"Workvivo","href":"/integrations/workvivo"},{"title":"Wrike","href":"/integrations/wrike"},{"title":"Zulip","href":"/integrations/zulip"}]},{"group":"Communication","pages":[{"title":"8x8","href":"/integrations/eight-x-eight"},{"title":"AlertMedia","href":"/integrations/alertmedia"},{"title":"Dialpad","href":"/integrations/dialpad"},{"title":"Discord","href":"/integrations/discord"},{"title":"Genesys Cloud","href":"/integrations/genesys-cloud"},{"title":"Loom","href":"/integrations/loom"},{"title":"RingCentral","href":"/integrations/ringcentral"},{"title":"Slack","href":"/integrations/slack"},{"title":"Twist","href":"/integrations/twist"},{"title":"Vimeo","href":"/integrations/vimeo"},{"title":"Webex","href":"/integrations/webex"},{"title":"Zoom","href":"/integrations/zoom"}]},{"group":"Data and analytics","pages":[{"title":"Airbyte","href":"/integrations/airbyte"},{"title":"Aiven","href":"/integrations/aiven"},{"title":"Amplitude","href":"/integrations/amplitude"},{"title":"ClickHouse Cloud","href":"/integrations/clickhouse"},{"title":"CockroachDB Cloud","href":"/integrations/cockroachdb-cloud"},{"title":"Collibra","href":"/integrations/collibra"},{"title":"Confluent","href":"/integrations/confluent"},{"title":"Databricks","href":"/integrations/databricks"},{"title":"Elasticsearch","href":"/integrations/elasticsearch"},{"title":"Fivetran","href":"/integrations/fivetran"},{"title":"Heap","href":"/integrations/heap"},{"title":"Informatica","href":"/integrations/informatica"},{"title":"Metabase","href":"/integrations/metabase"},{"title":"Microsoft Fabric","href":"/integrations/microsoft-fabric"},{"title":"Mode","href":"/integrations/mode"},{"title":"PlanetScale","href":"/integrations/planetscale"},{"title":"PostHog","href":"/integrations/posthog"},{"title":"Sisense","href":"/integrations/sisense"},{"title":"Microsoft SQL Server","href":"/integrations/sqlserver"},{"title":"MicroStrategy","href":"/integrations/microstrategy"},{"title":"Mixpanel","href":"/integrations/mixpanel"},{"title":"MongoDB","href":"/integrations/mongodb"},{"title":"MySQL","href":"/integrations/mysql"},{"title":"OpenSearch","href":"/integrations/opensearch"},{"title":"Oracle Database","href":"/integrations/oracle-database"},{"title":"Pendo","description":"Connect your Pendo account to Oleria to continuously discover user access across your product engagement platform.","href":"/integrations/pendo"},{"title":"PostgreSQL","href":"/integrations/postgresql"},{"title":"Qlik Cloud","description":"Connect your Qlik Cloud tenant to Oleria to discover who can reach your analytics: users, groups, tenant and space roles, spaces and their content, app shares, bot users, OAuth clients, client secrets, API keys, and audit activity.","href":"/integrations/qlik"},{"title":"SAP HANA","href":"/integrations/saphana"},{"title":"Segment","href":"/integrations/segment"},{"title":"Sigma Computing","href":"/integrations/sigma-computing"},{"title":"Snowflake","href":"/integrations/snowflake"},{"title":"Spotfire","href":"/integrations/spotfire"},{"title":"Starburst Galaxy","href":"/integrations/starburst-galaxy"},{"title":"Tableau Cloud","href":"/integrations/tableau-cloud"},{"title":"ThoughtSpot","href":"/integrations/thoughtspot"}]},{"group":"Design and content","pages":[{"title":"Adobe Creative Cloud","href":"/integrations/adobe-creative-cloud"},{"title":"Bynder","href":"/integrations/bynder"},{"title":"Canva","href":"/integrations/canva"},{"title":"Contentful","href":"/integrations/contentful"},{"title":"Crowdin","href":"/integrations/crowdin"},{"title":"Figma","href":"/integrations/figma"},{"title":"InVision","href":"/integrations/invision"},{"title":"Sanity","href":"/integrations/sanity"},{"title":"Sketch","href":"/integrations/sketch"}]},{"group":"Developer tools","pages":[{"title":"Apple Developer Program","href":"/integrations/apple-developer-program"},{"title":"Appwrite","href":"/integrations/appwrite"},{"title":"Astronomer","href":"/integrations/astronomer"},{"title":"Azure DevOps","href":"/integrations/azure-devops"},{"title":"Bitbucket","href":"/integrations/bitbucket"},{"title":"Bitrise","href":"/integrations/bitrise"},{"title":"BrowserStack","href":"/integrations/browserstack"},{"title":"Buildkite","href":"/integrations/buildkite"},{"title":"Checkly","href":"/integrations/checkly"},{"title":"Cloudsmith","href":"/integrations/cloudsmith"},{"title":"Codacy","href":"/integrations/codacy"},{"title":"Coder","href":"/integrations/coder"},{"title":"ConfigCat","href":"/integrations/configcat"},{"title":"Docker Hub","href":"/integrations/docker-hub"},{"title":"env0","href":"/integrations/env0"},{"title":"Flagsmith","href":"/integrations/flagsmith"},{"title":"GitBook","href":"/integrations/gitbook"},{"title":"Gitea","href":"/integrations/gitea"},{"title":"GitHub","href":"/integrations/github"},{"title":"GitLab","href":"/integrations/gitlab"},{"title":"Gravitee API Management","href":"/integrations/gravitee"},{"title":"Gremlin","href":"/integrations/gremlin"},{"title":"GrowthBook","href":"/integrations/growthbook"},{"title":"Harness","href":"/integrations/harness"},{"title":"Hugging Face","href":"/integrations/huggingface"},{"title":"Jama Connect","href":"/integrations/jama"},{"title":"Jenkins","href":"/integrations/jenkins"},{"title":"JFrog","href":"/integrations/jfrog"},{"title":"JupyterHub","href":"/integrations/jupyterhub"},{"title":"LaunchDarkly","href":"/integrations/launchdarkly"},{"title":"MuleSoft Anypoint Platform","href":"/integrations/mulesoft"},{"title":"Octopus Deploy","href":"/integrations/octopus-deploy"},{"title":"PactFlow","href":"/integrations/pactflow"},{"title":"Port","href":"/integrations/port-io"},{"title":"Postman","href":"/integrations/postman"},{"title":"Pulumi","href":"/integrations/pulumi"},{"title":"Railway","href":"/integrations/railway"},{"title":"RevenueCat","href":"/integrations/revenuecat"},{"title":"Scalr","href":"/integrations/scalr"},{"title":"SonarQube","href":"/integrations/sonarqube"},{"title":"Split","href":"/integrations/split"},{"title":"Statsig","href":"/integrations/statsig"},{"title":"TeamCity","href":"/integrations/teamcity"},{"title":"Temporal Cloud","href":"/integrations/temporal-cloud"},{"title":"Terraform Cloud","href":"/integrations/terraform-cloud"},{"title":"Tyk","href":"/integrations/tyk"},{"title":"Unleash","href":"/integrations/unleash"},{"title":"YouTrack","href":"/integrations/youtrack"}]},{"group":"Finance and operations","pages":[{"title":"Accela","href":"/integrations/accela"},{"title":"Adyen","href":"/integrations/adyen"},{"title":"Airbase","href":"/integrations/airbase"},{"title":"Anaplan","href":"/integrations/anaplan"},{"title":"Avalara AvaTax","href":"/integrations/avalara"},{"title":"Brex","href":"/integrations/brex"},{"title":"Coupa","href":"/integrations/coupa"},{"title":"DocuSign","href":"/integrations/docusign"},{"title":"Encompass","href":"/integrations/encompass"},{"title":"ERPNext","href":"/integrations/erpnext"},{"title":"Expensify","href":"/integrations/expensify"},{"title":"Filevine","href":"/integrations/filevine"},{"title":"IBM Maximo","href":"/integrations/ibm-maximo"},{"title":"Infor CloudSuite","href":"/integrations/infor-cloudsuite"},{"title":"Ironclad","href":"/integrations/ironclad"},{"title":"Navan","href":"/integrations/navan"},{"title":"NetSuite","href":"/integrations/netsuite"},{"title":"Odoo","href":"/integrations/odoo"},{"title":"PandaDoc","href":"/integrations/pandadoc"},{"title":"PayPal Braintree","href":"/integrations/braintree"},{"title":"Ramp","href":"/integrations/ramp"},{"title":"Sage Intacct","href":"/integrations/sage-intacct"},{"title":"SAP Ariba","href":"/integrations/sap-ariba"},{"title":"SAP Concur","href":"/integrations/sap-concur"},{"title":"SAP S/4HANA","href":"/integrations/sap-s4-hana"},{"title":"Stripe","href":"/integrations/stripe"},{"title":"Zip","href":"/integrations/zip"},{"title":"Zoho Books","href":"/integrations/zoho-books"},{"title":"Zuora","href":"/integrations/zuora"}]},{"group":"Healthcare","pages":[{"title":"Oracle Cerner","href":"/integrations/cerner"},{"title":"Epic","href":"/integrations/epic"},{"title":"Veeva Vault","href":"/integrations/veeva"}]},{"group":"IT and workplace","pages":[{"title":"Envoy","href":"/integrations/envoy"},{"title":"Freshservice","href":"/integrations/freshservice"},{"title":"HaloITSM","href":"/integrations/haloitsm"},{"title":"Iru","href":"/integrations/iru"},{"title":"Jamf Pro","href":"/integrations/jamf"},{"title":"LeanIX","href":"/integrations/leanix"},{"title":"ManageEngine ServiceDesk Plus","href":"/integrations/servicedesk-plus"},{"title":"OTRS","href":"/integrations/otrs"},{"title":"Robin","href":"/integrations/robin"},{"title":"ServiceNow","href":"/integrations/servicenow"},{"title":"Snipe-IT","href":"/integrations/snipe-it"},{"title":"Splashtop","href":"/integrations/splashtop"},{"title":"TeamViewer","href":"/integrations/teamviewer"},{"title":"Workspace ONE","href":"/integrations/workspace-one"},{"title":"Xurrent","href":"/integrations/xurrent"}]},{"group":"Monitoring and observability","pages":[{"title":"AppDynamics","href":"/integrations/appdynamics"},{"title":"Bugsnag","href":"/integrations/bugsnag"},{"title":"Coralogix","href":"/integrations/coralogix"},{"title":"Datadog","href":"/integrations/datadog"},{"title":"Dynatrace","href":"/integrations/dynatrace"},{"title":"FireHydrant","href":"/integrations/firehydrant"},{"title":"Grafana","href":"/integrations/grafana"},{"title":"incident.io","href":"/integrations/incident-io"},{"title":"LogicMonitor","href":"/integrations/logicmonitor"},{"title":"IBM QRadar SIEM","href":"/integrations/qradar"},{"title":"New Relic","href":"/integrations/new-relic"},{"title":"PagerDuty","href":"/integrations/pagerduty"},{"title":"Rollbar","href":"/integrations/rollbar"},{"title":"Rootly","href":"/integrations/rootly"},{"title":"Sentry","href":"/integrations/sentry"},{"title":"Splunk","href":"/integrations/splunk"},{"title":"Sumo Logic","href":"/integrations/sumo-logic"},{"title":"ThousandEyes","href":"/integrations/thousand-eyes"},{"title":"xMatters","href":"/integrations/xmatters"},{"title":"Zabbix","href":"/integrations/zabbix"}]},{"group":"People and learning","pages":[{"title":"15Five","href":"/integrations/fifteen-five"},{"title":"Absorb LMS","href":"/integrations/absorb-lms"},{"title":"Bonusly","href":"/integrations/bonusly"},{"title":"Greenhouse","href":"/integrations/greenhouse"},{"title":"Lattice","href":"/integrations/lattice"},{"title":"Lever","href":"/integrations/lever"},{"title":"Recruitee","href":"/integrations/recruitee"},{"title":"Udemy Business","href":"/integrations/udemy-business"}]},{"group":"Sales, marketing, and support","pages":[{"title":"AdRoll","href":"/integrations/adroll"},{"title":"Attio","href":"/integrations/attio"},{"title":"Braze","href":"/integrations/braze"},{"title":"Close","href":"/integrations/close"},{"title":"Freshdesk","href":"/integrations/freshdesk"},{"title":"Front","href":"/integrations/front"},{"title":"Gong","href":"/integrations/gong"},{"title":"HappyFox","href":"/integrations/happyfox"},{"title":"Highspot","href":"/integrations/highspot"},{"title":"HubSpot","href":"/integrations/hubspot"},{"title":"Intercom","href":"/integrations/intercom"},{"title":"Khoros","href":"/integrations/khoros"},{"title":"Kustomer","href":"/integrations/kustomer"},{"title":"Microsoft Dynamics 365","href":"/integrations/dynamics365"},{"title":"Outreach","href":"/integrations/outreach"},{"title":"Pipedrive","href":"/integrations/pipedrive"},{"title":"Pylon","href":"/integrations/pylon"},{"title":"Responsive","href":"/integrations/responsive"},{"title":"Salesforce","href":"/integrations/salesforce"},{"title":"Salesloft","href":"/integrations/salesloft"},{"title":"SAP CRM","href":"/integrations/sap-crm"},{"title":"Shopify Plus","href":"/integrations/shopify-plus"},{"title":"Showpad","href":"/integrations/showpad"},{"title":"Sprinklr","href":"/integrations/sprinklr"},{"title":"SugarCRM","href":"/integrations/sugarcrm"},{"title":"Zammad","href":"/integrations/zammad"},{"title":"Zendesk","href":"/integrations/zendesk"},{"title":"Zoho","href":"/integrations/zoho"}]},{"group":"Security and compliance","pages":[{"title":"1Password","href":"/integrations/1password"},{"title":"Akamai","href":"/integrations/akamai"},{"title":"AppOmni","href":"/integrations/appomni"},{"title":"Archer","href":"/integrations/archer"},{"title":"BeyondTrust Password Safe","href":"/integrations/beyondtrust-password-safe"},{"title":"Bitwarden","href":"/integrations/bitwarden"},{"title":"Cato Networks","href":"/integrations/cato-networks"},{"title":"Cisco Meraki","href":"/integrations/cisco-meraki"},{"title":"Cisco Umbrella","href":"/integrations/cisco-umbrella"},{"title":"Cloudflare","href":"/integrations/cloudflare"},{"title":"CrowdStrike Falcon","href":"/integrations/crowdstrike-falcon"},{"title":"Delinea","href":"/integrations/delinea"},{"title":"DigiCert","href":"/integrations/digicert"},{"title":"Doppler","href":"/integrations/doppler"},{"title":"Druva","href":"/integrations/druva"},{"title":"Duo Security","href":"/integrations/duo-security"},{"title":"Fastly","href":"/integrations/fastly"},{"title":"Fleet","href":"/integrations/fleet"},{"title":"Fortanix Data Security Manager","href":"/integrations/fortanix"},{"title":"Fortify Software Security Center","href":"/integrations/fortify"},{"title":"FortiGate","href":"/integrations/fortigate"},{"title":"GitGuardian","href":"/integrations/gitguardian"},{"title":"Huntress","href":"/integrations/huntress"},{"title":"Imperva","href":"/integrations/imperva"},{"title":"Infisical","href":"/integrations/infisical"},{"title":"Island","href":"/integrations/island"},{"title":"Keeper Security","href":"/integrations/keeper-security"},{"title":"KnowBe4","href":"/integrations/knowbe4"},{"title":"Lacework","href":"/integrations/lacework"},{"title":"LastPass","href":"/integrations/lastpass"},{"title":"Microsoft Intune","href":"/integrations/microsoft-intune"},{"title":"Netskope","href":"/integrations/netskope"},{"title":"OneTrust","href":"/integrations/onetrust"},{"title":"Panther","href":"/integrations/panther"},{"title":"Prisma SASE","href":"/integrations/prisma-sase"},{"title":"Privacera","href":"/integrations/privacera"},{"title":"Proofpoint","href":"/integrations/proofpoint"},{"title":"Qualys","href":"/integrations/qualys"},{"title":"Rapid7","href":"/integrations/rapid7"},{"title":"Snyk","href":"/integrations/snyk"},{"title":"Sophos","href":"/integrations/sophos"},{"title":"StrongDM","href":"/integrations/strongdm"},{"title":"Sysdig","href":"/integrations/sysdig"},{"title":"Tailscale","href":"/integrations/tailscale"},{"title":"Tanium","href":"/integrations/tanium"},{"title":"Teleport","href":"/integrations/teleport"},{"title":"Twingate","href":"/integrations/twingate"},{"title":"Vanta","href":"/integrations/vanta"},{"title":"Verkada","href":"/integrations/verkada"},{"title":"Wiz","href":"/integrations/wiz"},{"title":"Zscaler (SCIM)","href":"/integrations/zscaler"},{"title":"Zscaler Internet Access","href":"/integrations/zscaler-internet-access"}]}]},{"group":"Ticketing","pages":[{"title":"Jira","href":"/workspace/jira-ticketing"},{"title":"ServiceNow","href":"/workspace/servicenow-ticketing"}]},{"group":"Messaging","pages":[{"title":"Microsoft Teams","href":"/workspace/teams-messaging"},{"title":"Slack","href":"/workspace/slack-messaging"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/developer-docs/api-reference/overview"}]},{"tab":"What's New","pages":[{"title":"What's New","href":"/release-notes"}]}]},"basePath":"","title":"PostgreSQL - Oleria Identity Security","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}