<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>AI Apps | The .NET Blog</title><link>https://thedotnetblog.com/nl/tags/ai-apps/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>nl</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Sun, 26 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/nl/tags/ai-apps/index.xml" rel="self" type="application/rss+xml"/><item><title>SQL Server 2025 als database die klaar is voor agents: beveiliging, back-up en MCP in één engine</title><link>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>Het laatste deel van de Polyglot Tax-serie behandelt de lastige productieproblemen: een uniforme Row-Level Security over relationele, JSON-, graph- en vectorgegevens, plus cryptografische audittrails en MCP-integratie die SQL Server 2025 echt agent-ready maken.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dit bericht is automatisch vertaald. Voor de originele versie, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;klik hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ik heb de Polyglot Tax-serie van Aditya Badramraju met veel interesse gevolgd. Delen 1-3 bouwden een overtuigend verhaal voor SQL Server 2025 als een echt multi-model database — JSON, graph, vector en relationele data allemaal in één engine met een uniforme queryplanner. Deel 4 sluit de serie af met de onderdelen die echt bepalen of je deze architectuur in productie zou vertrouwen.&lt;/p&gt;
&lt;p&gt;Spoiler: het productieverhaal is sterk.&lt;/p&gt;
&lt;h2 id="eén-beveiligingsmodel-voor-alle-datamodellen"&gt;Eén Beveiligingsmodel voor Alle Datamodellen&lt;/h2&gt;
&lt;p&gt;Dat is het lastige aan polyglot stacks: wanneer een auditor vraagt &amp;ldquo;bewijs dat Tenant A de data van Tenant B niet kan zien&amp;rdquo;, moet je die vraag voor elke database apart beantwoorden. Vijf databases, vijf beveiligingsmodellen, vijf bewijzen.&lt;/p&gt;
&lt;p&gt;Met SQL Server 2025 definieer je één Row-Level Security-policy en die dekt alle datamodellen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FUNCTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RETURNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCHEMABINDING&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fn_result&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SESSION_CONTEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;TenantID&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;POLICY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TenantIsolation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Relational
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- JSON data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Relationships&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Graph edges
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PREDICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn_TenantFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TenantID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Embeddings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Vector data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;STATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vanaf dat moment wordt elke query — relationele joins, JSON-path queries, graph traversals, vector similarity searches — automatisch per tenant gefilterd. De engine injecteert de predicate in het execution plan voordat er data uit storage vertrekt. Je aanroepende code hoeft niet overal &lt;code&gt;WHERE TenantID = @id&lt;/code&gt; te schrijven. Je test de policy één keer.&lt;/p&gt;
&lt;p&gt;De lagen werken ook samen: Dynamic Data Masking voor kolommen die niet de volledige waarde aan bepaalde rollen mogen tonen, Always Encrypted voor end-to-end encryptie (zelfs DBA&amp;rsquo;s kunnen het niet lezen), en stored procedures als permissiegrens zodat agents alleen aanroepen wat je expliciet hebt vrijgegeven.&lt;/p&gt;
&lt;p&gt;Dit is het deel van de architectuur dat het belangrijkst is voor compliance-zware SaaS. Eén policy, één bewijs.&lt;/p&gt;
&lt;h2 id="geconsolideerde-back-up--atomisch-herstel"&gt;Geconsolideerde Back-up = Atomisch Herstel&lt;/h2&gt;
&lt;p&gt;Eén statement, alle datamodellen, één consistent punt in de tijd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;BACKUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MultiModelApp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://storage.blob.core.windows.net/backups/MultiModelApp.bak&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMPRESSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ENCRYPTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ALGORITHM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AES_256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CERTIFICATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BackupCert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RESTORE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MultiModelApp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://storage.blob.core.windows.net/backups/MultiModelApp.bak&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STOPAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2026-02-01 10:30:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In een polyglot stack betekent point-in-time recovery over vijf databases dat je vijf restore-operaties moet coördineren en maar moet hopen dat de timestamps binnen een seconde of twee overeenkomen. Voor financiële data is die tweeseconden-inconsistentie onacceptabel. Met één database, één transaction log en één restore is recovery per definitie atomisch.&lt;/p&gt;
&lt;h2 id="ledger-tabellen-voor-manipulatiebestendige-audittrails"&gt;Ledger-tabellen voor Manipulatiebestendige Audittrails&lt;/h2&gt;
&lt;p&gt;Voor gereguleerde sectoren heb je meer nodig dan &amp;ldquo;we hebben logs&amp;rdquo;. Je hebt cryptografisch bewijs nodig dat die logs niet zijn aangepast:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FinancialTransactions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TransactionID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIMARY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AccountID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MONEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TransactionType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TransactionDate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DATETIME2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DEFAULT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SYSUTCDATETIME&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SYSTEM_VERSIONING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LEDGER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Elke insert, update en delete wordt cryptografisch gehashed in een blockchain-achtige structuur. Je kunt een auditor wiskundig aantonen dat een rij niet is gemanipuleerd sinds die is geschreven. In een polyglot stack bestaat die mogelijkheid niet uniform over al je databases.&lt;/p&gt;
&lt;h2 id="mcp-integratie-agents-zonder-handmatig-geschreven-middleware"&gt;MCP-integratie: Agents Zonder Handmatig Geschreven Middleware&lt;/h2&gt;
&lt;p&gt;De serie werkte hier naartoe: SQL Server 2025 ondersteunt SQL MCP Server direct, wat betekent dat je agents de database kunnen aanroepen via natuurlijke tool calls zonder dat je voor elke operatie middleware hoeft te schrijven.&lt;/p&gt;
&lt;p&gt;Combineer dat met stored procedures als permissiegrens en Row-Level Security op engine-niveau, en je krijgt een model waarin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;De agent een tool aanroept, bijvoorbeeld &amp;ldquo;haal de klantcontext op voor account 12345&amp;rdquo;&lt;/li&gt;
&lt;li&gt;MCP dat vertaalt naar de stored procedure die jij hebt gedefinieerd&lt;/li&gt;
&lt;li&gt;De SQL-engine tenant-isolatie en column masking automatisch afdwingt&lt;/li&gt;
&lt;li&gt;De agent precies de data krijgt die hij mag zien&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Geen middlewarelaag. Geen risico op ad-hoc query injection. De engine verzorgt de autorisatie, niet de agent.&lt;/p&gt;
&lt;h2 id="waarom-dit-belangrijk-is-voor-net-ontwikkelaars"&gt;Waarom Dit Belangrijk Is Voor .NET-ontwikkelaars&lt;/h2&gt;
&lt;p&gt;Als je .NET-services bouwt en SQL Server je primaire opslag is, dan is de boodschap van deze serie: je hoeft geen Redis toe te voegen voor caching, geen graph database voor relaties en geen vector store voor embeddings. SQL Server 2025 doet dat allemaal — met betere operationele consistentie dan een polyglot stack en met uniforme beveiliging die echt auditeerbaar is.&lt;/p&gt;
&lt;p&gt;De MCP-integratie betekent dat je Semantic Kernel-agents of Microsoft Agent Framework-workflows via dezelfde SQL MCP Server met je datalaag kunnen communiceren, met dezelfde beveiligingsgaranties die je ook op menselijke queries zou toepassen.&lt;/p&gt;
&lt;h2 id="afronding"&gt;Afronding&lt;/h2&gt;
&lt;p&gt;De Polyglot Tax-serie is de moeite waard om van begin tot eind te lezen. Delen 1-3 bewijzen het queryplannerverhaal. Deel 4 bewijst het productieverhaal. Voor .NET-ontwikkelaars die agent-first of AI-augmented applicaties op Azure SQL bouwen, verdient deze architectuur serieuze overweging.&lt;/p&gt;
&lt;p&gt;Originele post van Aditya Badramraju: &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>68 Minuten per Dag Code Opnieuw Uitleggen aan Copilot? Daar is een Oplossing voor</title><link>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>Context rot is echt — je AI-agent raakt na 30 turns de draad kwijt, en je betaalt elk uur de compactiebelasting. auto-memory geeft GitHub Copilot CLI chirurgisch geheugen zonder duizenden tokens te verbranden.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dit bericht is automatisch vertaald. Klik &lt;a href="https://thedotnetblog.com/nl/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;hier&lt;/a&gt; voor de originele versie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ken je dat moment waarop je Copilot-sessie &lt;code&gt;/compact&lt;/code&gt; bereikt en de agent compleet vergeet waar je mee bezig was? De volgende vijf minuten leg je opnieuw de mapstructuur, de mislukte test en de drie benaderingen die je al hebt geprobeerd uit. Daarna gebeurt het weer. En weer.&lt;/p&gt;
&lt;p&gt;Desi Villanueva timede het: &lt;strong&gt;68 minuten per dag&lt;/strong&gt; — alleen al aan heroriëntatie. Niet aan code schrijven. Niet aan PR&amp;rsquo;s reviewen. Alleen de AI weer bijpraten over wat hij al wist.&lt;/p&gt;
&lt;p&gt;Blijkt dat daar een concrete reden voor is, en een concrete oplossing.&lt;/p&gt;
&lt;h2 id="de-leugen-van-het-contextvenster"&gt;De leugen van het contextvenster&lt;/h2&gt;
&lt;p&gt;Je agent komt met een groot getal op de doos. 200K tokens. Klinkt enorm. In de praktijk is het een bovengrens, geen garantie.&lt;/p&gt;
&lt;p&gt;Dit is de echte rekensom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200K totale context&lt;/li&gt;
&lt;li&gt;Minus ongeveer 65K voor MCP-tools die bij startup worden geladen (~33%)&lt;/li&gt;
&lt;li&gt;Minus ongeveer 10K voor instructiebestanden zoals &lt;code&gt;AGENTS.md&lt;/code&gt; of &lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dat laat je ongeveer &lt;strong&gt;125K over voordat je ook maar een woord typt&lt;/strong&gt;. En het wordt erger — LLM&amp;rsquo;s degraderen niet netjes terwijl de context volloopt. Ze lopen vast rond 60% van de capaciteit. Het model begint dingen te verliezen die 30 turns geleden zijn genoemd, spreekt eerdere antwoorden tegen en hallucineert bestandsnamen die het 10 minuten eerder nog vol vertrouwen noemde. De industrie noemt dit het &amp;ldquo;lost in the middle&amp;rdquo;-probleem.&lt;/p&gt;
&lt;p&gt;Effectieve limiet: &lt;strong&gt;45K tokens&lt;/strong&gt; voordat de kwaliteit inzakt. Dat zijn misschien 20-30 actieve gespreksbeurten voordat de agent begint af te dwalen. Daarom zit je elke 45 minuten op &lt;code&gt;/compact&lt;/code&gt; — niet omdat je 200K tokens hebt volgepropt, maar omdat het model al bij 120K begint te verpieteren.&lt;/p&gt;
&lt;h2 id="de-compactiebelasting"&gt;De compactiebelasting&lt;/h2&gt;
&lt;p&gt;Elke &lt;code&gt;/compact&lt;/code&gt; kost je flow state. Je zit diep in een debugsessie. De gedeelde context is in 30 minuten opgebouwd. De agent kent de mapstructuur, de mislukte test en de hypothese. Dan verschijnt de waarschuwing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Negeer het → de agent wordt geleidelijk dommer en gaat oude state hallucinerend invullen&lt;/li&gt;
&lt;li&gt;Draai &lt;code&gt;/compact&lt;/code&gt; → de agent krijgt een samenvatting van twee alinea&amp;rsquo;s van een onderzoek van 30 minuten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In beide gevallen verlies je. In beide gevallen ben je je eigen project aan het navertellen alsof je een nieuwe collega op dag één bent.&lt;/p&gt;
&lt;p&gt;Het venijnige deel? &lt;strong&gt;Het geheugen bestaat al&lt;/strong&gt;. Copilot CLI schrijft elke sessie weg naar een lokale SQLite-database op &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt; — elk aangeraakt bestand, elke turn, elk checkpoint. Alles staat op schijf. De agent kan het alleen niet lezen.&lt;/p&gt;
&lt;h2 id="auto-memory-een-recall-laag-geen-geheugensysteem"&gt;auto-memory: een recall-laag, geen geheugensysteem&lt;/h2&gt;
&lt;p&gt;Dat is het kernidee achter &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory&lt;/a&gt;: bouw geen nieuw geheugensysteem — bouw een read-only querylaag bovenop wat er al is.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install auto-memory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ongeveer 1.900 regels Python. Geen afhankelijkheden. Installeert in 30 seconden.&lt;/p&gt;
&lt;p&gt;In plaats van de context te overspoelen met grep-resultaten, geef je de agent chirurgische toegang tot wat echt belangrijk is:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operatie&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Wat je krijgt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grep -r &amp;quot;auth&amp;quot; src/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~5,000–10,000&lt;/td&gt;
&lt;td&gt;500 resultaten, waarvan de meeste irrelevant zijn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find . -name &amp;quot;*.py&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~2,000&lt;/td&gt;
&lt;td&gt;Alle Python-bestanden, zonder context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heroriëntatie van de agent&lt;/td&gt;
&lt;td&gt;~2,000&lt;/td&gt;
&lt;td&gt;Jij legt uit wat hij eigenlijk al had moeten weten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;auto-memory files --json --limit 10&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;De 10 bestanden waaraan je gisteren hebt gewerkt&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dat is een verbetering van 200x. De agent slaat het archeologische graafwerk over en gaat meteen naar wat ertoe doet.&lt;/p&gt;
&lt;p&gt;De aanbevolen flow: als je richting 50-70% contextgebruik gaat, draai dan &lt;code&gt;/clear&lt;/code&gt; en prompt vervolgens met: &amp;ldquo;bekijk de laatste sessies waarin we onderwerp X bespraken&amp;rdquo;. In plaats van 12K tokens te verbranden aan blinde zoekopdrachten, haalt auto-memory de relevante context in 50 tokens op.&lt;/p&gt;
&lt;h2 id="waarom-dit-belangrijk-is-voor-net-ontwikkelaars"&gt;Waarom dit belangrijk is voor .NET-ontwikkelaars&lt;/h2&gt;
&lt;p&gt;Als je GitHub Copilot CLI gebruikt voor .NET-werk — services scaffolden, EF Core-queries debuggen, itereren op Blazor-componenten — dan raakt het context rot-probleem je net zo hard. Complexe oplossingen met meerdere projecten, gedeelde libraries en diepe call chains zijn precies het soort codebase waar de agent het snelst de draad kwijt raakt.&lt;/p&gt;
&lt;p&gt;De installgids legt uit hoe je Copilot CLI erop laat wijzen. Het is een eenmalige setup.&lt;/p&gt;
&lt;p&gt;Eerlijk? 68 minuten per dag terugkrijgen is geen klein quality-of-life-tweak. Dat is bijna 6 uur per week.&lt;/p&gt;
&lt;h2 id="afsluiting"&gt;Afsluiting&lt;/h2&gt;
&lt;p&gt;Context rot is een echte architecturale beperking, geen bug die zomaar gepatcht gaat worden. auto-memory omzeilt dat door je agent een goedkope, precieze recall-mechaniek te geven in plaats van een dure, lawaaierige herverkenning. Als je serieus AI-ondersteund ontwikkelt met GitHub Copilot CLI, is die installatie van 30 seconden het waard.&lt;/p&gt;
&lt;p&gt;Bekijk het: &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory op GitHub&lt;/a&gt;. Oorspronkelijke post van Desi Villanueva: &lt;a href="https://devblogs.microsoft.com/all-things-azure/i-wasted-68-minutes-a-day-re-explaining-my-code-then-i-built-auto-memory/"&gt;I Wasted 68 Minutes a Day Re-Explaining My Code&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>