Auditing Data Access Events Across BI Tools and Database Connections
Centralize access logs across databases, BI tools, and platforms to meet compliance demands.

Data access control for internal tools works best when permissions live in one governed layer, not scattered across database credentials, BI service accounts, and admin panel logins that nobody can fully reconcile. Each of these channels writes its own event log, on its own schedule, using its own vocabulary for what counts as a "user" and what counts as an "access event." If you pull those four logs during an incident or a compliance review, they rarely agree. One system might log a service account where another logs a named employee. One might record a query, another a dashboard render, another nothing. None of them line up automatically, and making them line up takes deliberate work that most teams only discover they need once someone asks for a complete answer and the pieces don't fit.
The database audit log's scope and boundary
The database sits closest to the data, so its audit log is the most trustworthy record of what actually happened to a table, row, or column. Oracle's unified auditing documentation calls database auditing the most accurate record of database activity, and for good reason: it captures local logins, recursive SQL, dynamic SQL, stored procedure calls, privilege use, schema changes, and failed operations, no matter which application sent the request. The full record includes the operation type, the SQL statement itself, which system privileges were used, which object was touched, and session details detailed enough for forensic work, all independent of encryption, access path, or the specific user involved; Oracle's documentation describes this as the scope of the record.
That strength comes with a hard limit. Oracle's documentation notes that auditing is site-autonomous, so a database instance only audits statements issued by users connected directly to it. Attribution collapses at that single connection point, because the database was never shown the access in the first place, and no native logging can recover an identity it never saw.
Teams trying to close that gap at the database layer have three practical options, and each one costs you something different. Native auditing is built in and free, but it adds performance overhead and can be disabled by a sufficiently privileged user (anyone with SUPER privilege can turn off a native logging plugin from inside the database). A host-based agent sits closer to the database process and captures activity at the OS level, but it has to be installed and maintained on every host running the database. None of these three choices solves the problem of attributing access made through shared service accounts. That's a different layer's job.
How BI tools break database-level attribution
Nearly every BI tool connects to its database through one shared service account, so no matter how many people run reports behind it, the database sees just one authenticated principal. The BI tool's own event log picks up some of the slack here, but it operates entirely above the database, recording what the BI tool processed rather than what actually reached the database engine. Microsoft's Power BI data-level auditing documentation describes this as semantic model event logs, sometimes called trace events or dataset activity logs, which capture user-generated and system-generated activity on a semantic model, including which row-level security role fired and for which user. That's valuable information, but it describes the BI layer's view of the world, not a database-layer record.
The BI-layer log says a named user ran a report, while the database log says the service account executed a SELECT statement. Getting there means joining the two logs on timestamp and query text, and that join is fragile. Clocks drift, and the BI engine rewrites queries before they hit the database, so an approximate match is often the best you can get.
Row-level security rules configured inside a BI tool, the kind Power BI documentation describes, do real work, but only when you stay within that tool. If you run a query through direct SQL access, a bulk data export, or a raw API call, you sidestep the BI layer entirely and leave no trace in its logs, so none of those row-level protections apply either. Tools like Basedash build self-serve analytics around a governed semantic layer, which centralizes metric definitions so every user calculates the same number the same way, and that's a real gain for governance. But a semantic layer can only govern what passes through it. Anything that bypasses it is invisible to that layer's audit trail. That is why the database-layer log from the previous section still matters even after the BI layer is doing everything right.
What platform-level audit logs cover
A third event stream sits above both the database and the BI tool: the cloud or SaaS platform hosting them. These platforms generate audit records for operations that neither of the other two layers ever sees, including authentication events, permission changes, sharing actions, data exports, and cross-tenant access. None of that appears in a database log or a semantic model's trace events, because none of it happens inside the database or the BI tool. It happens at the platform that connects everything together.
Microsoft's Dataverse auditing documentation illustrates a pattern worth understanding because it recurs across platform-layer systems generally: auditing has to be explicitly turned on at three separate levels, environment, table, and column, before anything gets recorded. By default, retrieve operations and export operations aren't audited at all, and turning them on requires a separate activity logging feature. Dataverse also requires administrators to choose a retention period for event logs, and the gap between a short default retention window and the much longer windows required under SOX, GDPR Article 30, or PCI DSS 4.0 is exactly the kind of detail that gets missed in an initial configuration and discovered later, usually during an audit, which is the worst time to discover it.
Platform-layer logs answer a set of questions the database and the BI tool simply cannot: who granted a sharing privilege, when a service principal's credentials were last rotated, which AI agent made an inference call against a given data source, and when a dataset was exported. Each of those carries direct compliance weight, and each one is invisible to the two layers already discussed. That's the case for treating the platform layer as a genuinely separate stream, not a redundant copy of what the database or the BI tool already recorded.
Why compliance frameworks now demand attributed, cross-layer records
Regulators used to accept evidence that controls existed. Increasingly, they want attributed, per-user event records that cover the entire access path, and a shared service account can't give you that by design. PCI DSS Requirement 10 requires logging of all access to cardholder data, including individual user access under sub-requirement 10.2.1.1. Under Article 5(2) and Article 24, GDPR's accountability principle requires an organization to show who accessed personal data, not just claim that access controls were in place. To show that, you need attributed database audit logs, not records that stop at an IP address or a service account name.
The EU AI Act adds a forward-looking layer on top of this. The requirement still matters if you run a BI tool with a natural language query interface or AI-generated SQL against production data, because those systems may fall within scope. When an LLM generates SQL on behalf of many different users, automated guardrails have to enforce access policy and keep an audit trail that captures not just the query that ran but whose natural-language prompt produced it. Microsoft Purview already logs AI agent inference calls and guardrail applications as named operations (AIInferenceCall and AIGuardrail), a sign that platform vendors are starting to treat AI-mediated data access as its own audit category.
Permission debt and shadow access as the silent audit gaps that logs alone don't reveal
Even a well-built, three-layer audit system only sees what flows through the channels it's watching. It says nothing about access that someone granted through credentials or roles and then never revoked. Each of these is a live, working access path that sits there, technically auditable, practically invisible, until something goes wrong and someone finally asks who has access to what.
Audit logs reveal permission debt only when someone reads them with that specific question in mind. One pattern that addresses this at the source is just-in-time access: granting temporary, time-limited access for emergency debugging that expires automatically instead of relying on someone to remember to revoke it later. Bytebase implements exactly this pattern, with automatic expiration built into emergency access grants.
A governed access tool reduces this surface area a different way, by removing the need to hand out raw database credentials or long-lived service accounts. Shadow AI tools that employees adopt on their own, outside IT's knowledge, can create query paths into company data that no layer of logging discussed so far ever sees. That's an extension of the same underlying issue, access nobody is tracking.
What each layer must and cannot log
No single layer can cover the full access path on its own, so building a defensible audit picture starts with assigning each layer the events it's actually positioned to see well, rather than expecting any one of them to do everything.
The database should own authentication events, both successful and failed logins and disconnections, and every privilege grant or revocation, since those are direct changes to who can do what. It should log schema changes, any CREATE, ALTER, or DROP statement against a table, because those are permanent structural changes that deserve a permanent record rather than something that rolls off in a performance log. It should selectively log DML, meaning UPDATE and DELETE statements, against sensitive tables like users, payments, or orders, without trying to log every SELECT against every table, which would bury the signal in noise. It should also capture data export events and unusually large result sets pulled from high-value tables. If you run PostgreSQL, the pgaudit extension gives you the most complete DDL logging without hand-building triggers, though full coverage means turning on both the DDL and ROLE log classes; if you don't have a managed audit tool, a simpler baseline is enabling log_statement = 'ddl' alongside selective trigger-based logging on the handful of tables that actually matter.
The BI tool should own the one fact the database genuinely cannot supply on its own: which named human triggered a given query or report. It should log row-level security invocations, tracking which RLS role applied to which user on which query, the way Power BI's trace events already do. It should log data exports initiated from the BI layer itself, like a dashboard export or a CSV download, since that's a distinct event from a database-level export and, in practice, the more common way data actually leaves an organization. And it should log permission and sharing changes made inside the tool, tracking who shared what report or dataset with whom.
The platform layer, sitting above both, should own authentication and identity events that happen above the application itself, like service principal credential changes, delegation grants, and cross-tenant authentication. Where applicable, it should log AI-mediated access events: inference calls, guardrail applications, and natural-language-to-SQL translations, the kind Microsoft Purview already records for AI agent operations. And it should carry explicit retention configuration, set to match whichever regulatory horizon is longest among SOX, GDPR Article 30, and PCI DSS 4.0, rather than defaulting to whatever the platform ships with out of the box.
One trade-off runs through all of this and deserves to be named directly: full-fidelity statement logging on a large, busy database adds real I/O and storage cost. The answer is to scope logging to the events that actually change risk, the ones named above, and send them to a central system rather than letting them pile up only inside the database itself.
Stitching the layers into a single defensible record
A unified audit picture is a correlated view across three separate event streams, built to answer, for any given access event, who the human was, what table or row or column they touched, when it happened, which channel they came through (BI tool, direct connection, ETL job, admin panel), and under what role or policy they were operating.
The actual join across layers works like this: the BI-layer log gives a human identity and a timestamp, the database log gives a service account and a query, and correlating them means matching on timestamp and query text. Getting that join to work at all depends on a prerequisite step: forwarding logs from every layer into one central system, whether that's a SIEM or a dedicated log aggregation store, before attempting to correlate anything. ManageEngine EventLog Analyzer is one example of a tool built around this centralized approach, monitoring and analyzing database logs, flagging suspicious SQL patterns, and alerting on privilege changes and unusual activity from a vantage point entirely outside the database, closing the tamper gap that native-only logging can't.
A record earns the label "defensible" when it meets four conditions: it's attributed to a human identity rather than a shared service account, it's tamper-evident because it's stored outside the system it describes, it's retained for as long as the strictest applicable regulation requires, and it's actually reviewed on some regular cadence. A flawless logging setup that nobody ever looks at catches nothing. For a team without a dedicated SIEM, the realistic starting point is narrower than all of this: capture authentication, privilege changes, schema changes, and DML on sensitive tables, forward it to one central place, and review it alongside identity events from the cloud platform on a fixed schedule. That scope covers most of what a compliance reviewer or a forensic investigator will actually ask for, without requiring every piece of enterprise tooling on day one.


