<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>New blog articles in Microsoft Fabric Community</title>
    <link>https://community.fabric.microsoft.com/t5/</link>
    <description>Microsoft Fabric Community</description>
    <pubDate>Mon, 14 Sep 2026 08:14:05 GMT</pubDate>
    <dc:creator>Community</dc:creator>
    <dc:date>2026-09-14T08:14:05Z</dc:date>
    <item>
      <title>My button &amp; slicer disappeared in Power BI Service. Here's why.</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/My-button-slicer-disappeared-in-Power-BI-Service-Here-s-why/ba-p/5366075</link>
      <description>&lt;P&gt;Imagine you have created a beautiful table in Power BI with a slicer and a button placed on top of it, overlapping the table area.&lt;/P&gt;
&lt;P&gt;The slicer is used to search for specific content. The button becomes clickable when exactly one row is selected and opens a detail page for that row.&lt;/P&gt;
&lt;P&gt;In Power BI Desktop, everything works perfectly.&lt;/P&gt;
&lt;P&gt;However, as soon as you publish your report to the Power BI service and start interacting with it, strange things may happen.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If you select one row, both the slicer and the button disappear.&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If you leave the table area, both reappear.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;However, as soon as you hover over them, they disappear again.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Even more strangely, if you move in and out of the table a few times, it may happen that the button is available again.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;As it turns out, this is documented behaviour, not a bug. In reading view, Power BI brings the selected visual to the front layer, above anything that overlaps it. Selecting a table row selects the table, so the button and the slicer, which actually sit in front of the table, end up behind it and disappear.&lt;/P&gt;
&lt;P&gt;What I can't explain is the button becoming available again after moving in and out a few times. I haven't found anything documented on that.&lt;/P&gt;
&lt;P&gt;The good news: this default behaviour can be changed.&lt;/P&gt;
&lt;P&gt;To change it, there is an option. It's called 'Maintain layer order' and can be found in a visuals format pane under Properties &amp;gt; Advanced options.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Switch it on for the visual that jumps to the front, in my case the table.&lt;/P&gt;
&lt;P&gt;Have you run into this one? And on which visual did you end up switching it on?&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 21:28:14 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/My-button-slicer-disappeared-in-Power-BI-Service-Here-s-why/ba-p/5366075</guid>
      <dc:creator>Hans-Georg_Puls</dc:creator>
      <dc:date>2026-09-10T21:28:14Z</dc:date>
    </item>
    <item>
      <title>Ask vs. Act: Fabric Data Agents and Fabric Operations Agents Explained (with Industry Scenarios)</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Ask-vs-Act-Fabric-Data-Agents-and-Fabric-Operations-Agents/ba-p/5366083</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Feature status (September 2026):&lt;/STRONG&gt; Fabric data agents and operations agents are both generally available. Investigator insights in operations agents is still in preview. Always check Microsoft Learn for the latest.&lt;/P&gt;
&lt;H2&gt;The core difference in one line&lt;/H2&gt;
&lt;P&gt;A &lt;STRONG&gt;Fabric data agent&lt;/STRONG&gt; waits for a question and answers it from governed data. A &lt;STRONG&gt;Fabric operations agent&lt;/STRONG&gt; doesn't wait for anyone: it continuously watches live data against business goals and raises its hand, or triggers an action, when a condition is met.&lt;/P&gt;
&lt;P&gt;A simple mental model: the data agent is the expert analyst you can message at any time; the operations agent is the control-room operator who never goes off shift.&lt;/P&gt;
&lt;H2&gt;Fabric data agent: conversational analytics on governed data&lt;/H2&gt;
&lt;P&gt;The data agent is a configurable Fabric item that lets anyone ask plain-English questions about data in OneLake. Behind the scenes, it decides which source can answer the question, then generates and runs a read-only query: SQL for lakehouses and warehouses, DAX for Power BI semantic models, and KQL for KQL databases (including Eventhouse). It can also work with ontologies and Microsoft Graph.&lt;/P&gt;
&lt;P&gt;One data agent can combine up to five sources. Authors improve accuracy by selecting relevant tables, writing agent instructions in business language (for example, "route revenue questions to the Finance semantic model"), and adding example question-and-query pairs, up to 100 per source (examples aren't currently supported for semantic models).&lt;/P&gt;
&lt;P&gt;Security is where the data agent is deliberately conservative. Every query runs with the &lt;STRONG&gt;asking user's own credentials&lt;/STRONG&gt;, so row-level and column-level security still apply, and Microsoft Purview controls such as DLP and access restriction policies are respected. It never creates, updates, or deletes data, and it doesn't trigger notebooks or other workflows.&lt;/P&gt;
&lt;P&gt;Once published, the agent can be consumed well beyond Fabric: in Microsoft 365 Copilot, Teams, Azure AI Foundry, or as a tool inside Microsoft Copilot Studio agents, where the integration is now generally available through the Fabric IQ Data MCP tool.&lt;/P&gt;
&lt;P&gt;It's built for conversational insight, not bulk extraction: responses are capped at 25 rows and 25 columns, and unstructured files like PDFs aren't supported.&lt;/P&gt;
&lt;H2&gt;Fabric operations agent: autonomous monitoring with human-in-the-loop action&lt;/H2&gt;
&lt;P&gt;The operations agent lives in the &lt;STRONG&gt;Real-Time Intelligence&lt;/STRONG&gt; workload. Instead of answering ad-hoc questions, you give it business goals, instructions, a knowledge source (an Eventhouse KQL database or an ontology), and the actions it's allowed to recommend.&lt;/P&gt;
&lt;P&gt;From that configuration, the agent generates a &lt;STRONG&gt;playbook&lt;/STRONG&gt;: the business entities and properties it will track and the rules that define what "needs attention" looks like. You can build this manually or describe your intent to the built-in Copilot chat ("monitor the turbines and alert me when motor temperature gets too high") and refine the proposed rules iteratively. Each rule is backed by an inspectable query that the agent evaluates every five minutes, using either &lt;STRONG&gt;state conditions&lt;/STRONG&gt; (such as &lt;EM&gt;is above&lt;/EM&gt; 80, which keeps signaling while true) or &lt;STRONG&gt;transition conditions&lt;/STRONG&gt; (such as &lt;EM&gt;crosses above&lt;/EM&gt; 80, which signals only on the change).&lt;/P&gt;
&lt;P&gt;When a rule is met, the agent sends a Teams message, to a person or a channel, through the Fabric Operations Agent Teams app, summarizing what it saw and what it recommends. Beyond messaging, you can configure actions that run a Fabric notebook or trigger a Power Automate flow, which opens the door to ServiceNow tickets, SAP work orders, emails, or any other Power Automate connector. For anomalies, Investigator insights (preview) adds correlated patterns and a likely root-cause summary directly in Teams.&lt;/P&gt;
&lt;P&gt;Two governance details matter. First, each operations agent gets its own &lt;STRONG&gt;Microsoft Entra Agent ID&lt;/STRONG&gt;, so its activity is auditable separately from human users. Second, it runs in delegated mode with its &lt;STRONG&gt;creator's permissions&lt;/STRONG&gt;: when a recipient approves a recommendation, the action executes with the creator's access. Choose agent owners deliberately.&lt;/P&gt;
&lt;H2&gt;Side-by-side comparison&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Dimension&lt;/th&gt;&lt;th&gt;Fabric data agent&lt;/th&gt;&lt;th&gt;Fabric operations agent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Core purpose&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Answer questions about data&lt;/td&gt;&lt;td&gt;Monitor data and drive action&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Interaction model&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Pull: a user asks&lt;/td&gt;&lt;td&gt;Push: the agent notifies&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Trigger&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;A human prompt&lt;/td&gt;&lt;td&gt;A rule condition being met&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Data sources&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Lakehouse, warehouse, semantic model, KQL database, mirrored database, ontology, Microsoft Graph (up to 5)&lt;/td&gt;&lt;td&gt;Eventhouse KQL database or ontology&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Configuration&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Tables, instructions, example queries&lt;/td&gt;&lt;td&gt;Goals, instructions, playbook rules, actions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Natural-language answers, small tables, summaries&lt;/td&gt;&lt;td&gt;Teams alerts with recommendations, notebook runs, Power Automate flows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Write / action capability&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Strictly read-only&lt;/td&gt;&lt;td&gt;Executes approved actions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Identity&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Asking user's credentials (RLS/CLS enforced)&lt;/td&gt;&lt;td&gt;Entra Agent ID using creator's delegated permissions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Time orientation&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;"What happened, and why?"&lt;/td&gt;&lt;td&gt;"What's happening now, and what should we do?"&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Where users meet it&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Fabric, Teams, M365 Copilot, Copilot Studio, Foundry&lt;/td&gt;&lt;td&gt;Primarily Teams (alerts, approvals, investigations)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Industry scenarios&lt;/H2&gt;
&lt;H3&gt;1. Manufacturing: from vibration spike to work order&lt;/H3&gt;
&lt;P&gt;A discrete manufacturer streams CNC machine telemetry (spindle vibration, motor temperature, cycle time) through Eventstream into an Eventhouse.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Its goal is to minimize unplanned downtime. A rule watches for vibration crossing above tolerance on any machine. When it fires, the maintenance supervisors' Teams channel receives an alert with the machine, recent readings, and a recommendation to schedule an inspection. On approval, a Power Automate flow creates a work order in the maintenance system.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; Preparing for a quarterly review, the plant manager asks: &lt;EM&gt;"Which lines had the most unplanned downtime last quarter, and how did OEE compare to target?"&lt;/EM&gt; The agent queries the production lakehouse and OEE semantic model and returns a ranked answer, with no report-building required.&lt;/P&gt;
&lt;H3&gt;2. Retail and CPG: protecting a flash promotion&lt;/H3&gt;
&lt;P&gt;During a weekend promotion, point-of-sale and inventory events land in Eventhouse in near real time.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; It monitors store-level inventory for promoted SKUs and flags any item dropping below safety stock. The regional replenishment lead gets a Teams recommendation to trigger an emergency transfer from a nearby store or distribution center, executed through Power Automate after approval.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; On Monday, the category manager asks: &lt;EM&gt;"How did the promotion perform versus the same weekend last year, by region, and which stores ran out of stock?"&lt;/EM&gt; The agent blends the sales semantic model with lakehouse inventory history to answer in seconds.&lt;/P&gt;
&lt;H3&gt;3. Energy and utilities: pipeline pressure and grid load&lt;/H3&gt;
&lt;P&gt;An oil and gas operator ingests SCADA readings (pressure, flow rate, compressor status) from field assets; a utility does the same for substations.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Rules detect pressure exiting its normal operating range at a pumping station, or transformer load crossing a critical threshold during a heatwave. The control room is alerted with context and a recommended response, such as dispatching a field technician via a flow. Human approval stays in the loop. Note that operations agents complement, and never replace, certified safety instrumented systems.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; An asset integrity engineer asks: &lt;EM&gt;"Which ten assets had the most pressure excursions in the last 12 months, and when were they last serviced?"&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;4. Financial services: payment gateway degradation&lt;/H3&gt;
&lt;P&gt;A bank streams card authorization events by gateway, merchant category, and channel.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; Its goal is protecting payment success rates. When a gateway's decline rate crosses above its threshold, the payments operations team gets an alert with a breakdown and a recommendation to reroute traffic to a secondary processor, an action that runs only after an engineer approves it.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; A relationship manager asks: &lt;EM&gt;"Which of my corporate clients saw failed payments above 2% this month?"&lt;/EM&gt; Because the agent runs under the manager's own identity, row-level security ensures they only see their own portfolio.&lt;/P&gt;
&lt;H3&gt;5. Pharma logistics: cold-chain integrity&lt;/H3&gt;
&lt;P&gt;A logistics provider moving vaccines and biologics collects IoT temperature and GPS data from refrigerated containers.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Operations agent:&lt;/STRONG&gt; A transition rule fires the moment a shipment's temperature exits the 2–8°C range. The control tower is notified with location and excursion details, a notebook action flags the batch for quality review, and a flow alerts the receiving site.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data agent:&lt;/STRONG&gt; A quality lead asks: &lt;EM&gt;"Which lanes and carriers had the highest excursion rates this year?"&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;Better together: detect, decide, explain&lt;/H2&gt;
&lt;P&gt;The strongest architectures use both agents on the same data foundation. Picture an airport operations team. An operations agent watches baggage-system events in Eventhouse and alerts the duty manager when belt throughput drops below target during a peak arrival wave. The manager approves the recommended action: rerouting bags to an alternate belt via Power Automate.&lt;/P&gt;
&lt;P&gt;Then, without leaving Teams, the manager asks a Copilot Studio agent grounded by a Fabric data agent over the same Eventhouse and historical lakehouse: &lt;EM&gt;"How often has this belt degraded at this time of day over the past 90 days?"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The operations agent handles &lt;STRONG&gt;detection and response&lt;/STRONG&gt;. The data agent handles &lt;STRONG&gt;explanation and learning&lt;/STRONG&gt;. Because both point at the same governed data in OneLake, the alert and the analysis never disagree about the numbers.&lt;/P&gt;
&lt;H2&gt;How to choose&lt;/H2&gt;
&lt;P&gt;Choose a &lt;STRONG&gt;data agent&lt;/STRONG&gt; when the need is exploratory and question-driven: executive self-service, analyst acceleration, or bringing trusted data into Copilot experiences. Choose an &lt;STRONG&gt;operations agent&lt;/STRONG&gt; when you have a specific, repeatable business process with measurable conditions, where minutes matter and someone should be told (or something should happen) without anyone having to ask.&lt;/P&gt;
&lt;P&gt;A quick test: if you hear &lt;EM&gt;"someone should check this dashboard every hour,"&lt;/EM&gt; you need an operations agent. If you hear &lt;EM&gt;"I just need to know X before Friday's meeting,"&lt;/EM&gt; you need a data agent.&lt;/P&gt;
&lt;H2&gt;Practical tips before you build&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;For data agents:&lt;/STRONG&gt; curate tightly by selecting only the tables users need, write instructions in business terms, and invest in example queries, which are often the biggest accuracy lever. Use Git integration and deployment pipelines to promote agents from development to production.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For operations agents:&lt;/STRONG&gt; scope one agent to one business process, flatten nested JSON columns in Eventhouse tables before configuring, and review each rule's generated query before starting the agent. Remember that approvals execute with the creator's permissions, trial capacities aren't supported, and agents consume capacity units, so track them in the Fabric Capacity Metrics app.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For both:&lt;/STRONG&gt; confirm your tenant admin has enabled the required Copilot and Azure OpenAI settings, including cross-geo AI processing where your capacity region requires it.&lt;/P&gt;
&lt;H2&gt;Wrapping up&lt;/H2&gt;
&lt;P&gt;Fabric data agents and operations agents are two sides of the same coin. The data agent democratizes &lt;STRONG&gt;understanding&lt;/STRONG&gt;: anyone can ask a question and get a governed answer. The operations agent operationalizes &lt;STRONG&gt;response&lt;/STRONG&gt;: the business stops depending on people watching dashboards and starts reacting to events as they happen.&lt;/P&gt;
&lt;P&gt;Start with the scenario that hurts most today, build on a shared OneLake foundation, and grow from there.&lt;/P&gt;
&lt;P&gt;How are you using these agents in your industry? Share your scenarios in the comments!&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 21:26:37 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Ask-vs-Act-Fabric-Data-Agents-and-Fabric-Operations-Agents/ba-p/5366083</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-10T21:26:37Z</dc:date>
    </item>
    <item>
      <title>Lineage-aware AI with the Fabric item relations API (Preview)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Lineage-aware-AI-with-the-Fabric-item-relations-API-Preview/ba-p/5366064</link>
      <description>&lt;P&gt;With two new REST operations, you can retrieve the upstream and downstream relations of any Fabric item directly from your own code — the dependency graph behind the portal's lineage view, now available as a supported, programmable surface. Each response includes related items, the typed relation edges that connect them, and the workspaces those items belong to.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Lineage has always answered two human questions: “where does this data come from?” and “what breaks if I change it?” This API lets your tools — and your AI agents — ask those same questions programmatically.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;What’s new&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;Until now, item lineage in Fabric was something you explored visually in the portal. You opened an item, looked at its lineage view, and traced dependencies by eye.&amp;nbsp;That’s&amp;nbsp;great for people, but&amp;nbsp;it’s&amp;nbsp;difficult&amp;nbsp;to automate.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With this update, lineage becomes an API. After authenticating to Fabric, you can programmatically:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Get the&amp;nbsp;downstream&amp;nbsp;relations of an item — everything that depends on it (its consumers and impact radius).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Get the&amp;nbsp;upstream&amp;nbsp;relations of an item — everything it depends on (its sources).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Read the typed&amp;nbsp;relation&amp;nbsp;edges between items (for example,&amp;nbsp;Shortcut,&amp;nbsp;PushData,&amp;nbsp;Orchestration).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Resolve related items across workspaces, using the workspace list returned alongside the graph.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Feed lineage into impact analysis, documentation, data catalogs, CI/CD checks, and AI agents.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Why this matters&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;If you only work in the Fabric portal, the lineage view already serves you well. The impact of this update&amp;nbsp;shows up&amp;nbsp;once you need to automate or scale — when understanding dependencies becomes part of a workflow rather than a manual click-through. A few examples:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Before you&amp;nbsp;delete&amp;nbsp;or reroute a dataset, you call the&amp;nbsp;downstream&amp;nbsp;API to see every report, semantic model, and pipeline that would be affected.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You build an internal catalog or documentation site that shows each item’s sources and consumers, kept fresh automatically.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You add a CI/CD check that fails&amp;nbsp;a deployment&amp;nbsp;if a change would&amp;nbsp;break&amp;nbsp;a downstream dependency.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;You are an ISV building on Fabric, and you want lineage to be part of your product experience — not a side trip into the portal.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;That’s what a public API is for: turning a visual experience into a building block you can automate and compose.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Lineage is context for AI&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;AI agents are only as good as the context they are given. When an agent answers a question about a table, a report, or a metric, it benefits enormously from knowing where that data came from and what depends on it. Lineage is exactly that context.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With the relations API, an agent can traverse an item’s dependency graph as part of its reasoning. Ask&amp;nbsp;“is it safe to change this table?”&amp;nbsp;and the agent can call the downstream API,&amp;nbsp;enumerate&amp;nbsp;the affected items, and ground its answer in the real graph instead of guessing. Ask&amp;nbsp;“where does this number come from?”&amp;nbsp;and it can walk upstream to the source.&amp;nbsp;In other words, lineage helps ground AI responses in the actual dependency graph rather than inferred relationships.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is the same pattern we see across Fabric’s AI story: take governance metadata your organization already&amp;nbsp;maintains&amp;nbsp;— like&amp;nbsp;&lt;A href="https://learn.microsoft.com/fabric/fundamentals/apply-sensitivity-labels" target="_blank" rel="noopener"&gt;sensitivity labels&lt;/A&gt; — and share it with AI so agents understand your data the way your organization does. Lineage joins that toolkit. It gives agents&amp;nbsp;dependency awareness: the ability to reason&amp;nbsp;about&amp;nbsp;cause, effect, and blast radius, not just content.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;How it works&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;At&amp;nbsp;a high level, the API exposes both sides of the dependency graph: what an item depends on and what depends on it.&amp;nbsp;The API adds two&amp;nbsp;GET&amp;nbsp;operations under the platform surface. Because the&amp;nbsp;API&amp;nbsp;is in&amp;nbsp;preview, every call&amp;nbsp;currently requires&amp;nbsp;beta=true&amp;nbsp;as a query parameter.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/downstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/upstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The caller needs&amp;nbsp;read&amp;nbsp;permission on the item.&amp;nbsp;Both user and service principal identities are supported.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Each response is a small graph made of three lists:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;items — every item in the returned graph, including the item you queried, so each relation endpoint can be resolved (id, type, display name, and the workspace they belong to).&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;relations — the edges, each with a source item, the item it depends on, and a relation type.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;workspaces — the workspaces referenced by those items, so you can resolve names across workspace boundaries.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A downstream response for a semantic model consumed by a report looks like this:&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;{&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "items": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "3546052c-...", "type": "Report",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "displayName": "Q4 Sales Dashboard", "workspaceId": "cfafbeb1-..." },&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "9b218778-...", "type": "SemanticModel",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "displayName": "Sales Semantic Model", "workspaceId": "cfafbeb1-..." }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ],&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "relations": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "itemId": "3546052c-...",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "dependentOnItemId": "9b218778-...",&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "relationType": "Association" }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ],&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; "workspaces": [&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ "id": "cfafbeb1-...", "displayName": "Finance Analytics Workspace" }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ]&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The relation types describe&amp;nbsp;how&amp;nbsp;two items are connected. The set is extensible, so new types can be added over time:&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; height: 525px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 35px;"&gt;&lt;td style="height: 35px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Relation type&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 35px;"&gt;
&lt;P&gt;&lt;STRONG&gt;What it means&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 71px;"&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;Association&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;The item consumes the dependency item — for example, a report built on a semantic model.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;Shortcut&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;The item references data through a OneLake shortcut to another item.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 47px;"&gt;&lt;td style="height: 47px;"&gt;
&lt;P&gt;PushData&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 47px;"&gt;
&lt;P&gt;The item writes or pushes data into the dependency item.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;Orchestration&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;The item runs or manages execution of the dependency item (for example, a pipeline).&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 71px;"&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;Datasource&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 71px;"&gt;
&lt;P&gt;The item reads from the dependency item as a data source — for example, a notebook reading a&amp;nbsp;lakehouse.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;CascadeDelete&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;A parent–child relationship;&amp;nbsp;deleting&amp;nbsp;the parent&amp;nbsp;deletes&amp;nbsp;the dependent.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;WeakAssociation&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 59px;"&gt;
&lt;P&gt;A soft dependency that is removed if the dependent item is&amp;nbsp;deleted.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 65px;"&gt;&lt;td style="height: 65px;"&gt;
&lt;P&gt;HiddenInWorkspace&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 65px;"&gt;
&lt;P&gt;A dependency on an item that&amp;nbsp;isn't&amp;nbsp;surfaced in the workspace list, such as a staging artifact.&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 27.6367%" /&gt;&lt;col style="width: 72.3633%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Getting started&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;A great first step is to&amp;nbsp;pick&amp;nbsp;a familiar&amp;nbsp;item and&amp;nbsp;explore&amp;nbsp;its downstream relations to&amp;nbsp;understand&amp;nbsp;its impact radius.&amp;nbsp;The following&amp;nbsp;is the shape of a first call using the Azure CLI for authentication:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. Authenticate to Fabric and get a token.&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;$token =&amp;nbsp;az&amp;nbsp;account get-access-token&amp;nbsp;`&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; --resource "https://api.fabric.microsoft.com"&amp;nbsp;`&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; --query accessToken -o tsv&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;2. Call the downstream relations API for an item.&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /items/{itemId}/relations/downstream?beta=true&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Authorization: Bearer $token&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;3. Read the relations array to list what depends on the item, then walk upstream from any related item to trace it back to its sources.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;From there, wire the results into whatever needs dependency awareness — an impact-analysis check, a catalog page, or an AI agent’s context. You can find the operations in the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/" target="_blank" rel="noopener"&gt;Fabric REST API reference&lt;/A&gt; under the platform items surface:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/items/get-downstream-relations(beta)?tabs=HTTP" target="_blank" rel="noopener"&gt;Items - Get Downstream Relations (beta) - REST API (Core) | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/items/get-upstream-relations(beta)?tabs=HTTP" target="_blank" rel="noopener"&gt;Items - Get Upstream Relations (beta) - REST API (Core) | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Exposing item lineage as a programmable API is a foundational step. It turns the dependency graph into something your tools, pipelines, and agents can read and reason over.&amp;nbsp;We look forward to seeing what you build with it.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note: This API is in preview and provided for evaluation and development purposes. It may change based on feedback and is not recommended for production use.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 19:10:20 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Lineage-aware-AI-with-the-Fabric-item-relations-API-Preview/ba-p/5366064</guid>
      <dc:creator>yaronc</dc:creator>
      <dc:date>2026-09-10T19:10:20Z</dc:date>
    </item>
    <item>
      <title>Designing scalable Business Events in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Designing-scalable-Business-Events-in-Microsoft-Fabric/ba-p/5365863</link>
      <description>&lt;P&gt;Welcome to the seventh post in our Business Events, Fabric Events, and Azure Events series for Microsoft Fabric. This series takes you from foundational event-driven concepts to practical implementation patterns that help teams turn meaningful business moments into trusted signals, decisions, and actions across Fabric.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 19:40:36 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Designing-scalable-Business-Events-in-Microsoft-Fabric/ba-p/5365863</guid>
      <dc:creator>robece-msft</dc:creator>
      <dc:date>2026-09-10T19:40:36Z</dc:date>
    </item>
    <item>
      <title>Accelerate JSON workloads with the Native Execution Engine in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Accelerate-JSON-workloads-with-the-Native-Execution-Engine-in/ba-p/5364366</link>
      <description>&lt;P&gt;JSON is one of the most common formats in modern data platforms. It carries application events, API payloads, operational telemetry, configuration data, and the metadata that coordinates data-driven processes. For many organizations, JSON is not an edge case. It is part of the critical path from ingestion through transformation and analytics.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The update of&amp;nbsp;JSON support in the Microsoft Fabric Spark Native Execution Engine, now in&amp;nbsp;preview,&amp;nbsp;expands native acceleration to an important class of semi-structured workloads. Spark can now read and process JSON data through the Native Execution Engine's vectorized C++ path, helping more of the query remain columnar from the source through downstream transformations.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Why JSON performance matters&amp;nbsp;&lt;/H4&gt;&lt;P&gt;Analytics systems increasingly combine structured tables with semi-structured data. A pipeline might ingest JSON events from an application, use JSON control files to&amp;nbsp;determine&amp;nbsp;which tables to process, enrich the records with&amp;nbsp;lakehouse&amp;nbsp;data, and write curated Delta tables for reporting. JSON also appears behind the scenes in transaction metadata and other dependencies around Delta&amp;nbsp;Lake&amp;nbsp;processing.&amp;nbsp;&lt;/P&gt;&lt;P&gt;These patterns make JSON parsing more than a file-read operation. It can influence the startup time, throughput, and end-to-end efficiency of an entire job. When a pipeline runs&amp;nbsp;frequently&amp;nbsp;or processes many files, even small costs in parsing and data conversion can accumulate across stages and workloads.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Common customer scenarios include:&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Ingesting application, device, web, and service telemetry.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Processing nested records from APIs and partner data exchanges.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Driving reusable pipelines with JSON configuration and control files.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Reading schema, manifest, and metadata files during orchestration.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;Transforming semi-structured landing data into governed Delta tables.&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;H4&gt;How JSON fits into a&amp;nbsp;lakehouse&amp;nbsp;flow&amp;nbsp;&lt;/H4&gt;&lt;P&gt;A common&amp;nbsp;lakehouse&amp;nbsp;pattern begins with JSON arriving in the Files area of a&amp;nbsp;lakehouse, through a&amp;nbsp;OneLake&amp;nbsp;shortcut, or from an upstream ingestion process. The records might&amp;nbsp;represent&amp;nbsp;customer activity, application operations, device measurements, or partner transactions. A Fabric notebook reads those files,&amp;nbsp;applies&amp;nbsp;a schema, selects the fields needed by the business, and prepares the data for&amp;nbsp;additional&amp;nbsp;processing.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The same job can then filter invalid or irrelevant events, flatten nested structures, derive business attributes, and combine the JSON records with trusted reference data. Aggregations create useful metrics, while the curated result is stored in Delta tables for downstream notebooks, pipelines, the SQL analytics endpoint, and Power BI. The JSON read is the entry point to this larger analytical flow, so accelerating it helps the job begin productive columnar processing sooner.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Metadata-driven frameworks amplify this effect. A reusable pipeline may read many small JSON documents that describe source locations, schemas, validation rules, transformation steps, and destinations. Those reads happen across multiple tables and recurring schedules.&amp;nbsp;Keeping JSON parsing in the native path helps reduce repeated execution overhead and supports a more efficient foundation for standardized data engineering.&amp;nbsp;&lt;/P&gt;&lt;P&gt;This matters because customers evaluate performance at the job and pipeline level, not only at an individual operator. A faster source reader is most valuable when its output can continue through filters, projections, joins, and aggregations without unnecessary transitions between execution models.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Keeping JSON processing in the native path&amp;nbsp;&lt;/H4&gt;&lt;P&gt;The Native Execution Engine accelerates supported Spark operations by offloading them from the JVM-based execution path to a vectorized native engine built on Velox and Apache Gluten (incubating). Columnar processing allows the engine to&amp;nbsp;operate&amp;nbsp;on batches of values instead of repeatedly materializing individual row objects. This design improves data locality, enables efficient use of modern processors, and reduces overhead across many analytical operations.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Before native JSON support, a query that&amp;nbsp;encountered&amp;nbsp;a JSON source used the Spark JVM path for JSON reading and parsing. Even when filters, projections, aggregations, or joins later in the plan were eligible for native acceleration, the data first passed through row-oriented processing and then transitioned into a representation suitable for the accelerated path. Those handoffs reduced the amount of work that could&amp;nbsp;benefit&amp;nbsp;from continuous columnar execution.&amp;nbsp;&lt;/P&gt;&lt;P&gt;With this preview, JSON reading and parsing can run in the Velox-based native layer. Parsed values are produced as columnar batches that can flow directly into eligible native operators. By avoiding an early return to row-based JVM processing, Fabric Spark can reduce execution-path transitions and apply native acceleration across a larger&amp;nbsp;portion&amp;nbsp;of the job.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;What this means for your workloads&amp;nbsp;&lt;/H4&gt;&lt;P&gt;The most important benefit is broader end-to-end acceleration. Customers can continue to use familiar Spark&amp;nbsp;DataFrame&amp;nbsp;and SQL patterns while the engine handles the execution-path improvements. There is no new JSON-specific programming model to&amp;nbsp;learn&amp;nbsp;and no need to rewrite existing transformations simply to access the native reader.&amp;nbsp;&lt;/P&gt;&lt;P&gt;For ingestion workloads, native JSON processing can help increase throughput before data is standardized into Delta tables. For metadata-driven pipelines, faster reads of configuration and control data can reduce overhead that appears repeatedly across orchestrated jobs. For analytical workloads that query JSON directly, filters and projections can begin from a native columnar source rather than waiting for a JVM-based parsing stage.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The result is a more consistent performance model across common&amp;nbsp;lakehouse&amp;nbsp;formats. Teams can design pipelines around business requirements and data characteristics while Fabric expands the set of operations that&amp;nbsp;remain&amp;nbsp;on the accelerated path.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Use the Spark APIs you already know&amp;nbsp;&lt;/P&gt;&lt;P&gt;Existing notebook code can continue to read JSON with standard Spark APIs. For example, a pipeline can load event data, select the fields needed for analysis, filter the records, and aggregate the results with the same&amp;nbsp;DataFrame&amp;nbsp;operations used today:&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;events = spark.read.json("Files/events/")  daily_activity = (      events.filter("eventType IS NOT NULL")            .groupBy("eventDate", "eventType")            .count()  ) &lt;/LI-CODE&gt;&lt;P&gt;When the plan uses supported operations, Fabric can execute the JSON&amp;nbsp;read&amp;nbsp;and downstream processing in the native columnar path. The optimization is delivered by the platform, so developers can focus on data quality, business logic, and the outputs their users need.&amp;nbsp;&lt;/P&gt;&lt;H4&gt;Build faster semi-structured data pipelines&amp;nbsp;&lt;/H4&gt;&lt;P&gt;JSON support is another step in expanding the performance coverage of the Native Execution Engine across real customer workloads. It brings acceleration closer to the point where semi-structured data enters the&amp;nbsp;lakehouse&amp;nbsp;and helps preserve columnar execution as that data is filtered, transformed, joined, and aggregated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;To learn how the engine works and how to use it with Fabric Spark, see&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/native-execution-engine-overview" target="_blank" rel="noopener"&gt;Native execution engine for Fabric Data Engineering&lt;/A&gt;. You can also review&amp;nbsp;&lt;A href="https://learn.microsoft.com/fabric/data-engineering/runtime" target="_blank" rel="noopener"&gt;Apache Spark runtime in Fabric&lt;/A&gt;&amp;nbsp;and&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/lakehouse-and-delta-tables" target="_blank" rel="noopener"&gt;Lakehouse and Delta Tables&lt;/A&gt;&amp;nbsp;for more information about the broader Fabric data engineering platform.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Get started by running a representative JSON workload in a Fabric notebook and comparing the end-to-end job experience.&amp;nbsp;Review&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-engineering/how-to-use-notebook" target="_blank" rel="noopener"&gt;How to use notebooks&lt;/A&gt;&amp;nbsp;for guidance&amp;nbsp;and share your experience through the&amp;nbsp;&lt;A href="https://community.fabric.microsoft.com/" target="_blank" rel="noopener"&gt;Microsoft Fabric Community&lt;/A&gt;. Your feedback helps us prioritize the next areas of acceleration.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Accelerate-JSON-workloads-with-the-Native-Execution-Engine-in/ba-p/5364366</guid>
      <dc:creator>Santhosh_Ravin1</dc:creator>
      <dc:date>2026-09-10T17:00:00Z</dc:date>
    </item>
    <item>
      <title>Power BI Q&amp;A retirement reminder: February 2027 timeline update</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/Power-BI-Q-A-retirement-reminder-February-2027-timeline-update/ba-p/5365841</link>
      <description>&lt;P&gt;In December, we &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://community.fabric.microsoft.com/blog/fbc_pbiupdatesblog/deprecating-power-bi-qa/5173970" target="_blank" rel="noopener" data-lia-auto-title="announced the retirement of Power BI Q&amp;amp;A" data-lia-auto-title-active="0"&gt;announced the retirement of Power BI Q&amp;amp;A&lt;/A&gt;, our legacy natural-language querying experience, with retirement planned for December 2026. To give current Q&amp;amp;A user's additional time to assess their dependencies and transition to newer Copilot-powered solutions, we’re extending the retirement date to February 2027. This post recaps the affected experiences and provides updates on Copilot capacity availability, embedded scenarios, and sovereign clouds.&lt;/P&gt;
&lt;H2&gt;Recap of the January announcement&lt;/H2&gt;
&lt;H3&gt;What is being deprecated?&lt;/H3&gt;
&lt;P&gt;The retirement applies to both the end-user Q&amp;amp;A experiences, and the associated Q&amp;amp;A configuration tools.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="2" style="width: 100%; height: 268px; border-width: 2px;"&gt;&lt;tbody&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Retiring experience&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Recommended alternative&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/end-user-q-and-a" target="_blank"&gt;Q&amp;amp;A in reports&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-reports-overview" target="_blank"&gt;Copilot with Power BI reports&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 36px;"&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/end-user-q-and-a" target="_blank"&gt;Q&amp;amp;A on a dashboard&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 36px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-chat-with-data-standalone" target="_blank"&gt;Copilot standalone experience&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 60px;"&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/mobile/tutorial-mobile-apps-ios-qna" target="_blank"&gt;Q&amp;amp;A virtual analyst in mobile app&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/consumer/mobile/mobile-apps-copilot" target="_blank"&gt;Copilot in Power BI Mobile&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 60px;"&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/developer/embedded/qanda" target="_blank"&gt;Q&amp;amp;A in Power BI embedded analytics&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 60px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://powerbi.microsoft.com/blog/now-available-two-new-copilot-experiences/" target="_blank"&gt;Copilot for SaaS scenarios&lt;/A&gt;. For embedded PaaS scenarios, refer to the updates later in this post.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 40px;"&gt;&lt;td style="height: 40px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/natural-language/q-and-a-tooling-intro" target="_blank"&gt;Q&amp;amp;A Setup&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td style="height: 40px; border-width: 2px;"&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-prepare-data-ai" target="_blank"&gt;Prep Data for AI&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;What happens at retirement?&lt;/H3&gt;
&lt;P&gt;Beginning in February 2027, Q&amp;amp;A will no longer work in Power BI. The Q&amp;amp;A visual will be removed, and existing reports that contain Q&amp;amp;A visuals will display an error in place of the visual.&lt;/P&gt;
&lt;H2&gt;Updates since December&lt;/H2&gt;
&lt;H3&gt;Copilot availability across capacities&lt;/H3&gt;
&lt;P&gt;One of the most common questions following the December announcement was how customers relying primarily on Power BI Pro licenses could adopt Copilot capabilities after the retirement of Q&amp;amp;A.&lt;/P&gt;
&lt;P&gt;Copilot is now available across all Fabric capacities starting at &lt;STRONG&gt;F2&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;In addition, &lt;A class="lia-external-url" href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Updates-to-Fabric-Copilot-Capacity/ba-p/5172772" target="_blank"&gt;Fabric Copilot Capacity (FCC)&lt;/A&gt;, which was initially limited to &lt;STRONG&gt;P1/F64 and above&lt;/STRONG&gt;, can now be created on &lt;STRONG&gt;F2 and higher capacities&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;FCC is an optional way to centralize Copilot usage for assigned users, including Pro and PPU workspaces, on one capacity. &lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-introduction" target="_blank"&gt;Review the current Copilot requirements.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This change makes Copilot available on smaller Fabric capacities, giving organizations that previously relied on Power BI Pro licenses another path to evaluate Copilot without moving immediately to a larger Premium or Fabric capacity.&lt;/P&gt;
&lt;H3&gt;Embedded (PaaS) Q&amp;amp;A scenarios&lt;/H3&gt;
&lt;P&gt;Another common question following the December announcement was whether Copilot would provide a direct replacement for Q&amp;amp;A in embedded (PaaS) scenarios.&lt;/P&gt;
&lt;P&gt;There are currently no plans to provide a Copilot replacement for embedded Q&amp;amp;A PaaS scenarios.&lt;/P&gt;
&lt;P&gt;Organizations using embedded Q&amp;amp;A should begin evaluating migration paths and alternative analytical experiences well before the February 2027 retirement date. Although these options are not direct replacements for embedded Q&amp;amp;A, customers can consider:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://powerbi.microsoft.com/blog/now-available-two-new-copilot-experiences/" target="_blank"&gt;Copilot for SaaS scenarios&lt;/A&gt;, for organizations that can transition from an embedded PaaS architecture to a supported SaaS experience.&lt;/LI&gt;
&lt;LI&gt;Narrative visual and smart narrative summaries&lt;/LI&gt;
&lt;LI&gt;Fabric IQ MCP Server&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Customers with embedded analytics solutions should review their current Q&amp;amp;A integrations and plan migration paths before retirement.&lt;/P&gt;
&lt;H3&gt;Copilot in sovereign clouds&lt;/H3&gt;
&lt;P&gt;Customers operating in sovereign cloud environments have also asked about Copilot availability following the retirement of Q&amp;amp;A.&lt;/P&gt;
&lt;P&gt;Copilot does not yet support sovereign clouds due to GPU availability. Organizations using Q&amp;amp;A in sovereign clouds should review their dependencies and contact their Microsoft account representative or support team to discuss migration options.&lt;/P&gt;
&lt;H2&gt;Recommended next steps&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;To prepare for the retirement of Q&amp;amp;A:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Inventory existing Q&amp;amp;A dependencies, including reports, dashboards, mobile experiences, embedded solutions, and Q&amp;amp;A Setup artifacts.&lt;/LI&gt;
&lt;LI&gt;Identify the appropriate migration path for each dependency, using Copilot-powered experiences where they are available and meet your requirements.&lt;/LI&gt;
&lt;LI&gt;Review embedded Q&amp;amp;A implementations and evaluate supported SaaS patterns or other analytical experiences.&lt;/LI&gt;
&lt;LI&gt;Confirm Copilot availability in your region, particularly for sovereign cloud deployments, before selecting an alternative.&lt;/LI&gt;
&lt;LI&gt;Plan, test, and communicate changes before Q&amp;amp;A reaches full retirement in February 2027.&lt;/LI&gt;
&lt;LI&gt;Starting these activities early will help ensure a smooth transition before Q&amp;amp;A reaches full retirement in February 2027.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The extension to February 2027 provides additional time to assess existing Q&amp;amp;A dependencies and evaluate replacement experiences. We encourage customers to begin planning their transition now, &lt;A href="https://learn.microsoft.com/power-bi/create-reports/copilot-introduction" target="_blank"&gt;review Copilot availability and requirements&lt;/A&gt;, and test alternative experiences well before retirement. Taking these steps early can help ensure a smooth transition when Q&amp;amp;A reaches end of support in February 2027.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 16:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/Power-BI-Q-A-retirement-reminder-February-2027-timeline-update/ba-p/5365841</guid>
      <dc:creator>mohammadali</dc:creator>
      <dc:date>2026-09-10T16:00:00Z</dc:date>
    </item>
    <item>
      <title>Reassigning a Workspace in the Microsoft Fabric Admin Portal</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Engineering-Community-Blog/Reassigning-a-Workspace-in-the-Microsoft-Fabric-Admin-Portal/ba-p/5365868</link>
      <description>&lt;H1&gt;Reassigning a Workspace in the Microsoft Fabric Admin Portal&lt;/H1&gt;&lt;P&gt;When working with Microsoft Fabric, workspaces are an important part of organising and managing analytics content. A workspace can contain items such as Lakehouses, Warehouses, Notebooks, Data Pipelines, semantic models, and Power BI reports.&lt;/P&gt;&lt;P&gt;Depending on how a workspace is configured, it can be assigned to different types of capacity. There may be situations where a workspace that was originally running on a Power BI Pro shared environment needs to be moved to a Microsoft Fabric Capacity.&lt;/P&gt;&lt;P&gt;In this article, I'll show how to reassign a workspace to a Fabric Capacity using the &lt;STRONG&gt;Microsoft Fabric Admin Portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;For this demonstration, I have a workspace named &lt;STRONG&gt;task wk&lt;/STRONG&gt;, which is currently assigned to the &lt;STRONG&gt;Power BI Pro&lt;/STRONG&gt; workspace type.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Current Workspace Configuration&lt;/H2&gt;&lt;P&gt;I have already created the following workspace:&lt;/P&gt;&lt;P&gt;Workspace Name: &lt;STRONG&gt;task wk &lt;/STRONG&gt;Workspace Type: Power BI Pro&lt;/P&gt;&lt;P&gt;At the moment, &lt;STRONG&gt;task wk &lt;/STRONG&gt;is not assigned to my Fabric Capacity.&lt;/P&gt;&lt;P&gt;The objective is to move this same workspace from its current Power BI Pro setup and assign it to a Fabric Capacity.&lt;/P&gt;&lt;P&gt;Rather than creating a new workspace, I can simply reassign the existing workspace.&lt;/P&gt;&lt;H2&gt;Open the Fabric Admin Portal&lt;/H2&gt;&lt;P&gt;The first step is to open the &lt;STRONG&gt;Microsoft Fabric Admin Portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;From the Fabric interface, open the settings menu and select &lt;STRONG&gt;Admin portal&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;The Admin Portal provides administrators with tenant-level management capabilities, including the ability to manage workspaces and their capacity assignments.&lt;/P&gt;&lt;P&gt;For this task, I need to work with the &lt;STRONG&gt;Workspaces&lt;/STRONG&gt; section.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Go to the Workspaces Tab&lt;/H2&gt;&lt;P&gt;Inside the Fabric Admin Portal, select &lt;STRONG&gt;Workspaces&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;This section provides a view of the workspaces available within the Fabric tenant.&lt;/P&gt;&lt;P&gt;I can search for my workspace by name rather than scrolling through the entire list.&lt;/P&gt;&lt;P&gt;In my case, I'm looking for:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;task wk&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Once I locate the workspace, I can see its current configuration.&lt;/P&gt;&lt;P&gt;The workspace is currently associated with the &lt;STRONG&gt;Power BI Pro&lt;/STRONG&gt; workspace type.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Select Reassign Workspace&lt;/H2&gt;&lt;P&gt;To change the capacity assignment, I select the &lt;STRONG&gt;ellipsis (...)&lt;/STRONG&gt; next to &lt;STRONG&gt;task wk&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;This opens a menu containing actions that can be performed on the workspace.&lt;/P&gt;&lt;P&gt;From the menu, I select:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Reassign workspace&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;This is the option I need to change the workspace's capacity assignment.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Select the Fabric Capacity&lt;/H2&gt;&lt;P&gt;After selecting &lt;STRONG&gt;Reassign workspace&lt;/STRONG&gt;, Fabric presents the available capacity options.&lt;/P&gt;&lt;P&gt;From here, I select the &lt;STRONG&gt;Fabric Capacity&lt;/STRONG&gt; that I want to assign to the workspace.&lt;/P&gt;&lt;P&gt;The important thing is to make sure I select the correct capacity, particularly if the organisation has multiple Fabric capacities.&lt;/P&gt;&lt;P&gt;Once the appropriate Fabric Capacity has been selected, I confirm the reassignment.&lt;/P&gt;&lt;P&gt;Fabric then updates the workspace's capacity assignment.&lt;/P&gt;&lt;img /&gt;&lt;H2&gt;Verifying the Workspace&lt;/H2&gt;&lt;P&gt;After completing the reassignment, I can return to the &lt;STRONG&gt;Workspaces&lt;/STRONG&gt; section in the Admin Portal and check &lt;STRONG&gt;task wk&lt;/STRONG&gt; again.&lt;/P&gt;&lt;img /&gt;&lt;P&gt;The workspace should now show that it is assigned to the selected &lt;STRONG&gt;Fabric Capacity&lt;/STRONG&gt; rather than its previous Power BI Pro setup.&lt;/P&gt;&lt;img /&gt;&lt;P&gt;The workspace itself has not been recreated. The existing workspace and its contents remain in place; what has changed is the capacity to which the workspace is assigned.&lt;/P&gt;&lt;P&gt;This is useful because I don't need to migrate all the workspace items into a new workspace simply because I want to change the capacity.&lt;/P&gt;&lt;H2&gt;Why Reassign a Workspace?&lt;/H2&gt;&lt;P&gt;There are several reasons why an organisation might want to reassign a workspace to Fabric Capacity.&lt;/P&gt;&lt;P&gt;One common reason is to make Fabric capabilities available to the workspace.&lt;/P&gt;&lt;P&gt;For example, an organisation may start with a traditional Power BI workspace and later adopt Microsoft Fabric. Moving the workspace to an appropriate Fabric Capacity can be part of that transition.&lt;/P&gt;&lt;P&gt;Capacity assignment can also be useful when an organisation wants to manage workloads using dedicated capacity rather than relying on shared capacity.&lt;/P&gt;&lt;H2&gt;A Simple Before and After&lt;/H2&gt;&lt;P&gt;In this example, the change can be summarised as:&lt;/P&gt;&lt;P&gt;Before &lt;STRONG&gt;task wk --&amp;gt;&lt;/STRONG&gt;&amp;nbsp;Power BI Pro&lt;/P&gt;&lt;P&gt;After the reassignment:&lt;/P&gt;&lt;P&gt;After &lt;STRONG&gt;task wk --&amp;gt;&lt;/STRONG&gt;&amp;nbsp;Fabric Capacity&lt;/P&gt;&lt;P&gt;The workspace name remains the same, and I don't have to create another workspace just to make the change.&lt;/P&gt;&lt;H2&gt;Things to Consider&lt;/H2&gt;&lt;P&gt;Before reassigning a workspace, it is worth checking that you have the appropriate administrative permissions and that the target Fabric Capacity is available.&lt;/P&gt;&lt;P&gt;It is also important to understand the implications of moving a workspace between capacity types, especially in an organisation where capacity usage, governance, and licensing are carefully managed.&lt;/P&gt;&lt;P&gt;The exact options available in the Admin Portal can also depend on the tenant configuration and the permissions of the administrator.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 13:38:41 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Engineering-Community-Blog/Reassigning-a-Workspace-in-the-Microsoft-Fabric-Admin-Portal/ba-p/5365868</guid>
      <dc:creator>abiola_david</dc:creator>
      <dc:date>2026-09-10T13:38:41Z</dc:date>
    </item>
    <item>
      <title>One button, fifty rows: bulk write-back from Power BI to Fabric SQL using a UDF | Part-1</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364353</link>
      <description>&lt;P&gt;Most writeback examples you'll find handle one record at a time. This one takes whatever the user has selected in the slicer — one hotel or fifty — passes the whole selection to a User Data Function as a single call, and writes it all in one transaction.&lt;/P&gt;
&lt;P&gt;Every reporting team eventually gets the same request. Someone looks at a table in a Power BI report, spots a value that is wrong, and asks why they have to email the data team to fix it. In our case it was hotel code setup: mapping each hotel's code types to a Major Group and a Minor Group. The mappings changed often enough to be annoying and rarely enough that nobody wanted to build a whole application for it.&lt;/P&gt;
&lt;P&gt;Translytical task flows finally made this practical. This post walks through the setup I actually built and shipped.&lt;/P&gt;
&lt;P&gt;The stack is Fabric SQL database → User Data Function → a button in a Power BI report.&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;H2&gt;What it needed to do&lt;/H2&gt;
&lt;P&gt;Three requirements shaped everything else.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Edit one hotel or fifty in a single click.&lt;/STRONG&gt; Code type mappings are usually rolled out across a brand or a region, not one property at a time. If the user has to click through hotels one by one, they will go back to emailing spreadsheets.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Record who changed what, at column level.&lt;/STRONG&gt; "Someone changed the Major Group last month" is not an audit trail. I wanted old value, new value, the person's actual name, and a timestamp, for each column that moved.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Fail loudly and readably.&lt;/STRONG&gt; The people using this are finance and operations users, not developers. An error has to tell them what to do next, not surface a SQL exception.&lt;/P&gt;
&lt;H2&gt;1. The SQL database&lt;/H2&gt;
&lt;P&gt;Everything starts with the schema. The full script is at the bottom of this post, but three decisions in it are worth explaining because they are the ones that determine whether bulk editing works at all.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;The primary key&lt;/H3&gt;
&lt;P&gt;The original table used CodeType as the primary key. That works fine for one hotel and falls apart immediately for many, because five hotels sharing the code type FBFOOD need five separate rows.&lt;/P&gt;
&lt;P&gt;So the table gets a surrogate identity column as the PK, and the real business rule moves into a unique constraint:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CONSTRAINT PK_HotelCodeSetup PRIMARY KEY CLUSTERED (HotelCodeSetupId), CONSTRAINT UQ_HotelCodeSetup_Hotel_Code UNIQUE (HotelCode, CodeType)&lt;/LI-CODE&gt;
&lt;P&gt;The unique constraint is what actually stops duplicates. The surrogate ID exists so the audit table has something stable to point at.&lt;/P&gt;
&lt;H3&gt;The audit table stores one row per changed column&lt;/H3&gt;
&lt;P&gt;Not one row per changed record. If a user updates Major Group and leaves Minor Group alone, I want exactly one audit row, saying which column moved and from what to what.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CREATE TABLE audit.HotelCodeSetupAudit ( AuditId BIGINT IDENTITY(1,1) NOT NULL, BatchId UNIQUEIDENTIFIER NOT NULL, InvocationId VARCHAR(100) NULL, HotelCodeSetupId INT NULL, HotelCode VARCHAR(10) NOT NULL, CodeType VARCHAR(20) NOT NULL, ActionType VARCHAR(10) NOT NULL, ColumnName VARCHAR(50) NOT NULL, OldValue NVARCHAR(200) NULL, NewValue NVARCHAR(200) NULL, ChangedBy NVARCHAR(200) NOT NULL, ChangedByOid VARCHAR(50) NULL, ChangedDateUtc DATETIME2(3) NOT NULL, SourceApplication VARCHAR(50) NULL );&lt;/LI-CODE&gt;
&lt;P&gt;BatchId is the piece that makes this usable. One button click produces one BatchId, however many hotels it touched. That gives you a natural unit for "show me everything that click did", and later, for rollback.&lt;/P&gt;
&lt;H3&gt;Why the audit is not a trigger&lt;/H3&gt;
&lt;P&gt;This is the one I would have got wrong if I hadn't tested it as a second user.&lt;/P&gt;
&lt;P&gt;A trigger runs under the identity of the database connection. In this architecture that connection belongs to the User Data Function, so every single change would be attributed to the same account. The audit would be technically complete and practically worthless.&lt;/P&gt;
&lt;P&gt;The user identity has to come from the function's call context and be passed in as a parameter, which means the audit writes have to happen inside the stored procedure, in the same transaction as the change itself.&lt;/P&gt;
&lt;H3&gt;The upsert&lt;/H3&gt;
&lt;P&gt;MERGE handles single and multi-hotel through one code path. The hotel list arrives as a comma-delimited string and gets split into a table variable, so one hotel is just a list of length one and there is no separate branch to maintain.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;MERGE dbo.HotelCodeSetup WITH (HOLDLOCK) AS tgt USING (SELECT HotelCode FROM @Hotels) AS src ON tgt.HotelCode = src.HotelCode AND tgt.CodeType = @CodeType WHEN MATCHED AND ( ISNULL(tgt.MajorGroup, '') &amp;lt;&amp;gt; ISNULL(COALESCE(@MajorGroup, tgt.MajorGroup), '') OR ISNULL(tgt.MinorGroup, '') &amp;lt;&amp;gt; ISNULL(COALESCE(@MinorGroup, tgt.MinorGroup), '') OR tgt.IsActive = 0 ) THEN UPDATE SET&lt;/LI-CODE&gt;
&lt;P&gt;Two details in there that matter more than they look:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;COALESCE(@MajorGroup, tgt.MajorGroup)&lt;/SPAN&gt; is how "leave this column alone" works. A blank text slicer becomes &lt;SPAN class="lia-text-color-13"&gt;NULL&lt;/SPAN&gt;, and &lt;SPAN class="lia-text-color-13"&gt;NULL&lt;/SPAN&gt; means keep the existing value rather than wipe it. Without this, a user who only wants to change Minor Group would silently blank out Major Group.&lt;/P&gt;
&lt;P&gt;The &lt;SPAN class="lia-text-color-13"&gt;WHEN MATCHED AND (...)&lt;/SPAN&gt; guard means rows that already hold the target values are not touched at all. No pointless &lt;SPAN class="lia-text-color-13"&gt;ModifiedDateUtc&lt;/SPAN&gt; churn, and no audit noise.&lt;/P&gt;
&lt;P&gt;The &lt;SPAN class="lia-text-color-13"&gt;OUTPUT&lt;/SPAN&gt; clause writes &lt;SPAN class="lia-text-color-13"&gt;$action&lt;/SPAN&gt; plus old and new values into a table variable, which then gets unpivoted with &lt;SPAN class="lia-text-color-13"&gt;CROSS APPLY&lt;/SPAN&gt; into the column-level audit rows. That unpivot is where the "skip columns that didn't change" filter lives.&lt;/P&gt;
&lt;P&gt;Deletes are soft. &lt;SPAN class="lia-text-color-13"&gt;usp_DeactivateHotelCodes&lt;/SPAN&gt; sets &lt;SPAN class="lia-text-color-13"&gt;IsActive = 0&lt;/SPAN&gt; and audits it, so the audit trail always resolves to a row that still exists.&lt;/P&gt;
&lt;H3&gt;Run the smoke tests before Power BI is anywhere near this&lt;/H3&gt;
&lt;P&gt;The bottom of the script has direct EXEC calls for both single and multi-hotel. Run them. If the procedure works in the query editor, then every problem you hit later is a Power BI or UDF problem, and you have halved your search space.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;EXEC dbo.usp_UpsertHotelCodeGroups @HotelCodes = 'HTL001,HTL002,HTL003', @CodeType = 'RMREV', @MajorGroup = 'Rooms Division', @MinorGroup = NULL, @ChangedBy = 'test.user@contoso.com';&lt;/LI-CODE&gt;&lt;img /&gt;
&lt;H2&gt;2. The User Data Function&lt;/H2&gt;
&lt;P&gt;Create a &lt;STRONG&gt;User Data Functions&lt;/STRONG&gt; item in the same workspace. Under &lt;STRONG&gt;Manage connections&lt;/STRONG&gt;, add the SQL database, and note the alias Fabric generates. That alias goes into the decorator.&lt;/P&gt;
&lt;img /&gt;&lt;LI-CODE lang="python"&gt;import fabric.functions as fn udf = fn.UserDataFunctions() @udf.connection(argName="writebackDb", alias="Writeback") @udf.context(argName="callContext") @udf.function() def apply_hotel_code_groups( writebackDb: fn.FabricSqlConnection, callContext: fn.UserDataFunctionContext, hotelCodes: str, codeType: str, majorGroup: str = "", minorGroup: str = "", ) -&amp;gt; str:&lt;/LI-CODE&gt;
&lt;P&gt;Three platform rules that are not optional:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Parameter names must be camelCase. No underscores. hotel_codes will not work.&lt;/LI&gt;
&lt;LI&gt;The function must return str if you want it to show up in the Power BI button picker. A function returning a dict simply won't appear in the list, with no explanation.&lt;/LI&gt;
&lt;LI&gt;import fabric.functions as fn and the udf = fn.UserDataFunctions() line are both required.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If the editor complains about the stacked @udf.connection and @udf.context decorators, swap their order. Both sit above @udf.function().&lt;/P&gt;
&lt;H3&gt;Getting the real user&lt;/H3&gt;
&lt;LI-CODE lang="python"&gt;def _identity(callContext) -&amp;gt; tuple: try: user = callContext.executing_user or {} return (user.get("PreferredUsername") or "unknown", user.get("Oid")) except Exception: return ("unknown", None)&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-13"&gt;PreferredUsername&lt;/SPAN&gt; is the readable one for the report. Oid is the Entra object ID, which is immutable and survives people changing their name or email. Store both.&lt;/P&gt;
&lt;H3&gt;Validation lives in Python&lt;/H3&gt;
&lt;P&gt;The stored procedure validates too, as a backstop, but the messages users actually see come from UserThrownError:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;if not codes: raise fn.UserThrownError( "No hotel selected. Use the hotel slicer to pick one or more hotels first.", {"hotelCodes": hotelCodes}, ) if len(codes) &amp;gt; MAX_HOTELS_PER_CALL: raise fn.UserThrownError( f"{len(codes)} hotels selected, which is over the {MAX_HOTELS_PER_CALL} limit. " "Narrow the selection and apply in smaller batches.", {"selectedCount": len(codes)}, )&lt;/LI-CODE&gt;
&lt;P&gt;MAX_HOTELS_PER_CALL is set to 250. This is a guard rail, not a performance tuning knob. Power BI hands the function whatever the slicer selection contains, and large payloads run into UDF request size and execution timeout limits. A bulk edit that times out halfway is exactly what the transaction in the procedure is there to protect you from, but it is better not to get there.&lt;/P&gt;
&lt;H3&gt;The return string is your UI&lt;/H3&gt;
&lt;P&gt;Since the function has to return a string anyway, make it a useful one. The procedure returns a result set with counts, and the function turns that into something a user can read in the toast notification:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;return (f"'{code_type}' across {requested} hotel(s): " f"{detail}. {audit_rows} audit row(s) written. Batch {str(batch_id)[:8]}.")&lt;/LI-CODE&gt;
&lt;P&gt;So the user sees something like &lt;EM&gt;"'RMREV' across 12 hotel(s): 9 updated, 3 already matched. 9 audit row(s) written. Batch a3f2c101."&lt;/EM&gt; That last part is genuinely useful when someone reports a problem, because you can look up the exact batch.&lt;/P&gt;
&lt;P&gt;One thing that will bite you when reading the procedure's output: SET NOCOUNT ON helps, but you can still land on a resultless set before the SELECT. Skip forward until there is something to read:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;def _first_result_row(cursor): while cursor.description is None: if not cursor.nextset(): return None return cursor.fetchone()&lt;/LI-CODE&gt;
&lt;P&gt;Publish, then test in the portal's Run pane before touching Power BI.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;3. The semantic model&lt;/H2&gt;
&lt;P&gt;Connect Power BI Desktop to the SQL database in &lt;STRONG&gt;DirectQuery&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Point at the &lt;STRONG&gt;SQL database endpoint, not the SQL analytics endpoint.&lt;/STRONG&gt; This one cost me an hour. The analytics endpoint mirrors into OneLake on a delay, so when the button refreshes the report the write has not landed yet. The user clicks Apply, the table doesn't change, and they conclude the button is broken. It isn't. You're just reading a copy.&lt;/P&gt;
&lt;P&gt;Bring in dbo.HotelCodeSetup and audit.vw_HotelCodeSetupHistory.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;4. DAX&lt;/H2&gt;
&lt;P&gt;This measure is what makes multi-hotel editing work. It collapses the slicer selection into the comma-delimited list the function expects:&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Selected Hotel Codes = IF ( ISFILTERED ( HotelCodeSetup[HotelCode] ), CONCATENATEX ( VALUES ( HotelCodeSetup[HotelCode] ), HotelCodeSetup[HotelCode], "," ), BLANK () )&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Do not skip the ISFILTERED guard.&lt;/STRONG&gt; Without it, an empty slicer returns every hotel in the model. One stray click and you have rewritten the entire estate, correctly, transactionally, and with a beautiful audit trail of the disaster. Returning BLANK() instead makes the function reject the call with a readable message.&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Selected Hotel Count = IF ( ISFILTERED ( HotelCodeSetup[HotelCode] ), COUNTROWS ( VALUES ( HotelCodeSetup[HotelCode] ) ), 0 ) Selected Code Type = SELECTEDVALUE ( HotelCodeSetup[CodeType] )&lt;/LI-CODE&gt;
&lt;P&gt;SELECTEDVALUE returns blank when zero or several code types are selected, so ambiguous input gets rejected rather than quietly applied to the wrong one.&lt;/P&gt;
&lt;P&gt;And a live button label, because bulk edits deserve a preview of the blast radius:&lt;/P&gt;
&lt;LI-CODE lang="dax"&gt;Apply Button Label = VAR _n = [Selected Hotel Count] VAR _type = [Selected Code Type] RETURN SWITCH ( TRUE (), _n = 0, "Select at least one hotel", ISBLANK ( _type ), "Select one code type", _n = 1, "Apply to 1 hotel", "Apply to " &amp;amp; _n &amp;amp; " hotels" )&lt;/LI-CODE&gt;&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-13"&gt;&lt;EM&gt;&lt;STRONG&gt;Please check Part 2, as the post is a little lengthy.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H3&gt;</description>
      <pubDate>Wed, 09 Sep 2026 18:45:16 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364353</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-09T18:45:16Z</dc:date>
    </item>
    <item>
      <title>Get ready for table discovery in OneLake Catalog search (Preview)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Get-ready-for-table-discovery-in-OneLake-Catalog-search-Preview/ba-p/5365764</link>
      <description>&lt;P&gt;In late September, OneLake Catalog will begin surfacing tables as searchable objects in Microsoft Fabric. This change expands which table metadata users can discover based on their existing item permissions, so administrators may want to review the related tenant setting before rollout.&lt;/P&gt;&lt;P&gt;To give organizations time to prepare, the controlling tenant setting is already available in the Fabric admin portal. Administrators can review and configure this setting before table search becomes available.&lt;/P&gt;&lt;P&gt;Tables are the first object, an entity contained inside a Microsoft Fabric item, that OneLake Catalog will return as a standalone search result. Bringing objects into search makes the catalog more useful for everyday discovery because they are often where analysis, reporting, and development work begins.&lt;/P&gt;&lt;H2&gt;Find tables directly&lt;/H2&gt;&lt;P&gt;Finding the right data often starts below the item level. You may know a table name, its purpose, or only the name of a column it contains, but not which item contains it. Table discovery will let you search directly for tables in semantic models, lakehouses, and mirrored databases without first locating and opening the parent item. We plan to support tables from more Microsoft Fabric item types, along with additional object types, as OneLake Catalog expands beyond item-level discovery.&lt;/P&gt;&lt;P&gt;Each matching table will appear as its own result rather than as metadata attached to the parent item. Columns will not appear as standalone results, but you can still find the relevant table when a column name is your only starting point.&lt;/P&gt;&lt;P&gt;Table discovery will be available in Fabric’s global search UI and programmatically through the &lt;A href="https://learn.microsoft.com/rest/api/fabric/core/catalog/search" target="_blank"&gt;OneLake Catalog Search API&lt;/A&gt;. You will be able to search by table name or description or use an exact column-name match to find its containing table, without knowing the workspace or parent item in advance.&lt;/P&gt;&lt;P&gt;You can also access search through the &lt;A href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/core-remote/overview-core-mcp-server" target="_blank"&gt;Fabric Core remote MCP server&lt;/A&gt;, &lt;A href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/pro-dev-local/overview-local-mcp-server" target="_blank"&gt;Fabric local MCP server&lt;/A&gt;, or the search skill from the &lt;A href="https://github.com/microsoft/skills-for-fabric" target="_blank"&gt;Fabric Skills library&lt;/A&gt;. These options bring the same permission-aware discovery to applications, AI agents, GitHub Copilot, and other compatible AI coding tools.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img&gt;&lt;EM&gt;Figure: A semantic model table returned as a standalone search result.&lt;/EM&gt;&lt;/img&gt;&lt;H2&gt;Understand how permissions affect table visibility&lt;/H2&gt;&lt;P&gt;Before table search becomes available, administrators should understand how existing permissions affect what users can discover. This change does not grant access to additional data, but it may allow users to discover metadata for tables contained within items they can already access.&lt;/P&gt;&lt;P&gt;You can discover a table only if you have Read control-plane permission or higher on its parent item. You do not need Read All or Read Data permission to find a table in search.&lt;/P&gt;&lt;P&gt;Data-plane permissions, including &lt;A href="https://learn.microsoft.com/fabric/onelake/security/get-started-onelake-security" target="_blank"&gt;OneLake security&lt;/A&gt;, do not change whether a table appears in catalog search. The relevant workload still enforces its data-access permissions when you open, query, or otherwise use the table. Catalog discoverability and data access remain separate decisions.&lt;/P&gt;&lt;P&gt;Tables in semantic models protected by &lt;A href="https://learn.microsoft.com/fabric/security/service-admin-object-level-security" target="_blank"&gt;object-level security&lt;/A&gt; are excluded from search. Object-level security can protect table and column names as well as their metadata, so OneLake Catalog currently does not surface tables from those models.&lt;/P&gt;&lt;H2&gt;Control object discovery with a tenant setting&lt;/H2&gt;&lt;P&gt;Before table search rolls out, Fabric administrators should review the &lt;STRONG&gt;Users can find objects in search&lt;/STRONG&gt; tenant setting. This setting controls whether users can discover contained objects such as tables through Global Search and the Search API.&lt;/P&gt;&lt;P&gt;The setting is enabled by default, allowing users to find supported objects when they have access to the parent item. When it is disabled, search results are limited to top-level Fabric items, such as lakehouses and reports. Disabling the setting does not change access to the underlying items or data; it changes whether contained objects appear in search.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img&gt;&lt;EM&gt;Figure: The tenant setting for controlling object visibility in search results.&lt;/EM&gt;&lt;/img&gt;&lt;H2&gt;Additional search improvements&lt;/H2&gt;&lt;P&gt;Apart from table discovery, this release also introduces several improvements in search for Microsoft Fabric items.&lt;/P&gt;&lt;H3&gt;Get richer item results&lt;/H3&gt;&lt;P&gt;New filters and expanded metadata make item results more precise and useful. You can:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Return and filter item results by &lt;STRONG&gt;endorsement&lt;/STRONG&gt; status, &lt;STRONG&gt;workspace&lt;/STRONG&gt; ID, and &lt;STRONG&gt;sensitivity label&lt;/STRONG&gt; ID.&lt;/LI&gt;&lt;LI&gt;Find &lt;STRONG&gt;dataflows&lt;/STRONG&gt; and &lt;STRONG&gt;dashboards&lt;/STRONG&gt; in search results.&lt;/LI&gt;&lt;LI&gt;Identify reports and dashboards included in a &lt;STRONG&gt;workspace app&lt;/STRONG&gt; and retrieve the relevant app context.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;This context helps you distinguish between similar items, apply governance signals, and choose the right result without making additional requests.&lt;/P&gt;&lt;P&gt;These improvements provide more ways to narrow large result sets and enough context to understand where an item belongs before you open it.&lt;/P&gt;&lt;H3&gt;Refine searches with new operators&lt;/H3&gt;&lt;P&gt;New query operators give you more control over how search interprets your terms:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Use quotation marks (" ") to search for an exact phrase.&lt;/LI&gt;&lt;LI&gt;Use an asterisk (*) as a wildcard for multiple characters.&lt;/LI&gt;&lt;LI&gt;Use a question mark (?) as a wildcard for a single character.&lt;/LI&gt;&lt;LI&gt;Use double ampersands (&amp;amp;&amp;amp;) to return only results that contain all specified terms.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;These operators help you narrow results when names are similar or when you know only part of a name.&lt;/P&gt;&lt;H2&gt;Prepare for rollout&lt;/H2&gt;&lt;P&gt;Tables are the starting point for discovery below the Fabric item level. The same catalog model can support more object types over time while preserving parent context, permission trimming, and a consistent way to search. For now, table search addresses a common need: finding the table you want from its name, description, or an exact column-name match without already knowing where it lives.&lt;/P&gt;&lt;P&gt;Table search will begin rolling out late September. Before rollout, administrators should review the tenant setting, and developers can prepare the search experiences they plan to offer:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Review the &lt;STRONG&gt;Users can find objects in search&lt;/STRONG&gt; tenant setting in the Fabric admin portal and decide whether object discovery should be enabled for your organization.&lt;/LI&gt;&lt;LI&gt;Explore the &lt;A href="https://learn.microsoft.com/rest/api/fabric/core/catalog/search" target="_blank"&gt;OneLake Catalog Search API&lt;/A&gt; if you build data portals, governance tools, or other discovery experiences.&lt;/LI&gt;&lt;LI&gt;Connect an AI development tool through a &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/articles/mcp-servers/core-remote/overview-core-mcp-server" target="_blank"&gt;Fabric MCP server &lt;/A&gt;or install the search skill from the &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank"&gt;Fabric Skills library &lt;/A&gt;to prepare agentic discovery workflows.&lt;/LI&gt;&lt;/UL&gt;</description>
      <pubDate>Wed, 09 Sep 2026 14:09:05 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Get-ready-for-table-discovery-in-OneLake-Catalog-search-Preview/ba-p/5365764</guid>
      <dc:creator>nschachter</dc:creator>
      <dc:date>2026-09-09T14:09:05Z</dc:date>
    </item>
    <item>
      <title>One button, fifty rows: bulk write-back from Power BI to Fabric SQL using a UDF | Part-2</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364356</link>
      <description>&lt;H2&gt;5. The report page&lt;/H2&gt;
&lt;P&gt;Enable &lt;STRONG&gt;Translytical task flows&lt;/STRONG&gt; and &lt;STRONG&gt;Text slicer&lt;/STRONG&gt; under Preview features in Desktop first, or the Data function action type will not appear on the button at all.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Element&lt;/th&gt;&lt;th&gt;Setup&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hotel slicer&lt;/td&gt;&lt;td&gt;HotelCode, multi-select on. This is what drives single vs bulk.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code type slicer&lt;/td&gt;&lt;td&gt;CodeType, &lt;STRONG&gt;single select on&lt;/STRONG&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Major group input&lt;/td&gt;&lt;td&gt;Text slicer, &lt;STRONG&gt;no field bound&lt;/STRONG&gt;. It's an input box, not a filter.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Minor group input&lt;/td&gt;&lt;td&gt;Text slicer, no field bound.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Table visual&lt;/td&gt;&lt;td&gt;HotelCodeSetup, showing current state.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Audit visual&lt;/td&gt;&lt;td&gt;vw_HotelCodeSetupHistory, sorted by ChangedDateUtc descending.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apply button&lt;/td&gt;&lt;td&gt;Action → &lt;STRONG&gt;Data function&lt;/STRONG&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Set both text slicers to &lt;STRONG&gt;Edit interactions → None&lt;/STRONG&gt; against every other visual. Otherwise typing "Rooms Division" into the input box filters the report down to nothing and the user thinks the data vanished.&lt;/P&gt;
&lt;P&gt;Button parameter mapping:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Function parameter&lt;/th&gt;&lt;th&gt;Bind to&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;hotelCodes&lt;/td&gt;&lt;td&gt;Conditional value → [Selected Hotel Codes]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;codeType&lt;/td&gt;&lt;td&gt;Conditional value → [Selected Code Type]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;majorGroup&lt;/td&gt;&lt;td&gt;Major group text slicer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;minorGroup&lt;/td&gt;&lt;td&gt;Minor group text slicer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Turn on &lt;STRONG&gt;Refresh the report automatically&lt;/STRONG&gt; and &lt;STRONG&gt;Auto clear&lt;/STRONG&gt; on the button, and bind the button text to [Apply Button Label].&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;6. Things I learned the hard way&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Test as a non-author.&lt;/STRONG&gt; Report access and function execute permission are separate grants in Fabric. If they are out of sync, the user gets an opaque error, and the people most likely to hit it are the least equipped to interpret it. Grant your writeback audience Execute on the User Data Functions item explicitly, then log in as one of them and click the button.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment pipelines do not rebind the button.&lt;/STRONG&gt; The button stores a hard reference to a specific workspace, function set, and function. Promote dev to test to prod and it is still pointing at dev, even when an identically named function exists in the target workspace. It will happily write dev data from your prod report. Repoint it manually after every deployment, and put that on the release checklist.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Decide your insert policy deliberately.&lt;/STRONG&gt; @AllowInsert = 1 means editing a code type for a hotel that doesn't currently have one creates the row. That is convenient, and it is also a way for typos to become master data. Pass 0 if setup rows should only ever originate from your master data process.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The analytics endpoint thing.&lt;/STRONG&gt; Worth repeating because it presents as "the button does nothing", which sends you looking in entirely the wrong place.&lt;/P&gt;
&lt;H2&gt;7. Audit queries that earn their keep&lt;/H2&gt;
&lt;LI-CODE lang="sql"&gt;-- Everything one button click did SELECT * FROM audit.vw_HotelCodeSetupHistory WHERE BatchId = '&amp;lt;batch-guid&amp;gt;' ORDER BY HotelCode; -- Full history for one hotel and code type SELECT ChangedDateUtc, ChangedBy, ActionType, ChangeDescription FROM audit.vw_HotelCodeSetupHistory WHERE HotelCode = 'HTL001' AND CodeType = 'FBFOOD' ORDER BY ChangedDateUtc DESC; -- Who is making bulk changes SELECT ChangedBy, COUNT(DISTINCT BatchId) AS Batches, COUNT(*) AS ColumnChanges FROM audit.HotelCodeSetupAudit WHERE ChangedDateUtc &amp;gt;= DATEADD(DAY, -30, SYSUTCDATETIME()) GROUP BY ChangedBy ORDER BY ColumnChanges DESC;&lt;/LI-CODE&gt;
&lt;P&gt;The view builds a readable line per change:&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CONCAT(a.ColumnName, ': ', ISNULL(a.OldValue, '(blank)'), ' -&amp;gt; ', ISNULL(a.NewValue, '(blank)')) AS ChangeDescription&lt;/LI-CODE&gt;
&lt;P&gt;So the audit visual on the report reads &lt;EM&gt;"MajorGroup: Food &amp;amp; Bev -&amp;gt; Food &amp;amp; Beverage"&lt;/EM&gt; rather than making the user mentally diff two columns.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;What's next&lt;/H2&gt;
&lt;P&gt;Because the audit stores old and new values per column and groups them by BatchId, rollback is a replay of OldValue for a given batch. That is the obvious third function to build once the main flow has been stable for a while. I have deliberately not built it yet, on the grounds that an undo button written in week one tends to be the thing that needs undoing.&lt;/P&gt;
&lt;H2&gt;Wrapping up&lt;/H2&gt;
&lt;P&gt;The pattern generalises well beyond hotel codes. Any reference or mapping table that business users maintain, and that currently lives in a spreadsheet somebody emails around, is a candidate. The parts worth copying are the ones that are not obvious from the tutorials:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Surrogate PK plus a unique constraint on the real business key, so bulk editing is possible at all.&lt;/LI&gt;
&lt;LI&gt;Audit inside the procedure rather than in a trigger, so the identity is the report user.&lt;/LI&gt;
&lt;LI&gt;COALESCE in the update so blank means "leave alone", not "erase".&lt;/LI&gt;
&lt;LI&gt;ISFILTERED in the DAX so an empty slicer can't rewrite everything.&lt;/LI&gt;
&lt;LI&gt;A hard cap on selection size in the function.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;Happy to answer questions in the comments. If you have built something similar and solved the deployment pipeline rebinding problem more elegantly than "remember to do it manually", I would genuinely like to hear it.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;PBIX File &amp;amp; full scripts: 01_schema_and_procs.sql and 02_user_data_function.py are attached below.&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/One-button-fifty-rows-bulk-write-back-from-Power-BI-to-Fabric/ba-p/5364356</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-10T17:00:00Z</dc:date>
    </item>
    <item>
      <title>You Can Create Calculated DAX Columns in Direct Lake — But Should You?</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/You-Can-Create-Calculated-DAX-Columns-in-Direct-Lake-But-Should/ba-p/5365681</link>
      <description>&lt;P&gt;Adding calculated columns in DAX for Direct Lake gives a lot of flexibility and feels like an easy option... BUT.....&lt;/P&gt;</description>
      <pubDate>Wed, 09 Sep 2026 14:03:44 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/You-Can-Create-Calculated-DAX-Columns-in-Direct-Lake-But-Should/ba-p/5365681</guid>
      <dc:creator>amitchandak</dc:creator>
      <dc:date>2026-09-09T14:03:44Z</dc:date>
    </item>
    <item>
      <title>Advancing the Microsoft Fabric SQL Query Editor</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Advancing-the-Microsoft-Fabric-SQL-Query-Editor/ba-p/5364033</link>
      <description>&lt;P&gt;The Microsoft Fabric SQL Query Editor is the home for web-based SQL development in Fabric. It gives developers a workspace to explore warehouse data, write and run SQL, among many more capabilities.&lt;/P&gt;
&lt;P&gt;That work rarely starts and ends with a single query. Developers navigate large schemas, author and refine SQL, inspect results, share findings, and connect validated work to downstream analytics and operational workflows. As warehouses and teams grow, each of those steps can introduce friction, from finding the right object, to managing an increasing number of queries or moving between different Fabric experiences.&lt;/P&gt;
&lt;P&gt;The latest SQL query editor updates are focused on reducing that friction and making the development experience faster, more scalable, and more connected across Fabric.&lt;/P&gt;
&lt;H2&gt;A scalable editor for any size warehouse&lt;/H2&gt;
&lt;P&gt;Working with a warehouse becomes harder when the development tools do not scale with the environment.&lt;/P&gt;
&lt;P&gt;Large schemas can make objects difficult to navigate, metadata-heavy environments can slow down authoring assistance, and large query results can become cumbersome to inspect in the browser.&lt;/P&gt;
&lt;P&gt;The latest updates strengthen the core web SQL query editor experiences across Object Explorer, IntelliSense, and the results grid so developers can stay productive as their warehouse grows.&lt;/P&gt;
&lt;P&gt;To learn more about the rich capabilities the SQL query editor offers, explore the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/sql-query-editor" target="_blank" rel="noopener"&gt;SQL query editor documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;A faster, more capable data grid (Generally Available)&lt;/H3&gt;
&lt;P&gt;Running a query is only useful if developers can quickly understand the output.&lt;/P&gt;
&lt;P&gt;Large or wide result sets can be difficult to inspect when the grid is slow or when values do not fit comfortably on screen, often pushing developers to export data just to review it.&lt;/P&gt;
&lt;P&gt;The brand-new data grid improves performance and makes data and result previews easier to inspect directly in the web SQL query editor. Developers can resize columns for wide result sets, while expanded support for larger LOB data types makes it possible to review larger values directly in the grid, with many more improvements coming soon.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Brand new results grid, now with support for resizing columns.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;For additional information regarding the data grid, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/data-preview" target="_blank" rel="noopener"&gt;Data preview documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Object explorer built for large databases (Generally Available)&lt;/H3&gt;
&lt;P&gt;Finding the right table, view, or schema should not become harder simply because a warehouse contains thousands of objects.&lt;/P&gt;
&lt;P&gt;The redesigned object explorer is significantly optimized for performance when navigating large warehouse environments while keeping schema browsing responsive as the number of objects grows.&lt;/P&gt;
&lt;P&gt;Developers can also pin frequently used tables, views, and schemas, reducing the need to repeatedly navigate through large object hierarchies during everyday development.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - New object explorer (left) vs. old object explorer (right) loading times for thousands of user objects.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/manage-objects" target="_blank" rel="noopener"&gt;Object explorer documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;IntelliSense, redesigned for scale (Generally Available)&lt;/H3&gt;
&lt;P&gt;SQL authoring becomes increasingly dependent on good database context as schemas grow. Developers should not need to remember every table, column, or object name before they can start writing a query. With improved IntelliSense responsiveness in larger warehouse environments, developers can spend less time looking up object names and more time building and refining their queries.&lt;/P&gt;
&lt;H2&gt;Better query management for development workflows&lt;/H2&gt;
&lt;P&gt;The number of queries developers work with tends to grow alongside the warehouse.&lt;/P&gt;
&lt;P&gt;Exploratory queries become reusable queries. Saved SQL queries accumulate across projects. Queries need to be shared for team review, revisited later, or cleaned up once they are no longer useful.&lt;/P&gt;
&lt;P&gt;New query management capabilities make that ongoing work easier to maintain directly within the query editor.&lt;/P&gt;
&lt;H3&gt;Copy and share queries with their context (Preview)&lt;/H3&gt;
&lt;P&gt;Sharing SQL often means separately copying the query, capturing its output, and explaining which results came from which version of the logic.&lt;/P&gt;
&lt;P&gt;The new copy query experience makes it easier to keep those pieces together.&lt;/P&gt;
&lt;P&gt;Developers can copy a query together with its results or generate a link that opens the query directly in the tool of their choice. This makes reviews, validation, and collaboration easier while reducing the extra steps required to pick the work back up in another experience.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Copy query experience in the SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;More control with autosave (Generally Available)&lt;/H3&gt;
&lt;P&gt;Not every SQL editing session represents work a developer wants to preserve in the same way. Exploratory changes may be temporary, while active development may need to be continuously protected from accidental loss.&lt;/P&gt;
&lt;P&gt;Developers can now toggle autosave on or off, giving them more control over how changes are preserved based on the way they are working.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Autosave on/off configuration in SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;Manage queries at scale (Generally Available)&lt;/H3&gt;
&lt;P&gt;Saved queries can quickly accumulate across ongoing development, investigation, and experimentation. Managing them one at a time becomes increasingly tedious as that collection grows.&lt;/P&gt;
&lt;P&gt;Bulk query management makes it easier to select and manage multiple queries at once, helping developers clean up old work and keep their query collections organized as projects evolve.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Bulk management capabilities for queries.&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;Import and export .sql files (Generally Available)&lt;/H3&gt;
&lt;P&gt;SQL development often extends beyond a single tool or environment. Developers may already have queries stored as .sql files or need to move work between Fabric and other parts of their development workflow.&lt;/P&gt;
&lt;P&gt;The SQL query editor now supports importing .sql files directly for editing, sharing and execution, as well as exporting queries as .sql files for use elsewhere.&lt;/P&gt;
&lt;P&gt;This makes it easier to bring existing SQL into Fabric, preserve work in a portable format, and move queries between tools without manually copying and pasting code.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Export queries as .sql files from the SQL query editor for development in other tools.&lt;/P&gt;
&lt;/img&gt;
&lt;H2&gt;Extending SQL into analytics, semantics, and operations&lt;/H2&gt;
&lt;P&gt;SQL development often produces the starting point for work that continues elsewhere.&lt;/P&gt;
&lt;P&gt;A developer may validate warehouse data in SQL and then need to analyze it with another engine, connect it to a semantic model, or use the result as part of an ongoing monitoring workflow. Moving between these experiences can interrupt the development flow and create additional steps between understanding the data and doing something with it.&lt;/P&gt;
&lt;P&gt;New integrations make those transitions more direct from the SQL query editor.&lt;/P&gt;
&lt;H3&gt;Analyze warehouse data across OneLake (Generally Available)&lt;/H3&gt;
&lt;P&gt;Different analytical problems often call for different tools.&lt;/P&gt;
&lt;P&gt;A developer may begin by exploring warehouse data with SQL but later need Spark for broader data processing or KQL for another analytical scenario. Traditionally, moving between engines can also introduce additional data movement or setup.&lt;/P&gt;
&lt;P&gt;Directly from the SQL query editor, developers can now create Eventhouse endpoints or notebooks that work with the same warehouse data using KQL or Spark. This makes it easier to choose the engine that best fits the task while staying connected to the same data in OneLake. Learn more about OneLake analytics in the &lt;A href="https://learn.microsoft.com/fabric/real-time-intelligence/eventhouse-as-endpoint" target="_blank" rel="noopener"&gt;Eventhouse endpoint documentation&lt;/A&gt;.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Create Notebooks and Eventhouse Endpoints directly from the SQL query editor for Spark and KQL based analysis on warehouse data.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more about OneLake analytics, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/real-time-intelligence/eventhouse-as-endpoint" target="_blank" rel="noopener"&gt;Eventhouse endpoint documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Connect SQL to the semantic layer (Generally Available)&lt;/H3&gt;
&lt;P&gt;Validated SQL and warehouse data frequently become the foundation for downstream reporting and BI.&lt;/P&gt;
&lt;P&gt;Without a direct path into semantic modeling, developers and BI teams often must leave the web SQL Query Editor and start that workflow separately, even when they are working from the same underlying warehouse data.&lt;/P&gt;
&lt;P&gt;Developers now have the option to create a Direct Lake over OneLake semantic model directly from the SQL query editor, making it easier to move from exploring and validating warehouse data into building a semantic model without extra navigation or setup.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;Figure: Animated GIF - Create Direct Lake semantic models from the SQL query editor.&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;To learn more about creating semantic models on warehouse data, refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/create-semantic-model" target="_blank" rel="noopener"&gt;Power BI semantic model documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Turn SQL queries into operational workflows with Fabric Activator (Preview)&lt;/H3&gt;
&lt;P&gt;Developers often rerun the same SQL queries to monitor changing conditions and catch issues that need attention. That creates repetitive work for developers and operators who need to continually inspect business conditions or workload signals.&lt;/P&gt;
&lt;P&gt;The new Fabric Activator integration, now in preview, makes those SQL queries in warehouse more operational. Developers can define conditions based on query results and trigger follow-up actions when those conditions are met. Instead of repeatedly running SQL to look for an issue, the query can become part of an ongoing workflow that surfaces when attention or action is needed.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Figure: Animated GIF - Creating an alert on a SQL query.&lt;/img&gt;
&lt;P&gt;To learn more, refer to the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/real-time-intelligence/data-activator/set-alerts-warehouse-sql-query" target="_blank" rel="noopener"&gt;alert rule documentation&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;A more complete web SQL query editor experience&lt;/H2&gt;
&lt;P&gt;These updates are designed around a simple idea: developers should spend more time working with their data and less time working around their tools.&lt;/P&gt;
&lt;P&gt;Faster navigation and authoring reduce friction in large warehouse environments. Better query management makes ongoing SQL development easier to maintain. Deeper Fabric integrations reduce the distance between writing a query and using that work across analytics, semantic models, and operational workflows.&lt;/P&gt;
&lt;P&gt;Together, these capabilities make the SQL query editor a more complete development experience for working with warehouse data, from finding the right object and writing SQL to validating results and carrying that work forward across Fabric.&lt;/P&gt;
&lt;P&gt;Ready to get started? Refer to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/sql-query-editor" target="_blank" rel="noopener"&gt;SQL query editor documentation.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This is just the start of a series of rich investments to make the Microsoft Fabric SQL Query Editor an even more powerful and productive environment for web-based SQL development in Fabric, with many more capabilities coming soon. Stay tuned!&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 19:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Advancing-the-Microsoft-Fabric-SQL-Query-Editor/ba-p/5364033</guid>
      <dc:creator>salilkanade1</dc:creator>
      <dc:date>2026-09-08T19:00:00Z</dc:date>
    </item>
    <item>
      <title>Building and Enriching a Microsoft Fabric Data Agent on a Power BI Semantic Model</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-and-Enriching-a-Microsoft-Fabric-Data-Agent-on-a-Power/ba-p/5364459</link>
      <description>&lt;P&gt;Microsoft Fabric’s Data Agents are one of the most exciting additions to the Fabric ecosystem for Power BI practitioners. They let business users ask questions in plain English and receive grounded answers directly from a governed semantic model, without needing to write DAX or SQL.&lt;BR /&gt;&lt;BR /&gt;In this post, I’ll explain why you might place a Data Agent on top of a Power BI semantic model, how to set one up, and, most importantly, how to enrich it so it provides high-quality, trustworthy answers.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;The big idea:&lt;/STRONG&gt; Business users ask questions in plain English. The agent reasons over a curated semantic layer and returns grounded, governed answers rather than invented results.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;1. What Are Data Agents, and Why Use Them?&lt;/H2&gt;&lt;P&gt;Data Agents let people ask plain-English questions about their data and receive context-rich answers. Under the hood, they use Azure OpenAI models to interpret the question, determine which data source is most relevant, and generate an appropriate query: SQL for a warehouse or lakehouse, DAX for a semantic model, and KQL for event data.&lt;BR /&gt;&lt;BR /&gt;The result is presented as a readable response containing tables, summaries, or insights while respecting the user’s existing security permissions. Because Data Agents connect directly to governed data in OneLake, they make analytics accessible to users who may never open Power BI Desktop or write a query.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;1.1 What Is the Difference Between Copilot and a Data Agent?&lt;/H3&gt;&lt;P&gt;Both Fabric Copilot and Fabric Data Agents use generative AI, but they are designed for different scenarios.&lt;BR /&gt;&lt;BR /&gt;Copilot is embedded within the current Fabric experience, such as a Power BI report, and helps users complete context-specific tasks such as creating visuals or writing DAX. A Data Agent is a standalone conversational analytics experience that can connect to as many as five data sources and can be integrated with experiences such as Microsoft Teams, Microsoft 365 Copilot, Copilot Studio, and custom applications.&lt;BR /&gt;&lt;BR /&gt;Data Agents support custom instructions, business terminology, verified answers, and reusable integrations. They are read-only and honor existing security. This makes them suitable for domain-specific, governed self-service analytics, while Copilot remains useful for assistance within the current Fabric item.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;2. Prerequisites and Setup&lt;/H2&gt;&lt;P&gt;To create a Data Agent, you need Fabric capacity and at least one supported data source containing data, such as a lakehouse, warehouse, Power BI semantic model, KQL database, mirrored database, or ontology.&lt;BR /&gt;&lt;BR /&gt;You should also have a well-designed Power BI semantic model with governed measures, meaningful relationships, clear naming, and appropriate security. Cross-geo processing must be enabled when your data is stored in a different region. Read permission on the semantic model is sufficient; Build permission is not required.&lt;/P&gt;&lt;H2&gt;3. Preparing the Semantic Model: The Most Important Step&lt;/H2&gt;&lt;P&gt;Preparing the semantic model is the foundation of a reliable Data Agent. Before adding the model to the agent, configure it using Power BI’s &lt;STRONG&gt;Prep for AI&lt;/STRONG&gt; capabilities.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;STRONG&gt;Use business-friendly names.&lt;/STRONG&gt; Give tables, columns, and measures clear names. Hide technical keys, housekeeping fields, and other objects that users should not query.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Organize the model.&lt;/STRONG&gt; Group related columns and measures into display folders, such as Customer, Sales, Profit, and Time Intelligence.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Add descriptions and synonyms.&lt;/STRONG&gt; Explain what each important table, column, and measure represents, and include the terminology users are likely to use.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Validate relationships.&lt;/STRONG&gt; Ensure the model has the correct active relationships, filter direction, and date behavior.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Apply security.&lt;/STRONG&gt; Configure RLS and OLS where required. The Data Agent respects the semantic model’s security.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Configure Prep for AI.&lt;/STRONG&gt; Define the AI data schema, semantic-model instructions, and verified answers. When a Data Agent queries a semantic model, its DAX-generation tool relies on the model metadata and Prep for AI configuration. Data Agent-level instructions are not used to generate DAX, so model-specific calculation and filtering rules must live in the semantic model.&lt;/LI&gt;&lt;/OL&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;4. Creating and Configuring the Data Agent&lt;/H2&gt;&lt;P&gt;In your Fabric workspace, select &lt;STRONG&gt;New item&lt;/STRONG&gt;, choose &lt;STRONG&gt;Fabric data agent&lt;/STRONG&gt;, give the agent a descriptive name, and create it. The OneLake catalog will appear, allowing you to add supported data sources. Select the Power BI semantic model and any other required sources, then choose only the tables the agent needs for the intended business questions.&lt;/P&gt;&lt;H3&gt;4.1 Configuring the Data Agent&lt;/H3&gt;&lt;P&gt;Creating the agent is only the starting point. To improve accuracy and keep the experience useful over time, treat it as an evolving system and use an iterative process of testing and refinement.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;1. Add Data Agent instructions.&lt;/STRONG&gt; These instructions govern orchestration and presentation. Use them to define source-routing priorities, response structure, clarification behavior, business terminology, and how results should be summarized or visualized.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;2. Add semantic-model instructions.&lt;/STRONG&gt; These belong in Prep for AI and explain how AI should understand and query the model. Include governed measures, date rules, relationships, filter logic, definitions, and important safeguards.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;One important separation:&lt;/STRONG&gt; Semantic Model AI Instructions explain how AI should understand the model. Data Agent Instructions explain how the agent should orchestrate and communicate.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;3. Start with a benchmark set.&lt;/STRONG&gt; Build a representative set of business questions with expected queries and answers. Use it to evaluate accuracy and expand coverage systematically.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;4. Diagnose incorrect responses.&lt;/STRONG&gt; Determine whether an incorrect answer was caused by missing metadata, unclear instructions, incomplete examples, an ambiguous user question, or a semantic-model issue.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;5. Refine the instructions.&lt;/STRONG&gt; Clarify data-source priorities, business definitions, date behavior, summary-versus-detail rules, and expected output formatting.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;4.2 Best Practices and Recommendations&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;Use descriptive table, column, and measure names so the agent can understand the schema.&lt;/LI&gt;&lt;LI&gt;Build specialized agents for specific domains and limit each source to the tables and columns needed for that domain.&lt;/LI&gt;&lt;LI&gt;Be explicit about what the agent should do, not only what it should avoid.&lt;/LI&gt;&lt;LI&gt;Define business terms, abbreviations, synonyms, date rules, and important calculation logic.&lt;/LI&gt;&lt;LI&gt;Provide representative verified answers for common and complex questions.&lt;/LI&gt;&lt;LI&gt;Select only the sources and objects needed to answer the expected questions. A focused configuration improves query accuracy and efficiency.&lt;/LI&gt;&lt;LI&gt;Use SQL, DAX, or KQL examples only where they materially clarify complex joins, filters, or date logic.&lt;/LI&gt;&lt;LI&gt;Validate results under different user identities to confirm RLS and OLS behavior.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;These practices help the Data Agent interpret questions correctly, query the right source, and return clear, context-rich answers.&lt;/P&gt;&lt;H2&gt;5. Enriching and Evolving the Data Agent&lt;/H2&gt;&lt;P&gt;You can enrich the agent with instructions, examples, terminology, and response rules. Data Agent instructions should define tone, routing, clarification, response formatting, and visual policy across sources. Avoid placing semantic-model-specific calculation logic at this level.&lt;BR /&gt;&lt;BR /&gt;Use verified answers to anchor common business questions to the expected interpretation and governed query. As you test the agent, review both the returned result and the generated query. If an answer is incorrect, refine the semantic model metadata, AI data schema, verified answers, or instructions based on the actual cause.&lt;/P&gt;&lt;H3&gt;Evaluate and Iterate with the Fabric Data Agent SDK&lt;/H3&gt;&lt;P&gt;Evaluation is essential to the ongoing development of a Data Agent. Use the Fabric Data Agent SDK to test representative questions at scale, compare actual results with expected answers, and identify patterns in failures.&lt;BR /&gt;&lt;BR /&gt;An effective evaluation set should include common questions, ambiguous questions, unsupported requests, date and comparison scenarios, hierarchy navigation, security-sensitive questions, and follow-up questions that depend on conversational context.&lt;/P&gt;&lt;H3&gt;Add Code Interpreter&lt;/H3&gt;&lt;P&gt;Code Interpreter gives the Data Agent a secure, sandboxed Python environment for analyzing retrieved data. With it enabled, the agent can support calculations, deeper analysis, and visualizations that go beyond the initial query result.&lt;BR /&gt;&lt;BR /&gt;The governed data source should still produce the underlying result first. Code Interpreter should analyze that result rather than recreate business logic outside the semantic model.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H2&gt;6. How Data Agents Work at Runtime&lt;/H2&gt;&lt;P&gt;When a user asks a question, the Data Agent uses Azure OpenAI to interpret the request and determine the most suitable connected source. It accesses each source under the user’s identity and security context.&lt;BR /&gt;&lt;BR /&gt;For a Power BI semantic model, the agent uses the model’s metadata and Prep for AI configuration to generate and execute a DAX query. It then formats the governed result as a conversational response. Because the query runs under the user’s permissions and honors model and workspace security, the agent only returns information that the user is authorized to access.&lt;/P&gt;&lt;H2&gt;7. Benefits and Limitations&lt;/H2&gt;&lt;P&gt;Data Agents make governed analytics more accessible by reducing the need for users to write queries or build a report for every question. They can bring multiple supported data sources into one conversational experience while honoring existing security and governance.&lt;BR /&gt;&lt;BR /&gt;However, a Data Agent is not automatically accurate simply because it is connected to trusted data. Its results depend on semantic-model quality, relevant metadata, clear instructions, verified answers, focused source selection, and continuous evaluation. Complex root-cause or predictive questions may also require additional analytical logic beyond a straightforward governed query.&lt;/P&gt;&lt;H2&gt;8. Conclusion&lt;/H2&gt;&lt;P&gt;Microsoft Fabric Data Agents provide a powerful new way to interact with enterprise data. By combining a well-prepared Power BI semantic model with focused Data Agent configuration, verified answers, clear instructions, and ongoing evaluation, you can create a conversational analytics experience that users can trust.&lt;BR /&gt;&lt;BR /&gt;The goal is not merely to connect AI to data. The goal is to connect AI to governed business meaning.&lt;/P&gt;&lt;H5&gt;Further Reading -&amp;nbsp;&lt;/H5&gt;&lt;P&gt;&lt;A href="https://community.fabric.microsoft.com/blog/community_blog/why-your-fabric-data-agent-gives-wrong-answers-and-how-data-enrichment-fixes-it/5361211" target="_blank"&gt;Why Your Fabric Data Agent Gives Wrong Answers (And How Data Enrichment Fixes It)&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 13:46:21 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-and-Enriching-a-Microsoft-Fabric-Data-Agent-on-a-Power/ba-p/5364459</guid>
      <dc:creator>Praful_Potphode</dc:creator>
      <dc:date>2026-09-08T13:46:21Z</dc:date>
    </item>
    <item>
      <title>Building a Better Microsoft Fabric Data Agent:
Instructions, Visual Policy, and Cost-Aware Design</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-a-Better-Microsoft-Fabric-Data-Agent-Instructions/ba-p/5364431</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Connecting a semantic model to a Fabric Data Agent is the easy part. The real work starts when the agent needs to understand what your business actually means.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;A Fabric Data Agent can generate technically valid DAX and still return the wrong business answer. The missing piece is often not the model itself; it is the context we provide around it.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Consider this question:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Which region performed best last quarter?&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;It sounds straightforward, but the agent must make several decisions before it can answer.&lt;BR /&gt;&lt;BR /&gt;What does &lt;EM&gt;performed best&lt;/EM&gt; mean?&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Highest Sales?&lt;/LI&gt;&lt;LI&gt;Highest Profit?&lt;/LI&gt;&lt;LI&gt;Best Profit Margin?&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Which date defines &lt;EM&gt;last quarter&lt;/EM&gt;?&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Order Date?&lt;/LI&gt;&lt;LI&gt;Ship Date?&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Should the agent return only the leading region, compare every region, or create a chart? If a governed &lt;STRONG&gt;Profit Margin&lt;/STRONG&gt; measure already exists, should the agent use it or recreate the calculation from raw columns?&lt;BR /&gt;&lt;BR /&gt;These are not primarily DAX questions. They are context and governance questions.&lt;BR /&gt;&lt;BR /&gt;After working with Fabric Data Agents beyond the proof-of-concept stage, I stopped treating instructions as one large prompt. A reliable implementation has several layers:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Data enrichment&lt;/LI&gt;&lt;LI&gt;Semantic Model AI Instructions&lt;/LI&gt;&lt;LI&gt;Data Agent Instructions&lt;/LI&gt;&lt;LI&gt;Routing and ambiguity handling&lt;/LI&gt;&lt;LI&gt;Response and visual policy&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Each layer has a different responsibility. Getting these layers right improves answer quality and can also reduce unnecessary reasoning, retries, query execution, and overly verbose responses.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;img /&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H2&gt;1. There Is a Cost to Ambiguity&lt;/H2&gt;&lt;P&gt;Fabric Data Agent consumption is token-based. The user’s question is only one part of the context processed by the AI. Agent instructions, source instructions, example queries, conversation history, and supporting context can also contribute to the input.&lt;BR /&gt;&lt;BR /&gt;At the time of writing, the published consumption rates are:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;1,000 input tokens = 100 CU seconds&lt;/LI&gt;&lt;LI&gt;1,000 cached input tokens = 10 CU seconds&lt;/LI&gt;&lt;LI&gt;1,000 output tokens = 400 CU seconds&lt;/LI&gt;&lt;LI&gt;Data-source query execution is charged separately&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;This creates an important architectural consideration.&lt;/P&gt;&lt;H3&gt;A Poorly Prepared Data Agent&lt;/H3&gt;&lt;P&gt;Imagine that a user asks:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Which region performed best?&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;The agent assumes that performance means Sales, executes a query, and returns an answer. The user then replies, &lt;EM&gt;I meant profitability.&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;Now we have another interaction, another round of reasoning, another response, and potentially another underlying query.&lt;BR /&gt;&lt;BR /&gt;A better approach is to define the business interpretation once:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;When performance is used without a specific KPI, evaluate both Sales and Profit.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;The objective should not be to use the fewest tokens possible. It should be to use the minimum useful context required to produce the right answer with the least unnecessary reasoning.&lt;BR /&gt;&lt;BR /&gt;A small prompt that produces the wrong answer is not an optimization. Adding thousands of characters of unnecessary instructions to every interaction is not an optimization either.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Optimize for cost per successful answer, not tokens per prompt.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;2. Data Enrichment Comes First: Start with the Model&lt;/H2&gt;&lt;P&gt;Semantic-model enrichment was covered in our previous article, so I will not repeat the full process here. The main principle is that a focused AI Data Schema, clear descriptions, relevant synonyms, governed measures, and a clean model reduce ambiguity and help the AI focus on the objects that matter.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Important:&lt;/STRONG&gt; Instructions should add business context. They should not be used to repair a poorly designed semantic model.&lt;/P&gt;&lt;P&gt;Data Enrichment Guide - https://community.fabric.microsoft.com/blog/community_blog/why-your-fabric-data-agent-gives-wrong-answers-and-how-data-enrichment-fixes-it/5361211&lt;/P&gt;&lt;H2&gt;3. The Most Important Separation: Semantic Model Instructions vs. Data Agent Instructions&lt;/H2&gt;&lt;P&gt;Semantic Model AI Instructions and Data Agent Instructions are not the same, and they should not contain the same information.&lt;BR /&gt;&lt;BR /&gt;Data Agent-level instructions are not passed to the DAX-generation tool used for semantic-model query generation. This changes how the instruction architecture should be designed.&lt;BR /&gt;&lt;BR /&gt;Consider this rule:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;When a user asks for margin, always use the governed Profit Margin measure.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;If this rule exists only in the global Data Agent instructions, it is placed at a layer that the DAX-generation tool does not directly use. The rule belongs in the Semantic Model AI Instructions.&lt;BR /&gt;&lt;BR /&gt;The easiest way to remember the separation is:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Semantic Model AI Instructions explain how AI should understand and query the model.&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;Data Agent Instructions explain how the agent should orchestrate and communicate.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;Once this separation is clear, the overall framework becomes easier to maintain.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;4. Semantic Model AI Instructions: Give the Model a Clear Purpose&lt;/H2&gt;&lt;P&gt;Use Semantic Model AI Instructions for rules that affect how the model should be interpreted and queried. The business rules will change across Finance, Sales, HR, Supply Chain, Operations, and other domains, but the structure does not have to change.&lt;BR /&gt;&lt;BR /&gt;Instead of one long block of rules, use a repeatable framework:&lt;/P&gt;&lt;PRE&gt;SEMANTIC MODEL AI INSTRUCTIONS
1. Purpose and Scope
2. Measure Priority
3. Authoritative Objects
4. Business Definitions
5. Governed Measure Mapping
6. Business Rules
7. Time Rules
8. Source Priority
9. Default Behaviour
10. Ambiguity Rules
11. Domain Restrictions
12. Cross-Domain Rules&lt;/PRE&gt;&lt;P&gt;The principle is straightforward:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;If a rule changes the query, it probably belongs close to the semantic model.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://github.com/hardiksri/fabric-data-agent-instructions/blob/main/Semantic%20Model%20Instruction%20Framework" target="_blank"&gt;Reusable Semantic Model Instruction Framework&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H2&gt;5. Keep the Data Agent Focused on Orchestration&lt;/H2&gt;&lt;P&gt;Once semantic logic lives at the correct layer, the Data Agent instructions become much cleaner. A generic framework can look like this:&lt;/P&gt;&lt;PRE&gt;DATA AGENT INSTRUCTIONS
1. Purpose
2. Scope
3. Data Source Behaviour
4. Response Policy
5. Visual Policy
6. Insight Generation
7. Recommendation Policy
8. Comparison Rules
9. Large Result Handling
10. Conversation Style
11. Explainability
12. Formatting
13. Missing Data
14. Follow-up Questions
15. Guardrails&lt;/PRE&gt;&lt;P&gt;The production pattern should reinforce one key rule:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Retrieve governed results from the semantic model and never override the model’s business rules, measure selection, relationships, or calculations.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://github.com/hardiksri/fabric-data-agent-instructions/blob/main/Data%20Agent%20Instruction%20Framework" target="_blank"&gt;Reusable Data Agent Instruction Framework&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H2&gt;6. Make the Response Policy Adaptive&lt;/H2&gt;&lt;P&gt;A fixed seven-section response can be useful for deep analysis, but it is unnecessary for a simple question such as:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;What were Total Sales in 2025?&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;An adaptive response policy is more effective:&lt;/P&gt;&lt;H3&gt;Simple KPI Question&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Answer directly.&lt;/LI&gt;&lt;LI&gt;State the important period and filter context.&lt;/LI&gt;&lt;LI&gt;Keep the response concise.&lt;/LI&gt;&lt;LI&gt;Do not force a chart.&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Analytical Question&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;State the scope.&lt;/LI&gt;&lt;LI&gt;Provide a short summary.&lt;/LI&gt;&lt;LI&gt;Show the supporting result.&lt;/LI&gt;&lt;LI&gt;Create one useful visual.&lt;/LI&gt;&lt;LI&gt;Highlight the key takeaways.&lt;/LI&gt;&lt;/OL&gt;&lt;H3&gt;Deeper Analysis&lt;/H3&gt;&lt;P&gt;Add recommendations and follow-up questions only when they provide real value. A useful analytical flow is: Scope, Executive Summary, Supporting Details, Visual, Key Takeaways, Recommendations, and Follow-up Questions.&lt;/P&gt;&lt;H2&gt;7. Visual Policy Should Be Governed Too&lt;/H2&gt;&lt;P&gt;Fabric Data Agent can generate native visual responses, and Data Agent Instructions can influence when a visual should be used and which supported chart type should be preferred.&lt;BR /&gt;&lt;BR /&gt;At the time of writing, the supported visual types include:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Line chart&lt;/LI&gt;&lt;LI&gt;Multi-line chart&lt;/LI&gt;&lt;LI&gt;Column chart&lt;/LI&gt;&lt;LI&gt;Multi-column chart&lt;/LI&gt;&lt;LI&gt;Stacked column chart&lt;/LI&gt;&lt;LI&gt;Pie chart&lt;/LI&gt;&lt;LI&gt;Scatter plot&lt;/LI&gt;&lt;LI&gt;Area chart&lt;/LI&gt;&lt;LI&gt;Stacked area chart&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;A simple intent-based policy can map trends to line charts, category comparisons to column charts, composition to stacked columns, small part-to-whole comparisons to pie charts, and numeric relationships to scatter plots.&lt;BR /&gt;&lt;BR /&gt;The safeguards matter just as much:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Do not create a visual when it adds no value.&lt;/LI&gt;&lt;LI&gt;Create a visual when the user explicitly requests one and the request is supported.&lt;/LI&gt;&lt;LI&gt;Do not generate several charts when one is sufficient.&lt;/LI&gt;&lt;LI&gt;Keep the KPI, filters, comparison, and time context consistent.&lt;/LI&gt;&lt;LI&gt;Never change the business calculation simply to produce a visual.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;A chart should explain the result. The result should never be changed to fit the chart.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;8. Guardrails Matter More Than More Instructions&lt;/H2&gt;&lt;P&gt;A good instruction framework should make its non-negotiable behavior explicit.&lt;/P&gt;&lt;H3&gt;Always&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Respect semantic-model rules.&lt;/LI&gt;&lt;LI&gt;Respect the user’s filters.&lt;/LI&gt;&lt;LI&gt;Respect security.&lt;/LI&gt;&lt;LI&gt;Use governed results.&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;Never&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Recreate governed KPIs.&lt;/LI&gt;&lt;LI&gt;Fabricate values.&lt;/LI&gt;&lt;LI&gt;Infer causes without evidence.&lt;/LI&gt;&lt;LI&gt;Override semantic-model logic.&lt;/LI&gt;&lt;LI&gt;Expose technical objects unnecessarily.&lt;/LI&gt;&lt;LI&gt;Change the user’s scope without permission.&lt;/LI&gt;&lt;/UL&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;9. What Changes When the Source Is SQL?&lt;/H2&gt;&lt;P&gt;Now imagine that the same Data Agent also has access to a Fabric Warehouse.&lt;BR /&gt;&lt;BR /&gt;A semantic model already provides relationships, governed measures, business-friendly metadata, DAX calculations, and a semantic layer. A raw SQL source is different. The Data Agent may need more direct guidance about:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;What each table represents.&lt;/LI&gt;&lt;LI&gt;How tables should be joined.&lt;/LI&gt;&lt;LI&gt;Which columns own particular business concepts.&lt;/LI&gt;&lt;LI&gt;Which date should be used.&lt;/LI&gt;&lt;LI&gt;Common stored values and their meaning.&lt;/LI&gt;&lt;LI&gt;The grain of each fact table.&lt;/LI&gt;&lt;LI&gt;Query patterns that are not obvious from object names.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;For SQL sources, use Data Source Instructions as a concise onboarding guide for someone seeing the database for the first time.&lt;/P&gt;&lt;H3&gt;SQL Data Source Instruction Pattern&lt;/H3&gt;&lt;PRE&gt;SOURCE PURPOSE
Use this source for Sales, Customer, Product,
and Inventory analysis.

TABLE GRAIN
FactSales contains one row per Order Line.
FactInventory contains Product inventory by location.

JOIN RULES
FactSales.CustomerKey → DimCustomer.CustomerKey
FactSales.ProductKey → DimProduct.ProductKey
FactSales.DateKey → DimDate.DateKey

BUSINESS RULES
Revenue = SUM(SalesAmount)
Order Count = COUNT(DISTINCT OrderID)
Do not use COUNT(*) for Order Count because
one Order can contain multiple Order Lines.

DATE RULES
Use OrderDate for normal Sales analysis.
Use ShipDate only for shipping or fulfillment questions.

QUERY RULES
Use explicit joins.
Avoid SELECT *.
Return only required fields.
Do not expose technical keys unless requested.&lt;/PRE&gt;&lt;P&gt;The goal is not to document the entire database. Include only the context that materially affects query generation.&lt;/P&gt;&lt;H3&gt;Example Queries Demonstrate the Pattern&lt;/H3&gt;&lt;P&gt;Consider the question:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Who are the top 10 customers by revenue?&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;SELECT TOP 10
    c.CustomerName,
    SUM(s.SalesAmount) AS Revenue
FROM FactSales s
INNER JOIN DimCustomer c
    ON s.CustomerKey = c.CustomerKey
GROUP BY
    c.CustomerName
ORDER BY
    Revenue DESC;&lt;/PRE&gt;&lt;P&gt;This single example teaches the agent:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Which fact table contains Sales.&lt;/LI&gt;&lt;LI&gt;How Customer should be joined.&lt;/LI&gt;&lt;LI&gt;How Revenue is aggregated.&lt;/LI&gt;&lt;LI&gt;How customer-level grouping works.&lt;/LI&gt;&lt;LI&gt;How Top N ranking should behave.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;Instructions explain the rule. Example queries demonstrate the pattern.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;A few carefully chosen examples are usually more valuable than dozens of near-identical queries.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;10. Limitations to Keep in Mind&lt;/H2&gt;&lt;P&gt;Data Source Instructions improve context, but they do not turn a SQL source into a governed semantic model.&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Instructions do not repair poor data modeling.&lt;/LI&gt;&lt;LI&gt;Do not place every business KPI inside SQL instructions.&lt;/LI&gt;&lt;LI&gt;Stored values may need to be documented explicitly.&lt;/LI&gt;&lt;LI&gt;Example queries are patterns, not hard-coded answers.&lt;/LI&gt;&lt;LI&gt;Too many examples can create noise.&lt;/LI&gt;&lt;LI&gt;SQL Data Source Instructions are different from Semantic Model AI Instructions.&lt;/LI&gt;&lt;/OL&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H2&gt;11. Final Thought&lt;/H2&gt;&lt;P&gt;Building a reliable Fabric Data Agent is not about writing the longest possible prompt. It is about putting the right context at the right layer.&lt;BR /&gt;&lt;BR /&gt;Use metadata to explain the data. Use Semantic Model AI Instructions to govern how the model is interpreted. Use Data Source Instructions and examples to guide SQL generation. Use Data Agent Instructions to govern orchestration, response behavior, visuals, and guardrails.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;The goal is not more instructions. It is less ambiguity.&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;That is what moves a Fabric Data Agent from a successful demo toward governed conversational analytics.&lt;/P&gt;&lt;H2&gt;References&lt;/H2&gt;&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/fundamentals/data-agent-consumption" target="_blank"&gt;Microsoft Learn: Data Agent consumption&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/semantic-model-best-practices" target="_blank"&gt;Microsoft Learn: Semantic model best practices for Data Agent&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-configurations" target="_blank"&gt;Microsoft Learn: Configure your Data Agent&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-visuals" target="_blank"&gt;Microsoft Learn: Visual responses from a Fabric Data Agent&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-routing" target="_blank"&gt;Microsoft Learn: Improve Data Source routing&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://github.com/hardiksri/fabric-data-agent-instructions" target="_blank"&gt;GitRep - AI Instruction Framework&lt;/A&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;EM&gt;What have you found most difficult when moving a Fabric Data Agent from a proof of concept into a governed production experience? Share your experience in the comments.&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 13:34:16 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Building-a-Better-Microsoft-Fabric-Data-Agent-Instructions/ba-p/5364431</guid>
      <dc:creator>Praful_Potphode</dc:creator>
      <dc:date>2026-09-08T13:34:16Z</dc:date>
    </item>
    <item>
      <title>Why Refresh the Whole Model When Only One Table Changed? Power BI Finally Lets You Choose</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Why-Refresh-the-Whole-Model-When-Only-One-Table-Changed-Power-BI/ba-p/5365465</link>
      <description>&lt;P&gt;&lt;STRONG&gt;The problem: refreshing everything when you only needed a little&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Picture a semantic model with a few tables: a large Sales fact table that updates every day, a Products table that changes maybe once a month, and a Currency Exchange Rate table that barely changes at all. For as long as most of us have used Power BI, hitting "Refresh" meant refreshing the entire model - every table, every time, whether it actually needed it or not.&lt;/P&gt;
&lt;P&gt;Worse, a normal refresh always did two things at once: it checked whether anything about your data source's structure had changed (a schema sync), and then it reloaded all the actual data. Most of the time you only care about one of those. You just want fresh numbers in your Sales table - you don't need Power BI to re-check whether your Currency table's column structure changed, because it never does. But there was no way to say "just get me new data, skip the schema check," or "refresh only this one table." You got the whole thing, every time.&lt;/P&gt;
&lt;P&gt;This wasn't just an annoyance - for larger models, refreshing everything when you only needed a fraction of it meant longer waits, more load on your source systems, and refresh operations eating into your daily refresh limits for no good reason.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The old way to get around this&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you needed genuinely granular control before this update, your only real option was going through the XMLA endpoint or the REST API - writing code to say "refresh just this table" or "refresh just this partition." This worked, but it required Premium or Fabric capacity, technical setup, and honestly, a level of comfort with scripting that most report builders don't have or need for day-to-day work. For anyone just using the standard Power BI Service interface, there was no such option - it was full refresh or nothing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What changed&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In the August 2026 update, Power BI brought this kind of control directly into the Service UI, no scripting required. You now get two separate improvements working together:&lt;/P&gt;
&lt;P&gt;First, refresh type options. Instead of one generic "Refresh" button that always does a schema sync plus a data refresh, you can now choose exactly what you want:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;- Refresh schema and data&lt;/STRONG&gt; - the original all-in-one behavior, still available when you genuinely need both&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;- Sync schema only &lt;/STRONG&gt;- checks and applies any structural changes from your data source, like new columns, without reloading all the data&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;- Refresh data only&lt;/STRONG&gt; - reloads fresh data without checking for schema changes at all&lt;/P&gt;
&lt;P&gt;Second, table-level refresh. Instead of applying that choice to your entire model, you can now apply it to just one specific table.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A real example&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Back to our Sales, Products, and Currency Exchange Rate model. Say it's the middle of a regular business day, and you just want today's sales numbers updated - nothing else has changed.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the semantic model in Model view within the Power BI Service.&lt;/LI&gt;
&lt;LI&gt;Instead of hitting the generic top-level Refresh button, find the Sales table specifically.&lt;/LI&gt;
&lt;LI&gt;Choose Refresh data only for just that table.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Power BI reloads fresh data into Sales, and leaves Products and Currency Exchange Rate completely untouched - no unnecessary schema check, no reloading tables that didn't need it. What used to be a full-model operation is now a targeted, few-second action.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Where this saves the most time&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;- Large models with tables that update on very different schedules - a fast-changing fact table alongside slow-changing dimension tables that rarely need touching&lt;/P&gt;
&lt;P&gt;- Direct Lake models specifically, where a Lakehouse table might have gained new columns, you're not ready to bring into your model yet - you can refresh the data without pulling in that schema change&lt;/P&gt;
&lt;P&gt;- Anyone managing refresh limits or capacity usage, where cutting unnecessary schema syncs and full-model reloads adds up to real savings over dozens of refreshes a day&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What to keep in mind&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This is a Power BI Service feature, so it's something you'll do from the web interface managing a published semantic model, not from Power BI Desktop while you're building. It's also worth remembering that "Sync schema only" and "Refresh data only" are meant to be used thoughtfully - if you genuinely don't know whether a data source's structure has changed recently, doing a full "Refresh schema and data" occasionally is still the safer choice, especially before a report goes out to a client or stakeholder.&lt;/P&gt;
&lt;P&gt;If you've been refreshing an entire model out of habit when only one table actually needed it, this is worth checking out the next time you're in the Power BI Service.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Thanks for reading!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Connect with me on:&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/pankajnamekar/" target="_blank"&gt;LinkedIn&lt;/A&gt;&amp;nbsp;|&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;&lt;A href="https://www.youtube.com/@datawithpankaj_com" target="_blank"&gt;Data With Pankaj - YouTube&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 08 Sep 2026 13:26:20 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Why-Refresh-the-Whole-Model-When-Only-One-Table-Changed-Power-BI/ba-p/5365465</guid>
      <dc:creator>pankajnamekar25</dc:creator>
      <dc:date>2026-09-08T13:26:20Z</dc:date>
    </item>
    <item>
      <title>Fabric Influencers Spotlight: August 2026</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-Influencers-Spotlight-August-2026/ba-p/5365378</link>
      <description>&lt;P&gt;Explore the August Fabric Influencers Spotlight featuring community-driven guidance, tutorials, AI use cases, and Power BI insights from Microsoft MVPs and Fabric Super Users. Discover practical examples of Microsoft Fabric in action across governance, data engineering, analytics, real-time intelligence, and AI.&lt;/P&gt;</description>
      <pubDate>Thu, 10 Sep 2026 18:01:37 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-Influencers-Spotlight-August-2026/ba-p/5365378</guid>
      <dc:creator>slindsay</dc:creator>
      <dc:date>2026-09-10T18:01:37Z</dc:date>
    </item>
    <item>
      <title>How to Connect Salesforce to Power BI from Inside Salesforce</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-Salesforce-to-Power-BI-from-Inside-Salesforce/ba-p/5364380</link>
      <description>&lt;P&gt;Learn how to connect Salesforce to Power BI, manage reusable data sources inside Salesforce, securely authenticate Power BI connections, and embed finished Power BI reports back into Salesforce dashboards.&lt;/P&gt;</description>
      <pubDate>Fri, 04 Sep 2026 15:17:14 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-Salesforce-to-Power-BI-from-Inside-Salesforce/ba-p/5364380</guid>
      <dc:creator>metrica</dc:creator>
      <dc:date>2026-09-04T15:17:14Z</dc:date>
    </item>
    <item>
      <title>Fabric Data Warehouse best practices for medallion architectures</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-Data-Warehouse-best-practices-for-medallion-architectures/ba-p/5364080</link>
      <description>&lt;P&gt;Part three of a series on medallion architecture with Fabric Data Warehouse.&lt;/P&gt;
&lt;P&gt;Good medallion architecture is mostly operational discipline.&lt;/P&gt;
&lt;P&gt;In&amp;nbsp;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://community.fabric.microsoft.com/blog/fbc_fabricupdatesblogs/choosing-your-medallion-pattern-in-fabric-data-warehouse/5328670" target="_blank" rel="noopener" data-lia-auto-title="part&amp;nbsp;one&amp;nbsp;of this series" data-lia-auto-title-active="0"&gt;part&amp;nbsp;one&amp;nbsp;of this series&lt;/A&gt;, we chose the pattern, and in&amp;nbsp;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://community.fabric.microsoft.com/blog/fbc_fabricupdatesblogs/building-the-bronze-%E2%86%92-silver-%E2%86%92-gold-layers/5360201" target="_blank" rel="noopener" data-lia-auto-title="part&amp;nbsp;two" data-lia-auto-title-active="0"&gt;part&amp;nbsp;two&lt;/A&gt;, we filled in the Bronze, Silver, and Gold layers. Now comes the part that usually determines whether the architecture holds up in production: the operating rules. Many medallion architectures look great on paper but become difficult to maintain as data volumes, business requirements, and consumers grow.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A medallion pipeline is easy to explain and easy to demo. It is more challenging to keep clean over time. The challenges usually start small: row-by-row loads, report-specific logic in the wrong place, transformations that cannot be safely rerun, or Gold tables that slowly become another staging layer.&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Why this matters&lt;/STRONG&gt;&amp;nbsp;&lt;/H2&gt;
&lt;P&gt;Most medallion problems are not caused by the&amp;nbsp;names&amp;nbsp;Bronze, Silver, and Gold. They happen because the pipeline stops behaving like a pipeline.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Bronze starts cleaning. Silver starts serving dashboards. Gold starts compensating for upstream data quality. Before long, nobody&amp;nbsp;knows&amp;nbsp;where a rule belongs, and every change feels risky.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The goal of best practices is not to add ceremony. The goal is to make the pipeline predictable: predictable loads, repeatable transformations, trusted outputs, and clear places to look when something breaks.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Best practice 1:&amp;nbsp;Batch the writes&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Fabric DW is built for set-based work. Treat ingestion and transformations as batches, not as a stream of tiny row-by-row operations.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In Bronze, that usually means using COPY INTO, Fabric Pipelines, or other bulk-loading patterns to land data in raw tables. If you are&amp;nbsp;loading from&amp;nbsp;files, aim for fewer well-sized files instead of many tiny ones. When practical, files in the 100 MB to 1 GB range are a healthier starting point than a long tail of small files.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In Silver and Gold, the same idea&amp;nbsp;applies:&amp;nbsp;prefer set-based T-SQL transformations, CTAS, INSERT...SELECT, and MERGE patterns over procedural row-at-a-time logic.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Do this well&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Load Bronze in&amp;nbsp;batches, and&amp;nbsp;avoid trickle inserts when the source can be staged first.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Add ingestion metadata, such as source file name and load timestamp, so every batch is traceable.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Keep operational logging lightweight. If you need very high-write audit events, do not turn the warehouse into a single-row logging engine.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Let Bronze preserve the batch; let Silver decide what is valid.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; if a load pattern creates a large number of tiny writes, fix the load pattern before tuning the query.&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Best practice 2:&amp;nbsp;Make Silver rerunnable&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Silver is where the pipeline earns trust. That means&amp;nbsp;Silver&amp;nbsp;transformations need to be repeatable, testable, and safe to rerun.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If an upstream source reloads, or a cleansing rule changes, you should know how to rebuild the affected&amp;nbsp;Silver&amp;nbsp;tables without guessing which reports need to be patched. This is where idempotent design matters: a transformation should produce the same result when&amp;nbsp;run&amp;nbsp;again against the same inputs.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In Fabric DW, use CTAS when you want to materialize a clean table from a query, INSERT...SELECT for controlled incremental loads, and MERGE when&amp;nbsp;late-arriving&amp;nbsp;or changed data needs to update existing&amp;nbsp;Silver&amp;nbsp;rows.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Do this well&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Design transformations so they can run again without duplicating or corrupting data.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Use staging tables when the logic is complex. A few clear steps are easier to&amp;nbsp;operate&amp;nbsp;than one unreadable query.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Put quality gates in Silver:&amp;nbsp;required&amp;nbsp;fields, valid formats, duplicate handling, and reason codes for rejected records.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Choose precise data types and lengths. Silver is the right place to turn loose source data into reliable analytical data.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; if a report needs to clean the data again, Silver did not finish its job.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Best practice 3:&amp;nbsp;Shape Gold for consumption&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Gold is not just “the final table.” Gold is the business-facing serving layer. It should be modeled around how people ask questions, not around how the source systems store data.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For some workloads, that means a star schema with fact and dimension tables. For others, it means a data mart, a wide reporting table, or a pre-aggregated summary. The pattern matters less than the principle: Gold should make the common analytical path simple, fast, and trustworthy.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is also where you should be careful not to let Gold become a junk drawer. If Gold is full of one-off fixes, report-specific exceptions, and raw technical fields, the layer is doing too much.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Do this well&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Model the grain explicitly. A fact table without a clear grain becomes hard to explain and harder to debug.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Pre-aggregate where the business repeatedly asks the same question.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Hide technical fields that helped the pipeline but do not help the consumer.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Keep Gold dependent on Silver by default. Direct Gold-to-Bronze&amp;nbsp;dependencies should be rare and deliberate.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; Gold should answer the business question quickly without making the report author rediscover the pipeline.&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Best practice 4: Use Fabric DW defaults, but do not fight the engine&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Fabric DW gives you a SQL warehouse over Delta data in&amp;nbsp;OneLake. That means you get transactional behavior, optimized storage patterns, and a managed engine that handles many physical decisions for you.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The practical&amp;nbsp;advice: &lt;/STRONG&gt;do not bring every habit from traditional data warehousing with you. You do not need to micromanage distribution or&amp;nbsp;indexing&amp;nbsp;the same way you would in older platforms. Focus first on healthy data layout, set-based transformations, good table design, and predictable query patterns.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;At the same time, do not ignore the basics. Query performance still&amp;nbsp;benefits&amp;nbsp;from clean data types, useful statistics, well-shaped&amp;nbsp;Gold&amp;nbsp;tables, and avoiding unnecessary scans.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Do this well&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Keep V-Order and platform&amp;nbsp;optimizations on&amp;nbsp;unless you have a measured reason to change them.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Use the performance guidance for Fabric Data Warehouse before inventing custom tuning patterns.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Check query behavior when a&amp;nbsp;Gold&amp;nbsp;table becomes critical to many reports.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Treat advanced exceptions as exceptions. Most teams should start with the defaults and tune only when evidence says to tune.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; tune from evidence, not from habit.&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Best practice 5: Monitor by layer&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;A medallion pipeline should be observable at each layer. If a dashboard is wrong or slow, you should be able to tell whether the issue started in&amp;nbsp;Bronze&amp;nbsp;ingestion, Silver transformation, or Gold serving.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In Fabric DW, use Query Insights and the warehouse monitoring views to understand query behavior, expensive operations, and refresh patterns. Pair that with pipeline-level monitoring so you can see not only whether a job failed, but where the failure happened.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Measure the pipeline in terms the team can act on:&amp;nbsp;Bronze&amp;nbsp;load duration,&amp;nbsp;Silver&amp;nbsp;transformation duration, rejected-record counts,&amp;nbsp;Gold&amp;nbsp;refresh duration, and&amp;nbsp;Gold&amp;nbsp;query performance.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Do this well&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Track load and refresh duration by layer.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Log the number of records received, accepted, rejected, and published.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Watch critical&amp;nbsp;Gold&amp;nbsp;queries after&amp;nbsp;refresh, especially the ones that feed executive dashboards or widely used semantic models.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Keep operational alerts tied to business impact. A failed&amp;nbsp;Gold&amp;nbsp;refresh matters differently from a delayed&amp;nbsp;Bronze&amp;nbsp;load.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; if you cannot tell which layer failed, your monitoring is not layer-aware enough.&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Before moving a medallion pipeline into production, use the following checklist to verify that each layer is&amp;nbsp;operating&amp;nbsp;as intended.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;The best-practice checklist&amp;nbsp;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Area&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Bronze&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Silver&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Gold&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Write pattern&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Batch&amp;nbsp;ingest&amp;nbsp;with metadata&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Set-based transformations&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Scheduled refreshes&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Quality rule&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Preserve what arrived&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Validate, conform, and flag&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Expose trusted fields only&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Performance focus&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Avoid tiny writes&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Keep logic rerunnable&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Shape for common queries&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;col style="width: 25.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Takeaway&amp;nbsp;&lt;/H2&gt;
&lt;P&gt;Part&amp;nbsp;two&amp;nbsp;of this series&amp;nbsp;was about one job per layer. Part&amp;nbsp;three&amp;nbsp;is about&amp;nbsp;operating&amp;nbsp;each job&amp;nbsp;like&amp;nbsp;it matters.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Batch the&amp;nbsp;writes. Make Silver rerunnable. Shape Gold for consumption. Use Fabric DW’s managed engine instead of fighting it. Monitor the pipeline by layer so failures are easy to&amp;nbsp;locate&amp;nbsp;and fixes happen in the right place.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you follow those rules, your medallion architecture becomes less fragile over time, not more.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This post is part of our Medallion Architecture on Fabric Data Warehouse series:&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;A href="https://community.fabric.microsoft.com/blog/fbc_fabricupdatesblogs/choosing-your-medallion-pattern-in-fabric-data-warehouse/5328670" target="_blank" rel="noopener"&gt;Choosing your medallion pattern in Fabric Data Warehouse&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://community.fabric.microsoft.com/blog/fbc_fabricupdatesblogs/building-the-bronze-%E2%86%92-silver-%E2%86%92-gold-layers/5360201" target="_blank" rel="noopener"&gt;Building the Bronze → Silver → Gold layers&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Fabric DW best practices for medallion architectures&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Securing and governing your layers&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Performance tuning your medallion pipeline&amp;nbsp;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Ready to go deeper? Explore the&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-warehouse/guidelines-warehouse-performance" target="_blank" rel="noopener"&gt;Microsoft Fabric Data Warehouse performance guidelines&lt;/A&gt;&amp;nbsp;and&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-warehouse/ingest-data" target="_blank" rel="noopener"&gt;ingestion guidance&lt;/A&gt;, then stay tuned for Part four of this series, where we’ll cover securing and governing your layers.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 03 Sep 2026 21:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-Data-Warehouse-best-practices-for-medallion-architectures/ba-p/5364080</guid>
      <dc:creator>Scirqueira</dc:creator>
      <dc:date>2026-09-03T21:00:00Z</dc:date>
    </item>
    <item>
      <title>Workspace Outbound Access Protection (OAP) for Operations Agent and Fabric Maps (Preview)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Workspace-Outbound-Access-Protection-OAP-for-Operations-Agent/ba-p/5363817</link>
      <description>&lt;P&gt;Co-authors: Andre Terceros and Bodhisatva Gautam&lt;/P&gt;
&lt;P&gt;Workspace Outbound Access Protection (OAP) in Microsoft Fabric helps WS admins secure outbound connections from workspace items to external resources. Administrators can control outbound access by blocking unwanted connections by default and allowing only approved connections through configured rules.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As organizations adopt AI-powered operations at scale, governance and security remain at critical requirements. With this preview release, Microsoft Fabric introduces Outbound Access Protection (OAP) for Operations Agent and Fabric Maps, enabling workspace administrators to control the outbound actions an agent can perform.&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;OAP for Operations Agent&lt;/H2&gt;
&lt;P&gt;When OAP is enabled, Operations Agent continues to perform core functions including reasoning, recommendation generation, rule evaluation, and telemetry collection. However, outbound actions are governed by the workspace's configured access policies. Administrators gain greater visibility through in-product notifications, Teams messaging experiences, and the Operations Agent Activity Log, making it easier to identify and troubleshoot blocked actions.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;&lt;EM&gt;Figure: Outbound Access Protection helps workspace administrators govern outbound Operations Agent actions while providing clear visibility when actions are blocked.&lt;/EM&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;What's new with Operations Agent and OAP?&lt;/H3&gt;
&lt;P&gt;With Outbound Access Protection support for Operations Agent, workspace administrators gain more control over how agent-initiated actions interact with external services and resources. The following updates improve governance, visibility, and operational oversight while helping organizations continue to automate with confidence.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Govern outbound agent actions through workspace-level OAP policies.&lt;/LI&gt;
&lt;LI&gt;Control whether Operations Agent can send Teams notifications based on allowed connections.&lt;/LI&gt;
&lt;LI&gt;Prevent unauthorized cross-workspace actions when OAP policies restrict outbound access.&lt;/LI&gt;
&lt;LI&gt;Receive clear visibility when actions are blocked through in-product notifications and Teams messaging experiences.&lt;/LI&gt;
&lt;LI&gt;Monitor agent activity and OAP-related outcomes through the Operations Agent Activity Log.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;
&lt;P&gt;&lt;EM&gt;Figure: Activity Log Operations Details show the steps the agent completed and each action’s status, including when an action is blocked.&lt;/EM&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;H2&gt;OAP for Maps&lt;/H2&gt;
&lt;P&gt;Fabric Maps can connect to a variety of data sources, including Lakehouse across Fabric workspaces, Kusto databases (KQL), Ontologies as well as external geospatial services such as Web Map Services (WMS), Web Map Tile Services (WMTS), and Web Feature Services (WFS).&lt;/P&gt;
&lt;P&gt;Workspace Outbound Access Protection helps organizations maintain security and compliance by governing outbound connections and requiring explicit approval before a map can access external resources.&lt;/P&gt;
&lt;P&gt;With OAP enabled, Fabric Maps follows a "default deny" model, ensuring only approved destinations can be accessed.&lt;/P&gt;
&lt;H3&gt;How it Works&lt;/H3&gt;
&lt;P&gt;When Workspace Outbound Access Protection is enabled on a workspace, Fabric Maps evaluates outbound connectivity at multiple stages:&lt;/P&gt;
&lt;H3&gt;Save and Load Operations&lt;/H3&gt;
&lt;P&gt;Whenever a map is created, updated, or loaded, Fabric evaluates all referenced data sources against the workspace policy.&lt;/P&gt;
&lt;P&gt;If a data source isn't permitted:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;References are blocked&lt;/LI&gt;
&lt;LI&gt;Disallowed sources are redacted when the map is opened&lt;/LI&gt;
&lt;LI&gt;Attempts to save unsupported references are rejected&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Runtime Data Access&lt;/H3&gt;
&lt;P&gt;Map visuals continuously retrieve data such as:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Map tiles&lt;/LI&gt;
&lt;LI&gt;Geospatial features&lt;/LI&gt;
&lt;LI&gt;Query results&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Before each outbound request is executed, Fabric validates the destination against the workspace's outbound access protection policy.&lt;/P&gt;
&lt;H3&gt;External Service Validation&lt;/H3&gt;
&lt;P&gt;External geospatial services such as WMS, WMTS, and WFS are validated through Data Movement and Transformation Services (DMTS). DMTS acts as a policy enforcement layer and ensures only explicitly approved external endpoints can be reached.&lt;/P&gt;
&lt;H3&gt;Supported Connection Scenarios&lt;/H3&gt;
&lt;H3&gt;Lakehouse&lt;/H3&gt;
&lt;P&gt;Lakehouse connectivity receives the most flexibility under the current release.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Lakehouse within the same workspace are always allowed.&lt;/LI&gt;
&lt;LI&gt;Lakehouse in other workspaces can be allowed using Data Connection Rules.&lt;/LI&gt;
&lt;LI&gt;Administrators maintain granular control over cross-workspace access.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;External Geospatial Services&lt;/H3&gt;
&lt;P&gt;Organizations can securely connect to approved WMS, WMTS, and WFS services.&lt;/P&gt;
&lt;P&gt;By using Data Connection Rules with the &lt;STRONG&gt;Geospatial Web Services&lt;/STRONG&gt; connection type, administrators can create an allow list of approved endpoints.&lt;/P&gt;
&lt;P&gt;This enables scenarios such as:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Accessing enterprise GIS systems&lt;/LI&gt;
&lt;LI&gt;Consuming approved mapping services&lt;/LI&gt;
&lt;LI&gt;Integrating with external geospatial data providers&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Kusto Databases and Ontologies&lt;/H3&gt;
&lt;P&gt;Connections to Kusto databases and Ontologies within the same workspace continue to function normally.&lt;/P&gt;
&lt;P&gt;Cross-workspace connectivity for these sources is currently blocked when OAP is enabled. Future releases will introduce additional policy controls for these connection types.&lt;/P&gt;
&lt;H3&gt;Configuring Fabric Maps with Workspace OAP&lt;/H3&gt;
&lt;P&gt;Enabling protection is straightforward:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Enable Workspace Outbound Access Protection for the workspace.&lt;/LI&gt;
&lt;LI&gt;Create Data Connection Rules that define approved destinations.&lt;/LI&gt;
&lt;LI&gt;Add approved external geospatial services using the Fabric connection experience.&lt;/LI&gt;
&lt;LI&gt;Configure Geospatial Web Services rules to authorize required endpoints.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Once configured, Fabric Maps can access only the approved destinations specified by policy.&lt;/P&gt;
&lt;H3&gt;Security by Design&lt;/H3&gt;
&lt;P&gt;Workspace OAP for Fabric Maps follows several key security principles:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Explicit Allow Lists:&lt;/STRONG&gt; Only approved destinations can be reached. All other outbound connectivity is automatically blocked.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Consistent Enforcement: &lt;/STRONG&gt;Policies are applied during authoring, loading, and runtime execution, ensuring continuous protection throughout the lifecycle of a map.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fail-Closed Protection&lt;/STRONG&gt;: If policy validation services become unavailable, Fabric denies cross-workspace connections by default. This fail-closed behavior helps prevent unintended data exposure during service disruptions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;What’s next?&lt;/H2&gt;
&lt;P&gt;We are actively working to expand OAP support for additional experiences and plan to add support for Power BI Semantic Models and Reports soon in GA soon.&lt;/P&gt;
&lt;P&gt;Your feedback is essential! Let us know how we can make Fabric even more secure and flexible for your workloads by sharing your feedback at &lt;A class="lia-external-url" href="https://community.fabric.microsoft.com/t5/Fabric-Ideas/idb-p/fbc_ideas/label-name/fabric%20platform%20%7C%20security" target="_blank" rel="noopener"&gt;Fabric Ideas – Microsoft Fabric Community&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;Learn more&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/security/workspace-outbound-access-protection-overview" target="_blank" rel="noopener"&gt;Workspace outbound access protection overview&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/security/workspace-outbound-access-protection-operations-agent" target="_blank" rel="noopener"&gt;Outbound Access Protection for Operations Agent (Preview)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/security/workspace-outbound-access-protection-fabric-maps" target="_blank" rel="noopener"&gt;Workspace Outbound Access Protection for Fabric Maps&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 03 Sep 2026 20:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Workspace-Outbound-Access-Protection-OAP-for-Operations-Agent/ba-p/5363817</guid>
      <dc:creator>BisiAdele</dc:creator>
      <dc:date>2026-09-03T20:00:00Z</dc:date>
    </item>
    <item>
      <title>Manage Fabric connections at scale with connection recency in Fabric REST APIs</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Manage-Fabric-connections-at-scale-with-connection-recency-in/ba-p/5363147</link>
      <description>&lt;H3&gt;Understand Connection Recency&lt;/H3&gt;
&lt;P&gt;Connections are shared infrastructure in Microsoft Fabric. Pipelines, dataflows, semantic models, and other Fabric items use them to reach data sources without storing connection details and credentials in every item. Connection Recency adds the context administrators need to understand how each connection is being used. If you go to “Manage Connections and Gateways” in Fabric settings and open the settings of any connection, the following information card will populate:&lt;/P&gt;
&lt;img&gt;Figure: Connection Recency shows when a connection was created, last linked to an item, and last used to access credentials.&lt;/img&gt;
&lt;P&gt;The card provides three insights:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Created on&lt;/STRONG&gt; shows when the connection was created.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Last Bound to items&lt;/STRONG&gt; shows when an item was most recently associated with the connection. &lt;STRONG&gt;By any user&lt;/STRONG&gt; reflects activity across the tenant, and&amp;nbsp;&lt;STRONG&gt;B&lt;/STRONG&gt;&lt;STRONG&gt;y me&lt;/STRONG&gt; is specific to the viewer.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Last credentials&lt;/STRONG&gt; &lt;STRONG&gt;used&lt;/STRONG&gt; shows when a workload most recently used the connection credentials. It also separates activity&amp;nbsp;&lt;STRONG&gt;B&lt;/STRONG&gt;&lt;STRONG&gt;y any user&lt;/STRONG&gt; from activity&amp;nbsp;&lt;STRONG&gt;B&lt;/STRONG&gt;&lt;STRONG&gt;y me&lt;/STRONG&gt;, which is the current user.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Linking and usage are different events. A connection can be linked but never used, or it could have been linked a long time ago to an item that still runs every day. Credential-use information can also be up to 30 minutes behind real time, so use it for governance and investigation rather than immediate usage monitoring.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Learn more in the &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-factory/data-source-management#connection-recency-preview" target="_blank" rel="noopener"&gt;Data source management documentation&lt;/A&gt;.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Why enterprise connection management becomes difficult&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;Connections can grow exponentially across a large organization. Every team, project, environment, gateway, and data source can introduce more connections. Over time, names become inconsistent, employees move on, and multiple connections can point to the same endpoint. The Fabric interface is useful for inspecting one connection, but reviewing recency and ownership one connection at a time does not scale to an enterprise inventory.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This creates three common problems:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Stale connections:&lt;/STRONG&gt; A connection may no longer support an active workload, but its name, creation date, and Last Bound Date do not prove that it is unused. Administrators need both Last Bound Date and Last Credential Use signals before deciding what to review or retire.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Duplicate connections: &lt;/STRONG&gt;Different display names can hide equivalent connection definitions. Duplicates increase credential maintenance, complicate troubleshooting, and make it harder to establish a preferred connection which dilutes the advantage of connection sharing and reuse across a tenant.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Ownership risk:&lt;/STRONG&gt; A connection with only one person as an owner can become orphaned when that person leaves the organization. The connection might then be unavailable for administration or no longer usable by dependent workloads.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The REST APIs make it possible to evaluate these risks across every connection the caller can access. In the case of cloud connections, you can only see connections where you are the owner, but the admin for a gateway can see all connections on the gateway. This provides better scalability than the UI.&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Using the APIs to manage connections&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;You can use the APIs to identify stale and duplicate connections for removal and to help mitigate the issue of single user ownership. Gateways in Fabric have a limit of 1,000 connections, so managing and governing your connections will help you stay under that limit.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now that we understand each of the three scenarios, let’s see what the API can provide to help us handle each scenario:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Stale connections: &lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LastBoundDateTime&lt;/STRONG&gt; is the first of two signals we can use. If this is NULL, then it is currently not being used by a Fabric item and would be a candidate for removal. The one catch is that connections bound prior to recency being introduced will also show NULL, so we must filter out anything with a CreatedDateTime earlier than the introduction of the recency feature. Recency came out in preview at the end of March 2026, so my example code will filter anything created prior to May 1, 2026, to play it safe.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;The second signal we have is the &lt;STRONG&gt;LastCredentialUsedDateTime&lt;/STRONG&gt;, which indicates the last time the connection was used by any item. You can change this in the example code, but I’m going to use 90 days. You might have connections that legitimately get used less frequently, such as year-end runs or only during the holiday season, so keep that in mind when reviewing and adjust accordingly.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Duplicate connections:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;It is possible for two connections to have identical configurations except for the DisplayName. This defeats the purpose of having shareable connections, so we’ll need to use the&amp;nbsp;&lt;STRONG&gt;LastCredentialUsedDateTime&lt;/STRONG&gt; to determine which one was most recently used and flag any others to be considered for removal or consolidation. We’ll use ConnectionType, ConnectionPath, ConnectivityType, and GatewayID to identify duplicates. There are other columns you may want to add, such as CredentialType or ConnectionEncryption, depending on what you consider duplicate in your specific environment.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Ownership risk:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;For ownership continuity, you want to identify connections whose only&amp;nbsp;&lt;STRONG&gt;Owner&lt;/STRONG&gt; role assignment is a &lt;STRONG&gt;User&lt;/STRONG&gt;, then add another approved owner. This helps avoid having an orphaned connection if an owner gets deleted. Adding a Microsoft Entra group is preferred because group membership can be maintained as people join, leave, or change responsibilities. A second individual owner is better than a single owner, but it does not provide the same durable operating model as group ownership.&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;MYTH: A common misconception is that a connection fails when its owner account is deleted. In reality, what matters is the credential being used for authentication. When you create a connection that uses OAuth, you become the owner and your OAuth credential is typically used. If your account is later deleted, the connection fails because it can no longer authenticate with that credential, not because ownership changed. If the connection instead uses an SPN and is shared with another user, it will continue to work.&amp;nbsp;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Explore the &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/connections/list-connections" target="_blank" rel="noopener"&gt;List Connections&lt;/A&gt;, &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/connections/list-connection-role-assignments" target="_blank" rel="noopener"&gt;List Connection Role Assignments&lt;/A&gt;, and &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/connections/add-connection-role-assignment" target="_blank" rel="noopener"&gt;Add Connection Role Assignment&lt;/A&gt; documentation for the complete request, pagination, identity, and permission details.&lt;/P&gt;
&lt;H3&gt;Next steps&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;Run the &lt;A class="lia-external-url" href="https://github.com/microsoft/fabric-toolbox/tree/main/samples/fabric-connection-management" target="_blank" rel="noopener"&gt;companion notebook&lt;/A&gt; first. The notebook is designed as a Python notebook to be run in the Fabric Python runtime and not the PySpark Python runtime. There will be a section for each of the previous scenarios. Stale and duplicate connections will be shown so you can review before deciding what to remove, but that part will be up to you. You can use the data frame and pass the connection ID values to the &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/connections/delete-connection?tabs=HTTP" target="_blank" rel="noopener"&gt;Delete Connection API&lt;/A&gt;. If you don’t know how to write that part, then it’s a great opportunity to use Copilot.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The ownership section will show you all connections with a single owner where you will want to add another owner. As a best practice, we’ll assume you are adding a group, but that part will be commented out as you very likely do not want to blatantly add the same group to every connection across the board. You can use the &lt;A class="lia-external-url" href="https://learn.microsoft.com/rest/api/fabric/core/connections/add-connection-role-assignment?tabs=HTTP" target="_blank" rel="noopener"&gt;Add Connection Role Assignment API&lt;/A&gt; to make those additions as you need.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Connection recency data gives you the signals you need to manage connections at scale, but it should be the starting point for review rather than the basis for automatic removal. Use the &lt;A class="lia-external-url" href="https://github.com/microsoft/fabric-toolbox/tree/main/samples/fabric-connection-management" target="_blank" rel="noopener"&gt;companion notebook&lt;/A&gt; to identify potentially stale or duplicate connections and connections with a single owner, then apply your organization’s requirements before taking action. Regularly reviewing these signals can help you reduce unnecessary connections, improve ownership continuity, and establish a more manageable connection inventory.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 03 Sep 2026 19:50:43 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Manage-Fabric-connections-at-scale-with-connection-recency-in/ba-p/5363147</guid>
      <dc:creator>ryanjadams</dc:creator>
      <dc:date>2026-09-03T19:50:43Z</dc:date>
    </item>
  </channel>
</rss>

