Repository navigation
Database Reporting and Operations Schema
Database Schema → Database Reporting and Operations Schema
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_blockedis not "a policy matched". A rule can listBlockAccessand 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.
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_dailycannot attribute a charge to an individual.
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. |
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. |
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. |
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. |
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! |
- Copilot analytics overview
- Copilot Adoption user guide
- Copilot Adoption setup (admins)
- Work Trend Index
- Copilot investment
- Copilot spend
- Agent costs
- Prompt categories
- Copilot credit history (preview)
- Agent 365 package catalog
- The Copilot data in depth
- Prerequisites
- App registrations setup
- Install with the installer
- Verify the deployment
- Security & permissions model
- Private endpoints (optional)
- Certificate authentication (optional)
- Manual installation
- Activity & usage analytics (Power BI)
- SharePoint page tracking