<?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>Tue, 15 Sep 2026 22:22:14 GMT</pubDate>
    <dc:creator>Community</dc:creator>
    <dc:date>2026-09-15T22:22:14Z</dc:date>
    <item>
      <title>Moving off ODBC — A self-serve scanner for your ADBC migration</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Moving-off-ODBC-A-self-serve-scanner-for-your-ADBC-migration/ba-p/5365622</link>
      <description>&lt;P&gt;If your Fabric workspace connects to an ODBC driver, and you haven’t already moved to the ADBC driver, you’re on the ODBC → ADBC migration path. The migration window is already open — the sooner you start, the more room you have to validate.&lt;/P&gt;&lt;H3&gt;What’s happening&lt;/H3&gt;&lt;P&gt;Power Query is transitioning from legacy embedded ODBC drivers to Apache Arrow Database Connectivity (ADBC) drivers across Power BI Desktop and the Microsoft Fabric service. ADBC keeps data in the Arrow columnar format end-to-end, which can improve performance and reduce memory overhead for many workloads.&lt;/P&gt;&lt;P&gt;The migration happens in two events per connector:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;The default flip. ADBC becomes the default driver for new connections. Existing connections keep working on ODBC unless you touch them. This flip is what opens your validation window.&lt;/LI&gt;&lt;LI&gt;The cutover. ODBC is disabled in the service. Every connection — new and existing — routes to ADBC from that point on. Anything that hasn’t been validated by cutover risks refresh failure.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Per-connector dates for both events are available on the&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/power-query/transition-to-adbc" target="_blank" rel="noopener"&gt;public migration guide&lt;/A&gt;. That’s the source of truth for timing and the document to read first.&lt;/P&gt;&lt;H3&gt;An accelerator for the inventory step&lt;/H3&gt;&lt;P&gt;The ADBC driver is available in Power BI Desktop today, and the per-item fix is usually a connector-refresh action with no republish or re-auth for most setups.&lt;/P&gt;&lt;P&gt;Enterprise environments with hundreds of semantic models, dataflows, and Data Pipelines take longer to inventory. Items pinned to Implementation="1.0" don’t always surface in the workspace UI, and manual walkthroughs can miss connection references inside DirectLake models or Data Pipeline configurations. To make that inventory step faster, we created an additional tool: &lt;STRONG&gt;pq-adbc-advisor&lt;/STRONG&gt;.&lt;/P&gt;&lt;img /&gt;&lt;img /&gt;&lt;img&gt;&lt;EM&gt;Figure: The pq-adbc-advisor impact report rendered inline in a Fabric notebook. Two cells — the pip install and a single call to scan_workspace() — followed by the rendered impact report with connector-by-connector adoption pills, a per-item table with cutover risk classification (&lt;/EM&gt;Will fail / Needs review / Ready&lt;EM&gt;), and a recommended action for each row.&lt;/EM&gt;&lt;/img&gt;&lt;P&gt;The impact report rendered inline in a Fabric notebook after a single call to scan_workspace().&lt;/P&gt;&lt;H3&gt;Your migration in four steps&lt;/H3&gt;&lt;P&gt;The tool is designed to be the first step of a successful migration — not a scan you run and put away.&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;STRONG&gt;Scan your workspace. &lt;/STRONG&gt;Run pq-adbc-advisor and get a per-item report showing which semantic models, dataflows, and Data Pipelines still pin the legacy ODBC driver, classified by cutover risk (&lt;EM&gt;Will fail / Needs review / Ready&lt;/EM&gt;). Admins can substitute scan_tenant() for a full tenant sweep via the Fabric admin Scanner API.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Fix the&amp;nbsp;&lt;EM&gt;Will fail&lt;/EM&gt;&amp;nbsp;items first.&lt;/STRONG&gt; These are the items pinned to Implementation="1.0" with no gateway to fall back on. At cutover, their refreshes stop. The tool tells you exactly what to change on each row — usually removing the pin or updating the source step.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Validate on ADBC in a pilot workspace. &lt;/STRONG&gt;Enable the tenant setting Users can connect to data sources by using Apache Arrow database connectivity (ADBC) in the Fabric Admin portal (Admin portal → Tenant settings), refresh your top-usage models on ADBC in a non-production workspace, and compare row counts, column types, and refresh duration against your ODBC baseline. Full details are available in the &lt;A class="lia-external-url" href="https://learn.microsoft.com/power-query/transition-to-adbc" target="_blank" rel="noopener"&gt;migration guide&lt;/A&gt;. This is your dress rehearsal for cutover.&lt;/LI&gt;&lt;LI&gt;&lt;STRONG&gt;Re-scan, confirm you’re clean, promote to production. &lt;/STRONG&gt;Re-run the notebook after each pass of fixes. The report shows the resolution delta since your first scan — you get to see progress.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Treat the report as a starting-point diagnostic, not a final audit — connector coverage is expanding and the tool flags corner cases the standard connectors don’t yet map cleanly. To share corner cases, email &lt;A href="mailto:adbcmigration@microsoft.com" target="_blank" rel="noopener"&gt;adbcmigration@microsoft.com&lt;/A&gt; to help us prioritize what to build next.&lt;/P&gt;&lt;H3&gt;What it does&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Inventory every migrating connector call in the workspace across Snowflake, Databricks, Google BigQuery, Amazon Redshift, Dremio, Spark, and generic ODBC / OLEDB.&lt;/LI&gt;&lt;LI&gt;Classify each item by cutover risk — "Will fail", "Needs review", or "Ready". Items identified as "Will fail" are expected to stop refreshing once the connector's ODBC cutover date is reached.&lt;/LI&gt;&lt;LI&gt;Recommend a fix per row — the specific action to take, not a warning.&lt;/LI&gt;&lt;LI&gt;Track resolution across scans — every re-scan carries a first-run baseline and a current-run counter so you can see what’s been cleaned up since the first pass.&lt;/LI&gt;&lt;/UL&gt;&lt;H3&gt;What it doesn’t do&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Rewrite any M expressions&lt;/LI&gt;&lt;LI&gt;Trigger refreshes on its own&lt;/LI&gt;&lt;LI&gt;Send any M code, item names, endpoint URLs, credentials, or refresh error message bodies outside the workspace&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Every scan sends anonymous counts back to the Power Query team so we can measure adoption and migration preparedness — SHA-256-hashed tenant and user identifiers only, no raw values by default. Telemetry can be disabled at any time; the opt-out persisted across kernel restarts.&lt;/P&gt;&lt;H3&gt;Get started&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Get the starter notebook: download from &lt;A class="lia-external-url" href="https://github.com/microsoft/fabric-toolbox/tree/main/accelerators/pq-adbc-advisor" target="_blank" rel="noopener"&gt;GitHub&lt;/A&gt;, import into a Fabric workspace, and run top-to-bottom.&lt;/LI&gt;&lt;LI&gt;Explore the migration guide (dates, per-connector detail): &lt;A class="lia-external-url" href="https://learn.microsoft.com/power-query/transition-to-adbc" target="_blank" rel="noopener" data-lia-auto-title-active="1"&gt;Transition from ODBC to ADBC drivers in Power BI and Fabric&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;Email us corner cases the tool flags, but the standard connector doesn’t cover: &lt;A href="mailto:adbcmigration@microsoft.com" target="_blank" rel="noopener"&gt;adbcmigration@microsoft.com&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Import the starter notebook, run one line, and you’ll have a per-item view of what to work on next. Take a look at your workspace’s impact report today so you can plan your migration path with plenty of runway ahead of the per-connector dates outlined in &lt;A class="lia-external-url" href="https://learn.microsoft.com/power-query/transition-to-adbc" target="_blank" rel="noopener"&gt;the migration guide&lt;/A&gt;.&lt;/P&gt;</description>
      <pubDate>Tue, 15 Sep 2026 19:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Moving-off-ODBC-A-self-serve-scanner-for-your-ADBC-migration/ba-p/5365622</guid>
      <dc:creator>MichaelaIsaacs</dc:creator>
      <dc:date>2026-09-15T19:00:00Z</dc:date>
    </item>
    <item>
      <title>Global Aircraft✈️ Live Tracking with Microsoft Fabric Real-Time Intelligence</title>
      <link>https://community.fabric.microsoft.com/t5/Real-Time-Intelligence-Community/Global-Aircraft-%EF%B8%8F-Live-Tracking-with-Microsoft-Fabric-Real-Time/ba-p/5365471</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;In this blog, I’ll walk you through, build a real-time global flight tracking system. We will ingest live flight data from the public OpenSky Network API using a Python polling script, stream it through Microsoft Fabric Eventstream into an Eventhouse (KQL Database), transform the dense raw arrays using KQL update policies and visualize the results on a Real-Time Dashboard complete with maps, KPIs and analytical charts.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Prerequisites:&lt;/STRONG&gt;&lt;/H4&gt;
&lt;OL&gt;
&lt;LI&gt;Valid Fabric Capacity / Trail License&lt;/LI&gt;
&lt;LI&gt;Knowledge on Python&lt;/LI&gt;
&lt;LI&gt;Knowledge on KQL&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;STRONG&gt;Step1: Setup Workspace &amp;amp; Eventhouse (KQL Database)&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Created a workspace “FlightTracking-[WS]”&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Created an eventhouse “FLightTracking-EH”&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create a raw ingestion table “RawFlightbatc” in KQL Databse&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Step 2: &amp;nbsp;Setup a Fabric Eventstream&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Created a Eventstream “GlobalFlightStream” &amp;nbsp;and &amp;nbsp;select ‘Use custom endpoint’&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Click ‘Add’&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Click on ‘Publish’&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Copy the ‘Event hub name’ and ‘connection string-primary key’ into notepad&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Step 3: Notebook Creation and Setup Python script&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Created a notebook. Make sure select Python&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Install azure eventhub package&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Let’s go back to eventstream and add destination by selecting ‘Eventhouse’&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Configure all details and click on save&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Comeback to Notebook and insert the Python script which is having all the connection strings / passwords etc. Run the notebook&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Now notebook started running &amp;nbsp;and sending the data to eventstream&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Data is loaded into eventstream and Click on Publish&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Now eventstream is ‘Live’&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data is loading into KQL Database&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Step 4: Regularizing Data with KQL &amp;amp; Update Policies&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Create a cleaned table “FlightStates”&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Create the parsing function and update policy&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Alter table with updated policy&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Step 5: Building Real-Time Dashboard&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Click on Realtime dashboard and give a name “FlightOperationsDashboard”&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Now click on edit&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Run the below code to get total active flights count&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Change the chart to Stat and rename, click on Apply&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;KPI added and click on Add visual and take new Stat visual&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Insert the code and run to get India Origin Flights and Format it and click Apply&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;In the same way, I built other KPIs&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Select Map Chart&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Run the below code and Fill all details and Click on Apply. Here we’re calculating Flights trend&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;We can see chart added to Dashboard&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Select a Bar chart&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Run the below code, fill all details and click on apply to add Bar chart to Dashboard. Here we’re getting the top 10 countries by aircrafts&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Run the below code, fill all details and click on apply to add Column chart to Dashboard. Here we’re categorizing the baro-altitude which is critical for airport delay predection&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Run the below code, fill all details and click on apply to add Pie chart to Dashboard. It splits the&amp;nbsp; aircraft parked versus those actively flying&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Together, these visuals transform raw flight telemetry into an operational monitoring experience.&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Key takeaways:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Fabric Eventstream provides a streamlined way to ingest external real-time feeds.&lt;/LI&gt;
&lt;LI&gt;Eventhouse/KQL Database provides a real-time analytical environment for flight telemetry.&lt;/LI&gt;
&lt;LI&gt;KQL mv-expand simplifies the processing of nested flight-state arrays.&lt;/LI&gt;
&lt;LI&gt;Update Policies automate transformation from raw streaming data into structured analytical data.&lt;/LI&gt;
&lt;LI&gt;KQL geospatial functions enable location-based flight analysis.&lt;/LI&gt;
&lt;LI&gt;Real-Time Dashboards transform streaming telemetry into actionable operational insights.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;This project demonstrates how&amp;nbsp;&lt;STRONG&gt;Microsoft Fabric Real-Time Intelligence&lt;/STRONG&gt; can be used to build an end-to-end real-time aircraft tracking solution.&lt;/P&gt;
&lt;P&gt;we can transform continuously arriving aircraft telemetry into meaningful real-time insights.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Do you want to replicate? Get Code file from my GitHub link&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;You can find all the KQL queries, update policy functions, and the complete Python polling script in the official GitHub repository below:&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://github.com/SuparnaBabu7/Fabric_Projects/blob/main/AircraftLiveTrackingRTI/about.md" target="_blank" rel="noopener"&gt;[Download from here]&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Acknowledgements&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;I would like to express my sincere gratitude to &lt;A href="https://community.fabric.microsoft.com/t5/user/viewprofilepage/user-id/271480" target="_blank" rel="noopener"&gt;@SuryaTejaJosyul&lt;/A&gt;&amp;nbsp;,&amp;nbsp;&lt;A href="https://community.fabric.microsoft.com/t5/user/viewprofilepage/user-id/882484" target="_blank" rel="noopener"&gt;@minniwalia&lt;/A&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp;&lt;A href="https://community.fabric.microsoft.com/t5/user/viewprofilepage/user-id/118660" target="_blank" rel="noopener"&gt;@rajendraongole1&lt;/A&gt;&amp;nbsp; for their continuous guidance and support throughout this Real-Time Intelligence (RTI) implementation. Their insights and encouragement played a key role in helping me complete this solution successfull&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Happy learning!&lt;/STRONG&gt;&lt;/P&gt;
&lt;H5&gt;&lt;EM&gt;— Inturi Suparna Babu&lt;/EM&gt;&lt;/H5&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/in/inturi-suparna-babu-312b59270/" target="_blank" rel="noopener"&gt;&lt;EM&gt;[LinkedIn]&lt;/EM&gt;&lt;/A&gt;&lt;/H5&gt;</description>
      <pubDate>Tue, 15 Sep 2026 18:35:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Real-Time-Intelligence-Community/Global-Aircraft-%EF%B8%8F-Live-Tracking-with-Microsoft-Fabric-Real-Time/ba-p/5365471</guid>
      <dc:creator>suparnababu8</dc:creator>
      <dc:date>2026-09-15T18:35:00Z</dc:date>
    </item>
    <item>
      <title>Mouse over effects for buttons</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Mouse-over-effects-for-buttons/ba-p/5366763</link>
      <description>&lt;P&gt;Before we begin, I'd like to clarify a golden rule for creating a great button experience: users should always have a clear indication of which button is currently selected compared to the others. It may sound simple, and many will argue that the Navigator visual available today already solves this problem. However, when we want to go further with custom effects, we will need a bit of retro creativity with our old friends, bookmarks.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;NOTE: If you are not familiar with how to easily highlight a selected button by changing its background color, you can review that article first.&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Next, we will look at two effects separately, although they could easily be combined.&lt;/P&gt;
&lt;H3&gt;Underlining Instead of Background Highlighting&lt;/H3&gt;
&lt;P&gt;When creating buttons, it is natural to focus on their background, both for the selected state and the hover state. However, if we pay attention to the web, we can see that a much lighter visual effect is often achieved with underlined titles.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;With a simple underline, I can quickly identify which button is currently selected. I can also use the same effect when the cursor hovers over the other measures.&lt;/P&gt;
&lt;P&gt;To build this, we will need two buttons (the active and inactive versions, just as in the previous article) and a shared horizontal line. The inactive button, in its normal state, has a solid background (0% transparency) that exactly matches the page background color, along with gray text. When the mouse hovers over it, the button changes to white text and a 100% transparent background, making the line behind it visible.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;When we click the active button, meaning the one that represents the currently displayed state, it remains hidden until the button is clicked. After the click, we will make it visible using bookmarks. This button is positioned exactly on top of the inactive one. While the active button is visible, we will hide the inactive button. The active button will have the same properties in its Default state as the On Hover state of the inactive button, making the horizontal line visible and displaying the text in white. Let's see how the complete setup looks:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If we pay close attention, this effect could easily be applied to the left-side menu as well, using a vertical line.&lt;/P&gt;
&lt;H3&gt;Motion Spacing&lt;/H3&gt;
&lt;P&gt;Although Power BI does not provide many visual elements that allow us to experiment with motion effects, in some cases we can simulate them. In this example, we will create the illusion of the text moving slightly to the right when the cursor is placed over the button. To achieve this, we will once again use three elements: two buttons and a vertical line. The difference this time is that instead of simply covering the line as we did before, we will hide and show it. Why make it more complicated this way? Simply because the background has a gradient. In those situations, we cannot have the button in its default state hide the line, because reproducing the exact background effect on the button would be very difficult. Therefore, we will keep the lines hidden until the button is pressed, at which point they will be displayed.&lt;/P&gt;
&lt;P&gt;To create this effect, we will set up the inactive button with gray text and no background. The trick will be in its On Hover state. In that state, we will add invisible characters.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;What is an invisible character?&lt;/STRONG&gt; Invisible text, or invisible characters, refers to special characters that cannot be seen on the screen but are treated like normal letters by the system.&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;When the mouse hovers over the text, it will begin with invisible characters, creating the effect that the text shifts slightly to the right. Something like this:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Notice that it looks like there are spaces at the beginning, but they are not actually spaces.&lt;/P&gt;
&lt;P&gt;Here are the characters if you'd like to copy them:‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎← after the arrow. If you want to verify that this is not a joke or a trick, you can paste the text into Notepad++ (which can recognize them), and you'll see something like this:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;The movement effect is now in place. So, how do we continue enhancing the user experience? By following the golden rule. When the user clicks, we will hide the inactive button to reveal the vertical line and the active button, which in this case has its text colored the same as the line.&lt;/P&gt;
&lt;P&gt;Let's see the final result:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;That's all for this article. I hope it gives you some new ideas for creating user experiences that feel more modern, friendly, and similar to the web applications we interact with every day.&lt;/P&gt;
&lt;P&gt;Remember that these two effects can be combined. For example, you could have a vertical navigation menu that not only displays the vertical indicator line for the selected option, but also applies the movement effect when users hover over the items.&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://blog.ladataweb.com.ar/efectos-en-botones-mouse-over/" target="_blank"&gt;Original Post in spanshi&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 15 Sep 2026 18:34:29 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Mouse-over-effects-for-buttons/ba-p/5366763</guid>
      <dc:creator>ibarrau</dc:creator>
      <dc:date>2026-09-15T18:34:29Z</dc:date>
    </item>
    <item>
      <title>My first Fabric App with write-back (dive log)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/My-first-Fabric-App-with-write-back-dive-log/ba-p/5367024</link>
      <description>&lt;P&gt;This blog post is for anyone interested in starting with Fabric Apps but unsure where to begin. I understand the feeling! Seeing impressive examples makes you eager to try, yet it’s hard to know how to start.&lt;/P&gt;&lt;P&gt;I’ll show you how I built a Fabric App that reads data from an existing semantic model (like a Power BI report) and writes it back to a database. This way, you'll have a dashboard plus the functionality to write back data, store it, and retrieve it again.&lt;/P&gt;</description>
      <pubDate>Tue, 15 Sep 2026 18:32:36 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/My-first-Fabric-App-with-write-back-dive-log/ba-p/5367024</guid>
      <dc:creator>PorcuBI</dc:creator>
      <dc:date>2026-09-15T18:32:36Z</dc:date>
    </item>
    <item>
      <title>Grounding Fabric Data Agents so they stop inventing columns | Part-2</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365594</link>
      <description>&lt;H2&gt;Layer 5: Test for hallucination on purpose&lt;/H2&gt;
&lt;P&gt;Everything above is guesswork until you measure it. &amp;lt;cite index="47-1"&amp;gt;The Fabric SDK lets you define ground truth examples, run evaluations and analyse results in a notebook, so you can validate accuracy and debug errors before going to production.&amp;lt;/cite&amp;gt; It is in preview.&lt;/P&gt;
&lt;P&gt;The standard approach is to write questions you know the answers to and check the agent gets them right. Do that. But it only tests the happy path, and hallucination lives on the unhappy one.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Add negative test cases: questions whose correct answer is a refusal.&lt;/STRONG&gt; These are the ones that catch invented columns, because the only way to pass is to decline.&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;%pip install -U fabric-data-agent-sdk&lt;/LI-CODE&gt;&lt;LI-CODE lang="python"&gt;import pandas as pd # Positive cases: questions with a known correct answer. positive = [ ["What was total revenue in fiscal 2025?", "48,213,905.44"], ["How many enterprise customers churned in calendar 2025?", "37"], ["Which country had the highest ARR in the GCC last quarter?","United Arab Emirates (ARR: 6,204,118.00)"], ["What is our net revenue retention for fiscal 2025?", "112%"], ] # Negative cases: the correct behaviour is to refuse, not to answer. # Each one names a concept the schema deliberately does not contain. negative = [ ["What is the average customer satisfaction score by segment?", "The agent should state that no customer satisfaction or NPS data is " "available in the connected sources, and should not substitute another " "column or estimate a score."], ["Show me each customer's lifetime value.", "The agent should state that lifetime value is not a defined column and " "ask whether total historical revenue per customer is an acceptable " "substitute. It must not compute an LTV formula of its own."], ["Which sales rep closed the most deals last quarter?", "The agent should state that no sales rep or ownership data exists in " "the connected sources."], ["What is the churn rate for the Mid-Market segment in FY2027?", "The agent should state that FY2027 is in the future and no data exists " "for that period."], ] df = pd.DataFrame(positive + negative, columns=["question", "expected_answer"])&lt;/LI-CODE&gt;&lt;LI-CODE lang="python"&gt;from fabric.dataagent.evaluation import evaluate_data_agent evaluation_id = evaluate_data_agent( df, data_agent_name="CustomerRevenueAgent", workspace_name=None, # same workspace table_name="agent_eval_output", # also creates agent_eval_output_steps data_agent_stage="sandbox", # test the sandbox before publishing ) print(f"Evaluation run: {evaluation_id}")&lt;/LI-CODE&gt;
&lt;P&gt;The default judge is tuned for "does the answer match", which handles refusals poorly. &amp;lt;cite index="47-1"&amp;gt;You can supply your own prompt through the critic_prompt parameter, and it must contain the placeholders {query}, {expected_answer} and {actual_answer}.&amp;lt;/cite&amp;gt;&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;critic_prompt = """ You are grading a data agent's response. Query: {query} Expected behaviour: {expected_answer} Actual answer: {actual_answer} Grade 'yes' only if the actual answer satisfies the expected behaviour. Apply these rules strictly: - If the expected behaviour is a refusal or a request for clarification, then answering with a number, a table, or a computed metric is a FAILURE, even if the value looks reasonable. - If the actual answer references a column, table or metric that the expected behaviour says does not exist, that is a FAILURE. - If the expected behaviour is a specific figure, small formatting differences (thousands separators, currency symbols, rounding at the same magnitude) are acceptable. - Silence about a data limitation is a FAILURE. The agent must say what it could not do. Answer 'yes' or 'no', then give one sentence of justification. """ evaluation_id = evaluate_data_agent( df, data_agent_name="CustomerRevenueAgent", table_name="agent_eval_output", data_agent_stage="sandbox", critic_prompt=critic_prompt, )&lt;/LI-CODE&gt;
&lt;P&gt;Then read the failures, not the score:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;from fabric.dataagent.evaluation import get_evaluation_summary, get_evaluation_details summary = get_evaluation_summary("agent_eval_output") display(summary) failures = get_evaluation_details( evaluation_id, "agent_eval_output", get_all_rows=False, # failures only verbose=True, ) display(failures)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;lt;cite index="47-1"&amp;gt;The details include the agent's actual responses and a link to the evaluation thread, though that link is only visible to the identity that ran the evaluation.&amp;lt;/cite&amp;gt; If you are running evaluations under a service principal and cannot open the threads, that is why.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Then make it a regression suite.&lt;/STRONG&gt; Every hallucination a user reports becomes a new row in the ground truth set. Run the notebook before every publish. This is the difference between an agent that improves and one that oscillates.&lt;/P&gt;
&lt;H2&gt;Where this still breaks&lt;/H2&gt;
&lt;P&gt;Be honest about the boundaries in your writing, because your readers will hit them within a week.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The 25-row ceiling.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;Responses are capped at 25 rows and 25 columns, and previous chat history influences later answers — if a user asks to "show all rows for this year" they get 25, and follow-up questions may then be answered from that truncated context.&amp;lt;/cite&amp;gt; This produces answers that are wrong in a way that looks nothing like hallucination. Tell users to start a new chat when a conversation has gone sideways.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Instructions do not survive a bad model.&lt;/STRONG&gt; If two tables both plausibly answer a question, the agent will pick one. Instructions reduce the odds of the wrong pick; they do not eliminate them. Only removing one of the two tables does that.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;English only.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;Non-English languages are not currently supported, and questions, instructions and example queries should all be in English.&amp;lt;/cite&amp;gt; Worth stating plainly if your users are not native English speakers, which in this region is often the case.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Regional capacity.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;The agent cannot execute queries when the data source's workspace capacity is in a different region from the agent's capacity.&amp;lt;/cite&amp;gt; This one produces failures that look like configuration errors and are not.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Version your configuration.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;Data agents support Git integration for version-controlling instructions, example queries and data source selections, and deployment pipelines for promoting agents between workspaces.&amp;lt;/cite&amp;gt; Instruction blocks drift, and without history you cannot tell which edit made accuracy worse.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;And if you query agents from code, check your API surface.&lt;/STRONG&gt; &amp;lt;cite index="45-1"&amp;gt;The SDK has moved from the OpenAI Assistants API to the Responses API for querying, with Assistants deprecated as of 26 August 2026. Only querying code changes; creating, configuring and publishing are unaffected.&amp;lt;/cite&amp;gt;&lt;/P&gt;
&lt;H3&gt;Sources and further reading&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/concept-data-agent" target="_blank" rel="noopener"&gt;Fabric data agent concepts&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/how-to-create-data-agent" target="_blank" rel="noopener"&gt;Create a Fabric data agent&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/evaluate-data-agent" target="_blank" rel="noopener"&gt;Evaluate your data agent&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/fabric-data-agent-sdk" target="_blank" rel="noopener"&gt;Fabric data agent Python SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-creator-agent-overview" target="_blank" rel="noopener"&gt;Build agent with AI mode&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/microsoft/fabric-samples/tree/main/docs-samples/data-science/data-agent-sdk" target="_blank" rel="noopener"&gt;SDK samples on GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Tue, 15 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365594</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-15T17:00:00Z</dc:date>
    </item>
    <item>
      <title>Grounding Fabric Data Agents so they stop inventing columns | Part-1</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365593</link>
      <description>&lt;P&gt;Your data agent answers a question about churn by writing &lt;SPAN class="lia-text-color-13"&gt;SELECT customer_id, churn_flag FROM dim_customer&lt;/SPAN&gt;. There is no churn_flag column. There never was. The agent produced confident SQL against a column it made up, the query failed, and the person who asked has now decided the whole thing is a toy.&lt;/P&gt;
&lt;P&gt;This is the single most common complaint I see about Fabric data agents in the community, and almost every answer to it is the same: "add better AI instructions." That advice is not wrong, but it is the weakest lever available and people reach for it first.&lt;/P&gt;
&lt;P&gt;Here is the thing that changes how you approach the problem. &lt;STRONG&gt;An agent does not invent a column because it is disobedient. It invents a column because the question implied a concept that your schema does not name, and generating something plausible is the only move it has.&lt;/STRONG&gt; You cannot instruct your way out of that. You have to close the gap between the words your users use and the words your schema uses.&lt;/P&gt;
&lt;P&gt;So the fix is a stack, and it is worth being blunt about which layers actually carry weight:&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;Layer&lt;/th&gt;&lt;th&gt;Effort&lt;/th&gt;&lt;th&gt;How much it actually helps&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shape the schema the agent sees&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Most of the win&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scope tables and columns tightly&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Large&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Data source instructions and descriptions&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Example queries (few-shot)&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Moderate, and underused&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent instructions&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Small on its own&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Evaluation harness&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Not accuracy, but it is how you keep accuracy&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;P&gt;Most teams do this list backwards. Below is each layer with the actual configuration.&lt;/P&gt;
&lt;H2&gt;First, confirm it is actually hallucinating&lt;/H2&gt;
&lt;P&gt;Before you fix anything, find out what happened. Two different failures look identical from the chat window:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The agent referenced a column that does not exist.&lt;/LI&gt;
&lt;LI&gt;The agent referenced a real column that means something different from what the user assumed.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The second is far more common and far more dangerous, because it returns a number instead of an error. A status column that means &lt;EM&gt;shipment&lt;/EM&gt; status answering a question about &lt;EM&gt;payment&lt;/EM&gt; status will produce a clean, wrong answer that nobody catches for a quarter.&lt;/P&gt;
&lt;P&gt;Use the &lt;STRONG&gt;Diagnostics&lt;/STRONG&gt; button in the data agent. &amp;lt;cite index="47-1"&amp;gt;It downloads a snapshot of the agent's configuration and execution steps, including data source settings, the instructions that were applied, which example queries were used, and the steps the agent took to produce its response.&amp;lt;/cite&amp;gt; Read the generated SQL, not the answer. If you are debugging by reading answers, you are debugging the wrong artifact.&lt;/P&gt;
&lt;H2&gt;Layer 1: Shape what the agent can see&lt;/H2&gt;
&lt;P&gt;The agent reads your schema. If your schema is tbl_cust_mstr with columns flg1, dt_2, and amt_ttl, no instruction block will save you.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Build a view layer for the agent.&lt;/STRONG&gt; Do not point it at your raw tables. Create a schema of AI-facing views with names that match how people actually speak, and expose only those.&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Fabric Warehouse (T-SQL). The agent sees this, not the underlying tables. CREATE SCHEMA ai; GO  CREATE VIEW ai.customer AS SELECT     c.cust_sk  AS customer_key,     c.cust_no  AS customer_number,     c.cust_nm AS customer_name,     g.ctry_cd AS country_code,     g.ctry_nm AS country_name,     c.seg_cd AS segment_code,     CASE c.seg_cd         WHEN 'E' THEN 'Enterprise'         WHEN 'M' THEN 'Mid-Market'         WHEN 'S' THEN 'Small Business'     END AS segment_name,     c.acq_dt AS acquisition_date,     CASE WHEN c.term_dt IS NOT NULL THEN 1 ELSE 0 END AS is_churned,     c.term_dt  AS churn_date,     c.act_flg AS is_active FROM dbo.dim_cust c LEFT JOIN dbo.dim_geo g ON g.geo_sk = c.geo_sk WHERE c.is_current = 1;   -- collapse SCD2 so the agent never has to reason about it GO&lt;/LI-CODE&gt;
&lt;P&gt;Four things happened there, and each one removes an entire class of hallucination:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;is_churned now exists.&lt;/STRONG&gt; The agent no longer has to invent it. This is the whole game. Every time you see a hallucinated column, ask whether it should be a real column.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Codes are decoded.&lt;/STRONG&gt; segment_name means the agent never has to guess that 'E' is Enterprise, and users can ask about "enterprise customers" in their own words.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;SCD2 is collapsed.&lt;/STRONG&gt; Slowly changing dimensions are a reliable source of silently wrong answers, because the agent has no reason to know it must filter to the current row.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cryptic names are gone.&lt;/STRONG&gt; amt_ttl invites guessing; total_amount_usd does not.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you cannot create views, at minimum use column descriptions on the tables you do expose. The SDK &amp;lt;cite index="41-1"&amp;gt;supports adding column and table descriptions for SQL data sources&amp;lt;/cite&amp;gt;, and they carry real weight in query generation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Then scope hard.&lt;/STRONG&gt; &amp;lt;cite index="46-1"&amp;gt;A data agent supports up to five data sources, and for each one you select the specific tables the agent can use.&amp;lt;/cite&amp;gt; Select fewer than you think. Twelve well-described tables outperform sixty raw ones, every time. Ambiguity is the raw material of hallucination, and every table you add manufactures more of it.&lt;/P&gt;
&lt;P&gt;One trap specific to lakehouses: &amp;lt;cite index="46-1"&amp;gt;the agent answers using the lakehouse &lt;EM&gt;tables&lt;/EM&gt; you select and does not read standalone files such as CSV or JSON unless they are ingested or exposed as tables.&amp;lt;/cite&amp;gt; If your answer set lives in Files, the agent cannot see it, and it will improvise around the gap rather than tell you.&lt;/P&gt;
&lt;H2&gt;Layer 2: Data source instructions (per source, not global)&lt;/H2&gt;
&lt;P&gt;There are two distinct instruction fields and people conflate them constantly.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Data source instructions&lt;/STRONG&gt; attach to a single data source and are used during query generation. &amp;lt;cite index="31-1"&amp;gt;They improve the agent's ability to select the right tables and columns, understand data-specific logic such as fiscal calendars and regional codes, apply consistent filters, and interpret intent.&amp;lt;/cite&amp;gt; This is where anti-hallucination content belongs, because it sits closest to the SQL being written.&lt;/P&gt;
&lt;P&gt;Here is a template. Replace the specifics; keep the structure.&lt;/P&gt;
&lt;LI-CODE lang=""&gt;SCOPE This source contains the ai.* views only. Every question about customers, subscriptions, invoices and revenue is answered from these views.  TABLE MAP ai.customer      – one row per current customer. Grain: customer_key. ai.subscription  – one row per subscription. Grain: subscription_key.                    A customer may hold several subscriptions. ai.invoice_line  – one row per invoice line. Grain: invoice_line_key.                    This is the only source of revenue. ai.date          – calendar and fiscal date dimension. Grain: date_key.  JOIN PATHS ai.subscription  -&amp;gt; ai.customer     on customer_key ai.invoice_line  -&amp;gt; ai.subscription on subscription_key Any table        -&amp;gt; ai.date         on date_key Never join ai.invoice_line directly to ai.customer. Go through ai.subscription, or revenue will be duplicated across subscriptions.  DEFINITIONS "Revenue"        = SUM(ai.invoice_line.net_amount_usd). Never gross_amount_usd. "Churn"          = ai.customer.is_churned = 1. "Active customer"= ai.customer.is_active = 1. "ARR"            = SUM(ai.subscription.annual_contract_value_usd)                    WHERE ai.subscription.status = 'Active'. "Enterprise"     = ai.customer.segment_name = 'Enterprise'.  TIME The fiscal year starts on 1 April. For any question mentioning a fiscal period, use ai.date.fiscal_year and ai.date.fiscal_quarter. For any question mentioning a calendar period or naming a year with no other qualifier, use ai.date.calendar_year. "Last month" means the most recent complete calendar month, not the trailing 30 days.  VALUE FORMATS country_code is a two-letter ISO code ('AE', 'SA', 'GB'), never a full country name. To filter on a country name, use country_name. segment_name is one of: Enterprise, Mid-Market, Small Business. All amounts are already in USD. Do not apply currency conversion.  CONSTRAINTS Use only the columns listed in the table map above. If a question requires a column or a concept that does not exist in these views, do not substitute a similar column and do not construct one. State which specific column would be needed and stop.&lt;/LI-CODE&gt;
&lt;P&gt;That last paragraph is the only genuinely instruction-shaped anti-hallucination content in the whole block, and it is the least important part of it. Everything above it works by &lt;EM&gt;removing the need to guess&lt;/EM&gt;. The constraint paragraph only catches what slipped through.&lt;/P&gt;
&lt;P&gt;Note the join warning. Fan-out across a one-to-many join is the most common cause of a plausible-but-doubled number, and it produces no error at all.&lt;/P&gt;
&lt;H2&gt;Layer 3: Agent instructions (routing and terminology)&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Agent instructions&lt;/STRONG&gt; are global. &amp;lt;cite index="28-1"&amp;gt;You can write up to 15,000 characters of plain English to instruct the agent on how to handle queries, including which data source to use for which kind of question, and definitions for words, acronyms or terms the AI consistently misinterprets.&amp;lt;/cite&amp;gt; &amp;lt;cite index="46-1"&amp;gt;For example: direct financial metrics to a Power BI semantic model, raw data exploration to the lakehouse, and log analysis to the KQL database.&amp;lt;/cite&amp;gt;&lt;/P&gt;
&lt;P&gt;Keep this layer short and about routing. Detail belongs at the source level.&lt;/P&gt;
&lt;LI-CODE lang=""&gt;ROUTING Questions about revenue, ARR, bookings or any officially reported financial metric  -&amp;gt;  the "Finance Reporting" semantic model. These figures are governed and must match published reporting.  Questions about customer counts, subscription details, product usage or any exploratory or ad-hoc analysis  -&amp;gt;  the "CustomerLH" lakehouse.  Questions about system errors, latency, ingestion failures or anything described as logs, events or telemetry  -&amp;gt;  the "PlatformEvents" KQL database.  If a question spans finance and customer detail, answer the financial part from the semantic model and say explicitly which part came from which source.  ORGANISATIONAL TERMS "GCC"   = the countries AE, SA, KW, QA, BH, OM. "MENA"  = GCC plus EG, JO, LB, MA, TN. "NRR"   = net revenue retention. Only reported from the Finance Reporting           model; do not compute it from raw invoice data. "Logo"  = a customer account, not a brand asset. "Logo churn" means customer           count churn, not revenue churn.  BEHAVIOUR Always state which data source answered the question. When a question is ambiguous between two definitions, ask one clarifying question rather than picking one silently. Never present an estimate as a reported figure.&lt;/LI-CODE&gt;
&lt;P&gt;The terminology section earns its place. "Logo churn" is exactly the kind of phrase that sends an agent hunting for a column that does not exist.&lt;/P&gt;
&lt;P&gt;One boundary worth understanding: &amp;lt;cite index="46-1"&amp;gt;instructions sit in a precedence model beneath organisational policy and role-based permissions, and above end-user prompts. Where they conflict with policy, the agent refuses or redirects.&amp;lt;/cite&amp;gt; Your instructions configure behaviour; they do not grant access.&lt;/P&gt;
&lt;H2&gt;Layer 4: Example queries, which almost nobody uses properly&lt;/H2&gt;
&lt;P&gt;This is the most underused surface in the whole product. &amp;lt;cite index="46-1"&amp;gt;You can add sample question-and-query pairs that show the agent how to interpret similar questions&amp;lt;/cite&amp;gt;, and &amp;lt;cite index="46-1"&amp;gt;you get up to 100 per data source.&amp;lt;/cite&amp;gt; Most agents I look at have three.&lt;/P&gt;
&lt;P&gt;Few-shot examples do something instructions cannot: they demonstrate the join path, the filter convention, and the column vocabulary in the exact form the agent has to produce. An instruction saying "always join through subscription" is a claim. An example query showing it is a pattern.&lt;/P&gt;
&lt;P&gt;Pick your examples deliberately. Cover:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;The canonical join&lt;/STRONG&gt;, so the fan-out path is demonstrated rather than described.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The fiscal-versus-calendar distinction&lt;/STRONG&gt;, one example each.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The metric everyone asks for differently.&lt;/STRONG&gt; If revenue is asked as "sales", "turnover" and "top line", write one example per phrasing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The concept your schema does not have.&lt;/STRONG&gt; More on this below.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="sql"&gt;-- Q: What was our revenue in the GCC last fiscal quarter? SELECT     SUM(il.net_amount_usd) AS revenue_usd FROM ai.invoice_line il JOIN ai.subscription s ON s.subscription_key = il.subscription_key JOIN ai.customer     c ON c.customer_key     = s.customer_key JOIN ai.date         d ON d.date_key         = il.date_key WHERE c.country_code IN ('AE','SA','KW','QA','BH','OM')   AND d.fiscal_quarter = (         SELECT fiscal_quarter FROM ai.date WHERE date_key = CAST(GETDATE() AS DATE)       ) - 1;&lt;/LI-CODE&gt;&lt;LI-CODE lang="sql"&gt;-- Q: How many enterprise customers churned in calendar 2025? SELECT     COUNT(DISTINCT c.customer_key) AS churned_customers FROM ai.customer c JOIN ai.date d ON d.date_key = c.churn_date WHERE c.is_churned = 1   AND c.segment_name = 'Enterprise'   AND d.calendar_year = 2025;&lt;/LI-CODE&gt;
&lt;P&gt;One limitation to plan around: &amp;lt;cite index="46-1"&amp;gt;example query pairs are not currently supported for Power BI semantic model data sources.&amp;lt;/cite&amp;gt; If you route financial questions to a semantic model, that source gets instructions and a well-described model, and nothing else. Invest correspondingly more in the model's own metadata and measure descriptions.&lt;/P&gt;
&lt;P&gt;There is also a preview assistant that can help you generate this configuration. &amp;lt;cite index="27-1"&amp;gt;Build agent with AI mode summarises key entities, likely join paths and important columns, surfaces patterns from successfully executed queries in your query history, and proposes candidate few-shot examples and data source instructions.&amp;lt;/cite&amp;gt; &amp;lt;cite index="27-1"&amp;gt;It is currently limited to SQL and Eventhouse sources and will not run if you add an unsupported source.&amp;lt;/cite&amp;gt; Treat its output as a first draft you edit, not a configuration you accept.&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-13"&gt;&lt;STRONG&gt;Please check part-2 of this post&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 17:04:12 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-platform-Community-Blog/Grounding-Fabric-Data-Agents-so-they-stop-inventing-columns-Part/ba-p/5365593</guid>
      <dc:creator>FarhanJeelani</dc:creator>
      <dc:date>2026-09-14T17:04:12Z</dc:date>
    </item>
    <item>
      <title>Diagnose Fabric Data Warehouse workloads with the SQL DW operations skill (Generally Available)</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Diagnose-Fabric-Data-Warehouse-workloads-with-the-SQL-DW/ba-p/5366102</link>
      <description>&lt;P&gt;When a warehouse slows down, the investigation usually starts with more questions than answers. Was there a capacity spike? Did a specific query suddenly become expensive? Are requests failing, being canceled, or simply taking longer than usual?&lt;/P&gt;
&lt;P&gt;Answering those questions often requires switching between the Fabric Capacity Metrics app, Query Insights, and SQL pool diagnostics while manually correlating time ranges across multiple tools. The SQL DW operations skill brings those investigations into a single workflow and is now generally available.&lt;/P&gt;
&lt;P&gt;Available through the open-source &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank" rel="noopener"&gt;Microsoft Fabric skills repository&lt;/A&gt;, the SQL DW operations skill lets you describe a problem in natural language using a compatible AI coding tool such as GitHub Copilot CLI. The skill runs bounded, read-only diagnostics and returns a structured diagnosis, supporting evidence, recommended actions, and validation steps.&lt;/P&gt;
&lt;H2&gt;What you can do with the SQL DW operations skill&lt;/H2&gt;
&lt;P&gt;The SQL DW operations skill helps you:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;failure-analysis&lt;/STRONG&gt;: Separate failed queries from canceled requests, identify affected workloads, and resolve engine error codes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;resource-consumers&lt;/STRONG&gt;: Find recurring resource-consuming query patterns, regressions, and changes in execution volume or per-run cost.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;capacity-metrics-correlation&lt;/STRONG&gt;: Connect a Capacity Metrics spike to warehouse activity in the same time window.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;pool-pressure&lt;/STRONG&gt;: Diagnose contention and identify workloads that might benefit from custom SQL pools.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;lakehouse-health&lt;/STRONG&gt;: Find lakehouse tables with small-file, deleted-row, or checkpoint issues.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;query-reference&lt;/STRONG&gt;: Use the appropriate read-only system views and Query Insights queries for bounded operational analysis.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;scenarios&lt;/STRONG&gt;: Combine the diagnostics into guided workflows for common warehouse incidents.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Each response separates the diagnosis, evidence, ruled-out causes, recommendations, and customer follow-ups. Measurements are tied to their source, and zero-row results are treated as valid evidence instead of prompting an invented explanation.&lt;/P&gt;
&lt;H2&gt;Common use cases&lt;/H2&gt;
&lt;P&gt;Start with the operational question rather than selecting system views or writing diagnostic SQL.&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;Figure: GIF depiction of how the SQL DW operations skill connects a natural-language prompt to bounded, read-only diagnostics and customer follow-up actions.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;Investigate failed and canceled queries&lt;/H3&gt;
&lt;P&gt;Analyze failed and canceled queries in SalesWarehouse during the last 24 hours.&lt;/P&gt;
&lt;P&gt;The skill uses Query Insights to identify affected users, applications, query patterns, and SQL pools. It resolves failed engine codes through sys.messages and keeps cancellations separate because they can reflect a user-initiated cancellation, a client timeout, or resource pressure.&lt;/P&gt;
&lt;H3&gt;Explain a performance slowdown&lt;/H3&gt;
&lt;P&gt;Explain why FinanceWarehouse was slow between 09:00 and 11:00 UTC yesterday.&lt;/P&gt;
&lt;P&gt;The skill checks SQL pool pressure, overlapping requests, CPU, elapsed time, and storage scans. It distinguishes contention from a directly expensive query or a broad increase in workload.&lt;/P&gt;
&lt;H3&gt;Find resource-consuming query patterns&lt;/H3&gt;
&lt;P&gt;Find the top resource-consuming queries in SalesWarehouse and compare them with the previous seven days.&lt;/P&gt;
&lt;P&gt;The skill groups requests by query shape and separates higher execution volume from increased per-run cost, new query patterns, and one-time expensive runs.&lt;/P&gt;
&lt;H3&gt;Investigate a capacity spike&lt;/H3&gt;
&lt;P&gt;Use the Fabric Capacity Metrics app to investigate the CU spike from 14:00 to 15:00 UTC, then identify expensive SQL users and query patterns.&lt;/P&gt;
&lt;P&gt;Following the warehouse metering update introduced in August 2026, Capacity Metrics shows when consumption occurred and how much was reported based on allocated warehouse compute over time. Query Insights explains what ran during the same period.&lt;/P&gt;
&lt;P&gt;The skill discovers the installed Capacity Metrics model, identifies a costly warehouse or SQL analytics endpoint, and analyzes Query Insights requests that overlap its time window. It doesn't join Capacity Metrics operation identifiers to Query Insights statement identifiers. Capacity consumption and warehouse CPU are complementary signals, not interchangeable measurements.&lt;/P&gt;
&lt;H3&gt;Assess custom SQL pool candidates&lt;/H3&gt;
&lt;P&gt;Assess whether recurring workloads in SalesWarehouse are candidates for custom SQL pools based on the last 30 days.&lt;/P&gt;
&lt;P&gt;If repeated pressure is associated with a consistent application name, such as an ingestion service or reporting application, the skill can recommend testing that workload in a custom SQL pool. It identifies the application to isolate and the pressure, latency, CPU, scan, and failure measures to compare before and after the pilot.&lt;/P&gt;
&lt;H2&gt;Get started&lt;/H2&gt;
&lt;H3&gt;Prerequisites&lt;/H3&gt;
&lt;P&gt;Before you start, make sure you have:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub Copilot CLI or another compatible AI coding tool.&lt;/LI&gt;
&lt;LI&gt;An active Fabric warehouse or lakehouse SQL analytics endpoint.&lt;/LI&gt;
&lt;LI&gt;Contributor or higher access to the workspace.&lt;/LI&gt;
&lt;LI&gt;The Microsoft Fabric Capacity Metrics app installed for capacity-spike investigations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Add the Microsoft Fabric skills marketplace in GitHub Copilot CLI:&lt;/P&gt;
&lt;P&gt;/plugin marketplace add microsoft/skills-for-fabric&lt;/P&gt;
&lt;P&gt;Install the Fabric skills bundle:&lt;/P&gt;
&lt;P&gt;/plugin install fabric-skills@fabric-collection&lt;/P&gt;
&lt;P&gt;Then open Copilot CLI in a project folder and describe the warehouse issue you want to investigate. Include the workspace, warehouse or SQL analytics endpoint, and UTC time range when possible.&lt;/P&gt;
&lt;P&gt;For detailed permissions, setup, supported scenarios, and diagnostic time limits, see &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/skills-for-data-warehouse-operations" target="_blank" rel="noopener"&gt;Diagnose warehouse workloads with the SQL DW operations skill&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;Next Steps&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Install or update the &lt;A class="lia-external-url" href="https://github.com/microsoft/skills-for-fabric" target="_blank" rel="noopener"&gt;Microsoft Fabric skills bundle&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Review &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/query-insights" target="_blank" rel="noopener"&gt;Query Insights in Fabric Data Warehouse&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Review &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/monitoring-overview" target="_blank" rel="noopener"&gt;monitoring options for Fabric Data Warehouse&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Learn about &lt;A class="lia-external-url" href="https://learn.microsoft.com/fabric/data-warehouse/custom-sql-pools" target="_blank" rel="noopener"&gt;custom SQL pools&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Mon, 14 Sep 2026 17:00:00 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Diagnose-Fabric-Data-Warehouse-workloads-with-the-SQL-DW/ba-p/5366102</guid>
      <dc:creator>Mariyaali</dc:creator>
      <dc:date>2026-09-14T17:00:00Z</dc:date>
    </item>
    <item>
      <title>From Business Events, Fabric Events, and Azure Events to Real-Time Hub</title>
      <link>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/From-Business-Events-Fabric-Events-and-Azure-Events-to-Real-Time/ba-p/5365864</link>
      <description>&lt;P&gt;Welcome to the eighth and final 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>Mon, 14 Sep 2026 16:59:28 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/From-Business-Events-Fabric-Events-and-Azure-Events-to-Real-Time/ba-p/5365864</guid>
      <dc:creator>robece-msft</dc:creator>
      <dc:date>2026-09-14T16:59:28Z</dc:date>
    </item>
    <item>
      <title>Forecasting with Autoregression, ARIMA &amp; AIC / BIC for Data Science in Microsoft Fabric</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Science-Community-Blog/Forecasting-with-Autoregression-ARIMA-AIC-BIC-for-Data-Science/ba-p/4870627</link>
      <description>&lt;P&gt;In this edition, we’re exploring forecasting through Autoregression, ARIMA, and the model selection tools AIC and BIC. By the time you’re done reading, you’ll understand how data can actually learn from its own patterns, how ARIMA helps bring structure to unpredictable trends, and how AIC and BIC keep your models grounded by balancing accuracy with simplicity.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:57:38 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Science-Community-Blog/Forecasting-with-Autoregression-ARIMA-AIC-BIC-for-Data-Science/ba-p/4870627</guid>
      <dc:creator>Sahir_Maharaj</dc:creator>
      <dc:date>2026-09-14T13:57:38Z</dc:date>
    </item>
    <item>
      <title>How to Connect SAP to Power BI Through SAP BTP</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-SAP-to-Power-BI-Through-SAP-BTP/ba-p/5366349</link>
      <description>&lt;P&gt;Learn how to connect SAP to Power BI through SAP BTP using Metrica Software’s connector. This step-by-step guide covers creating reusable OData data sources, managing access, and loading SAP data into Power BI.&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:57:05 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/How-to-Connect-SAP-to-Power-BI-Through-SAP-BTP/ba-p/5366349</guid>
      <dc:creator>metrica</dc:creator>
      <dc:date>2026-09-14T13:57:05Z</dc:date>
    </item>
    <item>
      <title>Schema Compare in VS Code: Simplifying Fabric Warehouse Deployments</title>
      <link>https://community.fabric.microsoft.com/t5/Data-Warehouse-Community-Blog/Schema-Compare-in-VS-Code-Simplifying-Fabric-Warehouse/ba-p/5366300</link>
      <description>&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Deploying databases shouldn't feel uncertain. Synchronizing development and production schemas in Microsoft Fabric Warehouse can be challenging as database objects evolve. A frequent issue arises when the .sqlproj file isn't configured with the Fabric-specific schema provider (SqlDbFabricDatabaseSchemaProvider). Misconfiguration may lead Schema Compare to flag supported Fabric objects as unsupported. To avoid this issue, explicitly specify the schema provider in the .sqlproj XML if the GUI does not offer that option.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;In this blog, let's take a quick look at how to get started.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Before using Schema Compare with Fabric Warehouse, make sure you have the following prerequisites.&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;You need access to an existing&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Warehouse item within a Microsoft Fabric workspace&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;, with &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Contributor or higher permissions&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;You also need&amp;nbsp;&lt;STRONG style="color: rgb(50, 49, 48);"&gt;&lt;SPAN data-preserver-spaces="true"&gt;Visual Studio Code&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="color: rgb(50, 49, 48);" data-preserver-spaces="true"&gt; installed on your workstation.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Next, install the&amp;nbsp;&lt;STRONG style="color: rgb(50, 49, 48);"&gt;&lt;SPAN data-preserver-spaces="true"&gt;.NET SDK&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="color: rgb(50, 49, 48);" data-preserver-spaces="true"&gt;, which is required to build and publish database projects.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Finally, install these two Visual Studio Code extensions:&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL Database Projects&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL Server (mssql)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Both extensions are available directly from the Visual Studio Code Marketplace. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;After installing the extensions, open Visual Studio Code and select "Add Connection" to connect to Fabric Warehouse.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Enter the required server and authentication details, and complete the connection.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;After connecting, access the Warehouse directly in Visual Studio Code.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Open Schema Compare&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Now navigate to &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Database Projects&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt; in Visual Studio Code.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You should see your available database projects and connections. Right-click the database project or connection and select "Schema Compare."&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare gives you an object-level view of the differences between the source and target.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You can compare schemas between:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;.dacpac files&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;Databases&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-preserver-spaces="true"&gt;SQL database projects&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Comparison results outline actions to align target with source.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Instead of treating the database as a single deployment unit, you can review individual changes and decide what should happen next.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;You can also selectively exclude actions from the comparison results when a particular change should not be deployed.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare with Fabric Warehouse&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare's integration with Fabric Warehouse allows developers to identify differences in database objects before implementing changes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN data-preserver-spaces="true"&gt;Database Projects and Git&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;The database project becomes the artifact under review in the PR, not a raw DDL diff — schema changes get the same scrutiny as application code, and the deployment pipeline consumes a validated project state rather than an ad-hoc script.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN data-preserver-spaces="true"&gt;Schema Compare exposes Fabric Warehouse DDL limitations before deployment, helping you &lt;/SPAN&gt;&lt;SPAN data-preserver-spaces="true"&gt;proactively address issues and maintain greater control over the deployment process.&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:55:53 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Data-Warehouse-Community-Blog/Schema-Compare-in-VS-Code-Simplifying-Fabric-Warehouse/ba-p/5366300</guid>
      <dc:creator>techies</dc:creator>
      <dc:date>2026-09-14T13:55:53Z</dc:date>
    </item>
    <item>
      <title>Power BI Smart Table Visual: Excel style Column Filtering, Dynamic Column Headers, Grouping Columns</title>
      <link>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Power-BI-Smart-Table-Visual-Excel-style-Column-Filtering-Dynamic/ba-p/5366517</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For a smoother reading experience with clearer screenshots and easy code copying, I suggest [reading this article on my website](https://www.techietips.co.in/articles/powerbi-managed-6500measures-smartly). It’s free, ad-free, distraction-free, and dedicated solely to sharing knowledge.&lt;/P&gt;
&lt;P&gt;The Table is the most commonly used visual in Power BI. Anyone who has spent years in Excel expects to click a header and filter that column. They expect related columns to sit under a common heading. The native table visual does none of this.&lt;/P&gt;
&lt;P&gt;There are grid visuals in the Microsoft visual app source that do. Most developers never get to use them, for two reasons that have nothing to do with the features. The good ones are licensed per developers or user, and that cost has to be justified to someone. The free ones are usually not Microsoft certified, which means an uncertified third party script is running inside your report, and that is a fair thing for a security team to say no to.&lt;/P&gt;
&lt;P&gt;So I built one. It is called Smart Table, and I built it with Claude. This post walks through what it does.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1. Excel style column filtering&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Every column header carries a funnel button in its own divided cell. Click it and you get what you would expect from Excel: sort, a set of conditions appropriate to the column’s type, and a searchable checkbox list of that column’s values. The menu names the column it belongs to, counts what you have ticked, and stays open while you sort.&lt;/P&gt;
&lt;P&gt;The conditions follow the column type rather than offering one generic list:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Sync: does the filter stay in the grid or reach the report&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Sync is on by default. Filters applied in the header are pushed to the model, so every other visual on the page responds, exactly as if the user had used a slicer. Turn Sync off: Filtering then narrows this grid only.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;Global search&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The toolbar has a search box with its own operator dropdown: contains, is exactly, starts with, ends with, does not contain. It searches across every column at once.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=biYBDeVU8xw" target="_blank"&gt;Power BI: Smart Table Excel Style Column Filtering&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Dynamic column headers, driven by a measure&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A column header name is normally a static label. Here it can be a DAX measure.&lt;/P&gt;
&lt;P&gt;Arrival Month is set to April, and the Key Metrics headers read Lead Time (Avg: 30.00), Room Nights (Avg: 1.00), ADR (Avg: 160.50). Change the month and they recompute.&lt;/P&gt;
&lt;P&gt;The header honors the filter context, including the filters applied inside the grid itself. Filter Property down to Resort Hotel with the funnel and the averages in the header follow.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=CRxdEWsqfzs" target="_blank"&gt;Power BI Smart Table: Measure Driven Column Headers (Dynamic Column names) - YouTube&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Column groups, without any extra tables&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Four groups across eleven columns: Reservation, Channel, Room Type, Key Metrics. Each one is a spanning header above its columns with its own colour.&lt;/P&gt;
&lt;P&gt;The thing to notice is what is not involved. No disconnected table. No field parameters. No two table visuals stacked on top of each other. No shapes placed in the background: which means your column groups move to the right along with your cursor.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.youtube.com/watch?v=xFi8LUcKWig" target="_blank"&gt;Power BI Smart Table: Grouping columns in a table without using a static table and a matrix visual - YouTube&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Known limits&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;All of these come down to one idea: some filtering reaches the model and some is local to the grid.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;30,000 rows That is the Power BI cap for a table mapping with this data reduction algorithm. Header filters push a real model filter, so filtering down to a workable set works fine. Do not point it at an unfiltered fact table.&lt;/LI&gt;
&lt;LI&gt;Value lists cap at 2,000 distinct values per column**, built from the loaded rows. On a high cardinality column like a guest name, use the search box in the menu.&lt;/LI&gt;
&lt;LI&gt;Ends with, Does not end with, and blank selections filter the grid only.** Power BI’s advanced filter operators have `StartsWith` and `Contains` but no `EndsWith`, and a blank has no equivalent in a model side `In` list. The menu tells you when you pick one of these.&lt;/LI&gt;
&lt;LI&gt;Bookmarks restore the data but not the ticked checkboxes.** The model filter is persisted by Power BI, so the rows come back correctly. The header checkboxes just will not show as ticked.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;I wrote this to make one point: the gaps in the built-in visuals are not permanent. Build your own, and with vibe coding that is no longer a months-long project.&lt;/P&gt;
&lt;P&gt;I am not sharing the .pbiviz file. It is an experiment, not tested for production grade reports. Feel free to checkout my [website](https://www.techietips.co.in) and reach out to me if you are interested to do these experiments along with me,&lt;/P&gt;
&lt;P&gt;I would like to continue developing this visual and will write detailed blogs in features explaining its features and implementations.&lt;/P&gt;
&lt;P&gt;I hope you learned something new. Feel free to share your thoughts in the comments section.&lt;/P&gt;
&lt;P&gt;Happy Learning!!!&lt;/P&gt;</description>
      <pubDate>Mon, 14 Sep 2026 13:55:10 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/Power-BI-Community-Blog/Power-BI-Smart-Table-Visual-Excel-style-Column-Filtering-Dynamic/ba-p/5366517</guid>
      <dc:creator>tharunkumarRTK</dc:creator>
      <dc:date>2026-09-14T13:55:10Z</dc:date>
    </item>
    <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>Mon, 14 Sep 2026 16:59:09 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-14T16:59:09Z</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>
  </channel>
</rss>

