<?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/ca/tags/ai-apps/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ca</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/ca/tags/ai-apps/index.xml" rel="self" type="application/rss+xml"/><item><title>SQL Server 2025 com a base de dades preparada per a agents: seguretat, còpies de seguretat i MCP en un sol motor</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>La part final de la sèrie Polyglot Tax tracta els problemes difícils de producció: una política de Row-Level Security unificada sobre dades relacionals, JSON, grafs i vectors, més els rastres d'auditoria xifrats i la integració MCP que fan que SQL Server 2025 sigui realment preparat per a agents.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;He seguit la sèrie Polyglot Tax d&amp;rsquo;Aditya Badramraju amb molt d&amp;rsquo;interès. Les parts 1-3 van construir un cas convincent per a SQL Server 2025 com una base de dades realment multimodel — JSON, grafs, vectors i dades relacionals en un sol motor amb un planificador de consultes unificat. La part 4 tanca la sèrie amb les parts que realment determinen si confiaries en aquesta arquitectura en producció.&lt;/p&gt;
&lt;p&gt;Spoiler: la història de producció és sòlida.&lt;/p&gt;
&lt;h2 id="un-sol-model-de-seguretat-per-a-tots-els-models-de-dades"&gt;Un Sol Model de Seguretat per a Tots els Models de Dades&lt;/h2&gt;
&lt;p&gt;Això és el que passa amb els stacks poliglotes: quan un auditor pregunta &amp;ldquo;demostra que el Tenant A no pot veure les dades del Tenant B&amp;rdquo;, has de respondre aquesta pregunta per a cada base de dades de manera independent. Cinc bases de dades, cinc models de seguretat, cinc proves.&lt;/p&gt;
&lt;p&gt;Amb SQL Server 2025, defineixes una sola política de Row-Level Security i cobreix tots els models de dades:&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;A partir d&amp;rsquo;aquí, qualsevol consulta — joins relacionals, consultes de camins JSON, travessies de graf, cerques de similitud vectorial — es filtra automàticament per tenant. El motor injecta el predicat a la planificació abans que cap dada surti de l&amp;rsquo;emmagatzematge. El teu codi no necessita &lt;code&gt;WHERE TenantID = @id&lt;/code&gt; per tot arreu. Proves la política una sola vegada.&lt;/p&gt;
&lt;p&gt;Les capes es combinen encara més: Dynamic Data Masking per a les columnes que no haurien de mostrar els valors complets a certs rols, Always Encrypted per al xifrat de punta a punta (fins i tot els DBAs no el poden llegir), i els stored procedures com a frontera de permisos perquè els agents només cridin allò que has exposat explícitament.&lt;/p&gt;
&lt;p&gt;Aquesta és la part de l&amp;rsquo;arquitectura que realment importa en un SaaS amb requisits de compliment. Una política, una prova.&lt;/p&gt;
&lt;h2 id="còpia-de-seguretat-unificada--recuperació-atòmica"&gt;Còpia de Seguretat Unificada = Recuperació Atòmica&lt;/h2&gt;
&lt;p&gt;Una instrucció, tots els models de dades, un punt en el temps coherent:&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;En un stack poliglota, la recuperació point-in-time a través de cinc bases de dades significa coordinar cinc operacions de restauració i esperar que els timestamps encaixin dins d&amp;rsquo;un o dos segons. Per a dades financeres, aquesta inconsistència de dos segons és inacceptable. Amb una sola base de dades, un sol registre de transaccions i una sola restauració — la recuperació és atòmica per definició.&lt;/p&gt;
&lt;h2 id="taules-ledger-per-a-rastreig-dauditoria-a-prova-de-manipulacions"&gt;Taules Ledger per a Rastreig d&amp;rsquo;Auditoria a Prova de Manipulacions&lt;/h2&gt;
&lt;p&gt;Per a sectors regulats, necessites més que &amp;ldquo;tenim logs&amp;rdquo;. Necessites prova criptogràfica que aquells logs no han estat modificats:&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;Cada insert, update i delete queda hashat criptogràficament dins d&amp;rsquo;una estructura tipus blockchain. Pots demostrar a un auditor — matemàticament — que una fila no ha estat manipulada des que es va escriure. En un stack poliglota, aquesta capacitat no existeix de manera uniforme a totes les teves bases de dades.&lt;/p&gt;
&lt;h2 id="integració-mcp-agents-sense-middleware-fet-a-mà"&gt;Integració MCP: Agents Sense Middleware Fet a Mà&lt;/h2&gt;
&lt;p&gt;Això és cap on anava la sèrie: SQL Server 2025 dona suport directe al SQL MCP Server, cosa que significa que els teus agents poden cridar la base de dades mitjançant tool calls en llenguatge natural sense que hagis d&amp;rsquo;escriure middleware per a cada operació.&lt;/p&gt;
&lt;p&gt;Combina això amb els stored procedures com a frontera de permisos i amb Row-Level Security aplicada al motor, i tens un model on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L&amp;rsquo;agent crida una eina, per exemple &amp;ldquo;obté el context del client per al compte 12345&amp;rdquo;&lt;/li&gt;
&lt;li&gt;MCP ho tradueix al stored procedure que has definit&lt;/li&gt;
&lt;li&gt;El motor SQL aplica l&amp;rsquo;aïllament de tenant i l&amp;rsquo;emmascarament de columnes automàticament&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;agent rep exactament les dades que té permís de veure&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No hi ha capa de middleware. No hi ha risc d&amp;rsquo;injecció de consultes ad hoc. El motor gestiona l&amp;rsquo;autorització, no l&amp;rsquo;agent.&lt;/p&gt;
&lt;h2 id="per-què-això-importa-als-desenvolupadors-net"&gt;Per Què Això Importa Als Desenvolupadors .NET&lt;/h2&gt;
&lt;p&gt;Si estàs construint serveis .NET amb SQL Server com a magatzem principal, el missatge d&amp;rsquo;aquesta sèrie és: no necessites afegir Redis per a la caché, ni una base de dades de graf per a les relacions, ni un magatzem vectorial per a les embeddings. SQL Server 2025 s&amp;rsquo;encarrega de tot això — amb una coherència operativa millor que un stack poliglota i una seguretat unificada que realment es pot auditar.&lt;/p&gt;
&lt;p&gt;La integració MCP significa que els teus agents de Semantic Kernel o els fluxos de Microsoft Agent Framework poden interactuar amb la capa de dades a través del mateix SQL MCP Server, amb les mateixes garanties de seguretat que imposaries a les consultes humanes.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;La sèrie Polyglot Tax val la pena llegir-la de cap a cap. Les parts 1-3 demostren la història del planificador de consultes. La part 4 demostra la història de producció. Per als desenvolupadors .NET que construeixen aplicacions agent-first o AI-augmented sobre Azure SQL, aquesta arquitectura mereix una consideració seriosa.&lt;/p&gt;
&lt;p&gt;Publicació original d&amp;rsquo;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 Minuts al Dia Reexplicant Codi a Copilot? Hi Ha una Solució</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>El context rot és real — el teu agent d'IA es deriva després de 30 torns, i pagues l'impost de la compactació cada hora. auto-memory dona a GitHub Copilot CLI una memòria quirúrgica sense cremar milers de tokens.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquesta publicació ha estat traduïda automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saps aquell moment en què la teva sessió de Copilot arriba a &lt;code&gt;/compact&lt;/code&gt; i l&amp;rsquo;agent oblida completament què estaves fent? Passes els cinc minuts següents reexplicant l&amp;rsquo;estructura de carpetes, el test que falla i les tres aproximacions que ja has provat. I després torna a passar. I una altra vegada.&lt;/p&gt;
&lt;p&gt;Desi Villanueva ho va mesurar: &lt;strong&gt;68 minuts al dia&lt;/strong&gt; — només en reorientació. No escrivint codi. No revisant PRs. Només posant la IA al corrent del que ja sabia.&lt;/p&gt;
&lt;p&gt;Resulta que hi ha una raó concreta per això, i una solució concreta.&lt;/p&gt;
&lt;h2 id="la-mentida-de-la-finestra-de-context"&gt;La mentida de la finestra de context&lt;/h2&gt;
&lt;p&gt;El teu agent ve amb un número gran a la capsa. 200K tokens. Sona massiu. A la pràctica és un sostre, no una garantia.&lt;/p&gt;
&lt;p&gt;Aquí tens la matemàtica real:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200K de context total&lt;/li&gt;
&lt;li&gt;Menys uns 65K per a eines MCP carregades a l&amp;rsquo;arrencada (~33%)&lt;/li&gt;
&lt;li&gt;Menys uns 10K per a fitxers d&amp;rsquo;instruccions com &lt;code&gt;AGENTS.md&lt;/code&gt; o &lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Això et deixa aproximadament &lt;strong&gt;125K abans d&amp;rsquo;escriure ni una paraula&lt;/strong&gt;. I encara va a pitjor — els LLM no es degraden amb gràcia a mesura que el context s&amp;rsquo;omple. Xoquen amb una paret al voltant del 60% de la capacitat. El model comença a perdre coses esmentades fa 30 torns, contradiu respostes anteriors, i al·lucina noms de fitxer que havia dit amb total confiança fa 10 minuts. La indústria anomena això el problema de &amp;ldquo;lost in the middle&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Límit efectiu: &lt;strong&gt;45K tokens&lt;/strong&gt; abans que la qualitat es degradi. Això són potser 20-30 torns de conversa activa abans que l&amp;rsquo;agent comenci a desviar-se. Per això estàs fent &lt;code&gt;/compact&lt;/code&gt; cada 45 minuts — no perquè hagis omplert 200K tokens, sinó perquè el model ja està prou degradat a 120K.&lt;/p&gt;
&lt;h2 id="limpost-de-la-compactació"&gt;L&amp;rsquo;impost de la compactació&lt;/h2&gt;
&lt;p&gt;Cada &lt;code&gt;/compact&lt;/code&gt; et fa perdre l&amp;rsquo;estat de flux. Estàs immers en una sessió de depuració. El context compartit s&amp;rsquo;ha anat construint durant 30 minuts. L&amp;rsquo;agent coneix l&amp;rsquo;estructura de fitxers, el test que falla i la hipòtesi. Llavors arriba l&amp;rsquo;avís.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ignora&amp;rsquo;l → l&amp;rsquo;agent es torna progressivament més tonto i comença a al·lucinar l&amp;rsquo;estat antic&lt;/li&gt;
&lt;li&gt;Executa &lt;code&gt;/compact&lt;/code&gt; → l&amp;rsquo;agent obté un resum de dos paràgrafs d&amp;rsquo;una investigació de 30 minuts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En qualsevol dels dos casos perds. En qualsevol dels dos casos estàs narrant el teu propi projecte com si fos un nou empleat el primer dia.&lt;/p&gt;
&lt;p&gt;La part cruel? &lt;strong&gt;La memòria ja existeix&lt;/strong&gt;. Copilot CLI escriu cada sessió a una base de dades SQLite local a &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt; — cada fitxer tocat, cada torn, cada punt de control. Tot és al disc. L&amp;rsquo;agent simplement no ho pot llegir.&lt;/p&gt;
&lt;h2 id="auto-memory-una-capa-de-recuperació-no-un-sistema-de-memòria"&gt;auto-memory: una capa de recuperació, no un sistema de memòria&lt;/h2&gt;
&lt;p&gt;Aquesta és la idea clau darrere de &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory&lt;/a&gt;: no construeixis un sistema de memòria nou — construeix una capa de consulta només lectura sobre la que ja existeix.&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;Unes 1.900 línies de Python. Zero dependències. S&amp;rsquo;instal·la en 30 segons.&lt;/p&gt;
&lt;p&gt;En lloc d&amp;rsquo;inundar el context amb resultats de grep, li dones a l&amp;rsquo;agent accés quirúrgic al que realment importa:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operació&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Què obtens&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 resultats, la majoria irrellevants&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;Tots els fitxers Python, sense context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reorientació de l&amp;rsquo;agent&lt;/td&gt;
&lt;td&gt;~2,000&lt;/td&gt;
&lt;td&gt;Tu explicant allò que ja hauria de saber&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;Els 10 fitxers en què vas treballar ahir&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Això és una millora de 200x. L&amp;rsquo;agent s&amp;rsquo;estalvia l&amp;rsquo;excavació arqueològica i va directament al que importa.&lt;/p&gt;
&lt;p&gt;El flux recomanat: quan t&amp;rsquo;acostis al 50-70% d&amp;rsquo;ús del context, executa &lt;code&gt;/clear&lt;/code&gt; i després demana: &amp;ldquo;revisa les últimes sessions que vam parlar del tema X&amp;rdquo;. En lloc de cremar 12K tokens en cerques a cegues, auto-memory extreu el context rellevant en 50.&lt;/p&gt;
&lt;h2 id="per-què-això-importa-als-desenvolupadors-net"&gt;Per què això importa als desenvolupadors .NET&lt;/h2&gt;
&lt;p&gt;Si fas servir GitHub Copilot CLI per a feina de .NET — scaffolding de serveis, depuració de consultes EF Core, iteració sobre components Blazor — el problema del context rot et pega igual de fort. Les solucions complexes amb múltiples projectes, biblioteques compartides i cadenes de crida profundes són exactament el tipus de codebase en què l&amp;rsquo;agent perd el fil més ràpid.&lt;/p&gt;
&lt;p&gt;La guia d&amp;rsquo;instal·lació explica com apuntar-hi Copilot CLI. És una configuració d&amp;rsquo;una sola vegada.&lt;/p&gt;
&lt;p&gt;Sincerament? Recuperar 68 minuts al dia no és un petit ajust de qualitat de vida. Això és gairebé 6 hores a la setmana.&lt;/p&gt;
&lt;h2 id="resumint"&gt;Resumint&lt;/h2&gt;
&lt;p&gt;El context rot és una restricció arquitectònica real, no un bug que es corregirà. auto-memory la rodeja donant al teu agent un mecanisme de recuperació barat i precís en lloc d&amp;rsquo;una reexploració costosa i sorollosa. Si fas desenvolupament seriós assistit per IA amb GitHub Copilot CLI, val la pena la instal·lació de 30 segons.&lt;/p&gt;
&lt;p&gt;Fes-hi un cop d&amp;rsquo;ull: &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory a GitHub&lt;/a&gt;. Post original de 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>