Skip to content

Database Reporting and Operations Schema

Sam Betts edited this page Nov 4, 2026 · 2 revisions

Database Schema → Database Reporting and Operations Schema

Data Loss Prevention (DLP)

Two different sources, deliberately kept apart because only one of them can attribute a block to an agent. See DLP impact on Copilot.

Table Name Comments
copilot_dlp_events One row per (blocked or audited resource × policy × rule) on a Copilot interaction. Links to copilot_chats, so the agent and user come with it. Carries is_blocked — see the blocked vs audited-only distinction below. Needs no extra permission and no DLP toggle; it reads the Copilot audit records the Copilot import already brings in.
dlp_rule_matches Tenant-wide rule matches from the separate DLP.All feed (Exchange, SharePoint/OneDrive, endpoint). Links to audit_events. No agent identity — these records carry the literal UserKey = "DlpAgent". Optional: needs ImportDlp plus ActivityFeed.ReadDlp consent.
dlp_policies Policy lookup – policy ID and name. Shared by both sources.
dlp_rules Rule lookup – rule ID, name, parent policy, severity and rule mode. Shared by both sources.
dlp_actions Action lookup. Shared by both sources.

is_blocked is not "a policy matched". A rule can list BlockAccess and still block nothing because it is running in simulation (RuleMode = "Audit only"), so blocked and audited-only are never merged. An access failure carrying no policy detail is treated as not DLP at all (usually a deleted file or a permissions problem), and an unrecognised action is treated as non-blocking rather than inventing a block.

Privacy: the solution records that a policy fired — policy, rule, severity, action and the affected resource's name and sensitivity label — and never the content that triggered it.

Agent costs

What Microsoft charges you for Copilot Studio agents, and what agent workloads cost in Azure. Both imports are optional and off by default, and each needs its own grant — see Agent costs.

Table Name Comments
copilot_studio_credit_daily Agent/environment/day/billing-slice credits, derived from delegated user/resource reads: environment, agent, harness, feature, billed and non-billed credits, distinct_users, dimension_hash and the refresh/import times. distinct_users counts contributing people per slice and must not be summed across slices/days. The model, tool, knowledge-source and channel columns were dropped in Stable 1833 because the billing API never supplied them; the displayed feature/harness reflects returned billing evidence.
copilot_studio_credit_user_daily Per person, per agent, per day: billed credits, identified by Entra object ID and resolved to user_id where the directory match succeeds. Unresolved people still have their credits counted, and are retried on later import cycles.
copilot_studio_credit_capacity Tenant credit capacity snapshots – entitled, consumed, allocated, available, pay-as-you-go consumed, and status.
azure_cost_daily Daily Azure spend for the subscriptions and meters you point it at – scope, subscription, resource, resource group, service, meter category/sub-category/name, cost, currency, quantity and whether the figure is still an estimate, plus tag_key and tag_value when the AzureCostGroupBy app setting groups by a tag (since Stable 1833). Deduplicated on row_hash.
agent_cost_import_log One row per import run – name, window, rows read/saved and any error, for the Health page.

Consumption is delegated; capacity stays app-only. Derived agent/person rows cover only consumption Microsoft attributes to people; a capacity total can include more. Copilot Studio capacity is not Cowork funding. Azure is resource-scoped, so azure_cost_daily cannot attribute a charge to an individual.

Email

These tables are populated by the optional Sent Email Import feature, which reads each user's sentitems folder via Microsoft Graph. Requires the Mail.Read Graph application permission.

Table Name Comments
sent_emails One row per sent message. Columns: subject, sent_date, graph_message_id (the Graph message ID, unique), cognitive_score (optional positive-sentiment score from Azure AI Language), from_address_id, and user_id (the sender). Recipients live in sent_email_recipients so message-level fields are not duplicated.
sent_email_recipients Intermediary table linking sent_emails to recipient email_addresses. Columns: sent_email_id, recipient_address_id. Unique index on (sent_email_id, recipient_address_id). Cascades on sent_emails delete.
email_addresses Lookup table for sender and recipient email addresses referenced by sent_emails.from_address_id and sent_email_recipients.recipient_address_id.

Reporting dimensions

Date and time dimension tables, created by the v1-0-8 migration and joined by the reporting views.

Table Name Comments
DimDate Standard date dimension – one row per calendar day, with the usual year/quarter/month/day parts.
DimTime Standard time-of-day dimension.

profiling schema

These live in the profiling schema, not dbo. They are created by the SQL extension scripts that DatabaseUpgrader runs on every standard database upgrade, and they back the weekly activity/usage reporting and the profiling pipeline's own operational log.

Table Name Comments
profiling.ActivitiesWeekly Long / EAV. One row per user × week × metric, keyed (user_id, MetricDate, Metric) with an INT sum.
profiling.ActivitiesWeeklyColumns Wide. The same data as ActivitiesWeekly, pivoted: one row per (user_id, date) with ~70 BIGINT metric columns (OneDrive / Email / SharePoint / Teams / Viva Engage / Copilot, including per-Copilot-app).
profiling.UsageWeekly Wide, boolean. One row per (user_id, date) with ~50 BIT "did this user use platform X this week" flags (Teams device, Office app × OS, Viva Engage device).
profiling.TraceLogs Operational log for the profiling compile pipeline.

Portal settings

Settings that portal administrators make in the web portal, kept in the analytics database so they share its backups and point-in-time restore.

Table Name Comments
portal_global_filters The administrator's report filter: at most one row, holding filter_json, a concurrency revision, and modified_utc/modified_by. Created empty by 202610011330001_PortalGlobalFilter, in Stable 1849. No row, or empty filter_json, means no filter.

Miscellaneous Tables

These tables are for any other use.

Table Name Comments
o365_client_applications List of Microsoft 365 client applications – name and Microsoft IDs for each one.
sys_telemetry_reports Telemetry report contents sent to Microsoft (disabled by default).
sys_configs Configurations applied to system from control-panel.
orgs Organisation definitions. Used with org_urls to determine import scope.
org_urls URLs used for importing activity from Microsoft 365. URL base and exact match.
import_log Debugging import log entries – message, machine name, timestamp.
group_crawl_config Groups/Teams crawl configuration – Graph ID and include/exclude flag.
__MigrationHistory Entity Framework 6 migration log. Do not edit!

Return to Database Schema · All topics in this guide

Previous: Database Copilot Schema

Start here

Copilot analytics

Using the portal

Install & configure

Beyond Copilot

Operate

Upgrading from an older build

Reference

Project

Clone this wiki locally