<?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/id/tags/ai-apps/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>id</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/id/tags/ai-apps/index.xml" rel="self" type="application/rss+xml"/><item><title>SQL Server 2025 sebagai basis data siap agen: keamanan, backup, dan MCP dalam satu engine</title><link>https://thedotnetblog.com/id/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/id/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>Bagian terakhir dari seri Polyglot Tax membahas masalah produksi yang sulit: Row-Level Security terpadu di data relasional, JSON, graph, dan vector, plus jejak audit kriptografis dan integrasi MCP yang membuat SQL Server 2025 benar-benar siap agen.</description><content:encoded>&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saya sudah mengikuti seri Polyglot Tax karya Aditya Badramraju dengan sangat tertarik. Bagian 1-3 membangun argumen yang kuat untuk SQL Server 2025 sebagai database multi-model yang benar-benar nyata — JSON, graph, vector, dan data relasional dalam satu engine dengan query planner terpadu. Bagian 4 menutup seri ini dengan bagian yang benar-benar menentukan apakah Anda akan mempercayai arsitektur ini di production.&lt;/p&gt;
&lt;p&gt;Spoiler: cerita production-nya solid.&lt;/p&gt;
&lt;h2 id="satu-model-keamanan-untuk-semua-model-data"&gt;Satu Model Keamanan untuk Semua Model Data&lt;/h2&gt;
&lt;p&gt;Inilah masalah dengan stack poliglot: ketika auditor bertanya &amp;ldquo;buktikan bahwa Tenant A tidak bisa melihat data Tenant B&amp;rdquo;, Anda harus menjawab pertanyaan itu untuk setiap database secara terpisah. Lima database, lima model keamanan, lima bukti.&lt;/p&gt;
&lt;p&gt;Dengan SQL Server 2025, Anda mendefinisikan satu kebijakan Row-Level Security dan kebijakan itu mencakup semua model data:&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;Mulai saat itu, setiap query — relational joins, query path JSON, traversal graph, similarity search vector — otomatis difilter berdasarkan tenant. Engine menyuntikkan predicate ke execution plan sebelum data apa pun keluar dari storage. Kode pemanggil Anda tidak perlu &lt;code&gt;WHERE TenantID = @id&lt;/code&gt; di mana-mana. Anda menguji kebijakan itu sekali.&lt;/p&gt;
&lt;p&gt;Lapisan-lapisannya juga saling melengkapi: Dynamic Data Masking untuk kolom yang tidak boleh menampilkan nilai penuh ke role tertentu, Always Encrypted untuk enkripsi end-to-end (bahkan DBA tidak bisa membacanya), dan stored procedure sebagai batas izin sehingga agen hanya memanggil apa yang Anda buka secara eksplisit.&lt;/p&gt;
&lt;p&gt;Ini adalah bagian arsitektur yang paling penting untuk SaaS yang penuh tuntutan kepatuhan. Satu kebijakan, satu bukti.&lt;/p&gt;
&lt;h2 id="backup-terpadu--pemulihan-atomik"&gt;Backup Terpadu = Pemulihan Atomik&lt;/h2&gt;
&lt;p&gt;Satu perintah, semua model data, titik waktu yang konsisten:&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;Dalam stack poliglot, point-in-time recovery di lima database berarti mengoordinasikan lima operasi restore dan berharap timestamp-nya selaras dalam satu atau dua detik. Untuk data finansial, ketidakkonsistenan dua detik itu tidak dapat diterima. Dengan satu database, satu transaction log, satu restore — recovery bersifat atomik secara definisi.&lt;/p&gt;
&lt;h2 id="ledger-tables-untuk-jejak-audit-yang-tahan-manipulasi"&gt;Ledger Tables untuk Jejak Audit yang Tahan Manipulasi&lt;/h2&gt;
&lt;p&gt;Untuk industri yang diatur, Anda membutuhkan lebih dari sekadar &amp;ldquo;kami punya logs&amp;rdquo;. Anda membutuhkan bukti kriptografis bahwa logs itu tidak diubah:&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;Setiap insert, update, dan delete di-hash secara kriptografis ke dalam struktur bergaya blockchain. Anda bisa membuktikan kepada auditor — secara matematis — bahwa sebuah row belum dimanipulasi sejak ditulis. Dalam stack poliglot, kemampuan seperti ini tidak tersedia secara seragam di semua database Anda.&lt;/p&gt;
&lt;h2 id="integrasi-mcp-agen-tanpa-middleware-yang-ditulis-manual"&gt;Integrasi MCP: Agen Tanpa Middleware yang Ditulis Manual&lt;/h2&gt;
&lt;p&gt;Seri ini memang mengarah ke sini: SQL Server 2025 mendukung SQL MCP Server secara langsung, yang berarti agen Anda bisa memanggil database lewat tool call natural language tanpa Anda menulis middleware untuk setiap operasi.&lt;/p&gt;
&lt;p&gt;Gabungkan itu dengan stored procedure sebagai batas izin dan Row-Level Security yang ditegakkan di engine, dan Anda mendapatkan model di mana:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Agen memanggil tool, misalnya &amp;ldquo;ambil konteks pelanggan untuk akun 12345&amp;rdquo;&lt;/li&gt;
&lt;li&gt;MCP menerjemahkannya ke stored procedure yang Anda definisikan&lt;/li&gt;
&lt;li&gt;Engine SQL menegakkan isolasi tenant dan masking kolom secara otomatis&lt;/li&gt;
&lt;li&gt;Agen mendapatkan tepat data yang boleh dilihatnya&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tidak ada lapisan middleware. Tidak ada risiko ad-hoc query injection. Engine yang menangani authorization, bukan agen.&lt;/p&gt;
&lt;h2 id="mengapa-ini-penting-bagi-developer-net"&gt;Mengapa Ini Penting bagi Developer .NET&lt;/h2&gt;
&lt;p&gt;Jika Anda membangun layanan .NET dengan SQL Server sebagai primary store, pesan dari seri ini adalah: Anda tidak perlu menambahkan Redis untuk caching, database graph untuk relasi, atau vector store untuk embeddings — SQL Server 2025 menangani semuanya, dengan konsistensi operasional yang lebih baik daripada stack poliglot dan keamanan terpadu yang benar-benar bisa diaudit.&lt;/p&gt;
&lt;p&gt;Integrasi MCP berarti agen Semantic Kernel atau workflow Microsoft Agent Framework Anda bisa berinteraksi dengan data tier melalui SQL MCP Server yang sama, dengan jaminan keamanan yang sama yang Anda terapkan untuk query manusia.&lt;/p&gt;
&lt;h2 id="penutup"&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Seri Polyglot Tax layak dibaca dari awal sampai akhir. Bagian 1-3 membuktikan cerita query planner. Bagian 4 membuktikan cerita production. Bagi developer .NET yang membangun aplikasi agent-first atau AI-augmented di Azure SQL, arsitektur ini layak dipertimbangkan dengan serius.&lt;/p&gt;
&lt;p&gt;Post asli oleh 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 Menit Sehari Mengulang Penjelasan Kode ke Copilot? Ada Solusinya</title><link>https://thedotnetblog.com/id/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/id/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>Context rot itu nyata — agent AI Anda mulai melenceng setelah 30 turn, dan Anda membayar compaction tax setiap jam. auto-memory memberi GitHub Copilot CLI recall yang presisi tanpa membakar ribuan token.</description><content:encoded>&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/news/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Anda tahu momen ketika sesi Copilot Anda kena &lt;code&gt;/compact&lt;/code&gt; dan agent benar-benar lupa apa yang sedang Anda kerjakan? Lima menit berikutnya Anda menjelaskan ulang struktur folder, test yang gagal, dan tiga pendekatan yang sudah dicoba. Lalu itu terjadi lagi. Dan lagi.&lt;/p&gt;
&lt;p&gt;Desi Villanueva mencatatnya: &lt;strong&gt;68 menit per hari&lt;/strong&gt; — hanya untuk re-orientasi. Bukan menulis kode. Bukan review PR. Hanya mengingatkan AI tentang hal-hal yang sebenarnya sudah ia ketahui.&lt;/p&gt;
&lt;p&gt;Ternyata ada alasan konkret mengapa ini terjadi, dan ada solusi konkret juga.&lt;/p&gt;
&lt;h2 id="kebohongan-jendela-konteks"&gt;Kebohongan Jendela Konteks&lt;/h2&gt;
&lt;p&gt;Agent Anda datang dengan angka besar di kotak. 200K token. Kedengarannya masif. Dalam praktiknya, itu adalah batas atas, bukan jaminan.&lt;/p&gt;
&lt;p&gt;Ini matematika yang sebenarnya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200K context total&lt;/li&gt;
&lt;li&gt;Dikurangi sekitar 65K untuk tool MCP yang dimuat saat startup (~33%)&lt;/li&gt;
&lt;li&gt;Dikurangi sekitar 10K untuk file instruksi seperti &lt;code&gt;AGENTS.md&lt;/code&gt; atau &lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Itu menyisakan kira-kira &lt;strong&gt;125K sebelum Anda mengetik satu kata pun&lt;/strong&gt;. Dan makin buruk — LLM tidak menurun secara mulus saat context penuh. Mereka membentur tembok di sekitar 60% kapasitas. Model mulai kehilangan hal-hal yang disebut 30 turn sebelumnya, membantah jawaban sebelumnya, dan menghalusinasi nama file yang tadi ia sebut dengan sangat percaya diri 10 menit lalu. Industri menyebut ini masalah &amp;ldquo;lost in the middle&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Batas efektif: &lt;strong&gt;45K token&lt;/strong&gt; sebelum kualitas turun. Itu mungkin hanya 20-30 turn percakapan aktif sebelum agent mulai melenceng. Itulah kenapa Anda kena &lt;code&gt;/compact&lt;/code&gt; setiap 45 menit — bukan karena Anda sudah mengisi 200K token, tapi karena model sudah mulai rusak di 120K.&lt;/p&gt;
&lt;h2 id="pajak-kompaksi"&gt;Pajak Kompaksi&lt;/h2&gt;
&lt;p&gt;Setiap &lt;code&gt;/compact&lt;/code&gt; mengambil state alur kerja Anda. Anda sedang berada di sesi debugging yang dalam. Context bersama sudah terbentuk selama 30 menit. Agent tahu struktur file, test yang gagal, dan hipotesisnya. Lalu peringatannya muncul.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Abaikan → agent makin bodoh perlahan, mulai menghalusinasi state lama&lt;/li&gt;
&lt;li&gt;Jalankan &lt;code&gt;/compact&lt;/code&gt; → agent hanya mendapat ringkasan dua paragraf dari investigasi 30 menit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apa pun pilihannya, Anda kalah. Apa pun pilihannya, Anda menjelaskan proyek Anda seperti orang baru pada hari pertama.&lt;/p&gt;
&lt;p&gt;Bagian kejamnya? &lt;strong&gt;Memori itu sebenarnya sudah ada&lt;/strong&gt;. Copilot CLI menulis setiap sesi ke database SQLite lokal di &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt; — setiap file yang disentuh, setiap turn, setiap checkpoint. Semuanya ada di disk. Agent cuma tidak bisa membacanya.&lt;/p&gt;
&lt;h2 id="auto-memory-lapisan-recall-bukan-sistem-memori"&gt;auto-memory: lapisan recall, bukan sistem memori&lt;/h2&gt;
&lt;p&gt;Itulah ide utama di balik &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory&lt;/a&gt;: jangan bangun sistem memori baru — bangun lapisan query read-only di atas yang sudah ada.&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;Sekitar 1.900 baris Python. Tanpa dependensi. Terpasang dalam 30 detik.&lt;/p&gt;
&lt;p&gt;Alih-alih membanjiri context dengan hasil grep, Anda memberi agent akses bedah ke hal yang benar-benar penting:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operasi&lt;/th&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Apa yang Anda dapat&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 hasil, sebagian besar tidak relevan&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;Semua file Python, tanpa konteks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-orientasi agent&lt;/td&gt;
&lt;td&gt;~2,000&lt;/td&gt;
&lt;td&gt;Anda menjelaskan apa yang seharusnya sudah ia tahu&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;10 file yang Anda sentuh kemarin&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Itu peningkatan 200x. Agent melewati penggalian arkeologi dan langsung menuju hal yang penting.&lt;/p&gt;
&lt;p&gt;Alur yang direkomendasikan: saat Anda mendekati penggunaan 50-70% context, jalankan &lt;code&gt;/clear&lt;/code&gt; lalu prompt dengan: &amp;ldquo;review last sessions we discussed topic X&amp;rdquo;. Alih-alih membakar 12K token untuk pencarian buta, auto-memory mengambil konteks yang relevan hanya dalam 50 token.&lt;/p&gt;
&lt;h2 id="kenapa-ini-penting-untuk-developer-net"&gt;Kenapa Ini Penting untuk Developer .NET&lt;/h2&gt;
&lt;p&gt;Jika Anda memakai GitHub Copilot CLI untuk pekerjaan .NET — scaffolding service, debugging query EF Core, iterasi pada komponen Blazor — masalah context rot menghantam sama kerasnya. Solusi kompleks dengan banyak proyek, library bersama, dan call chain yang dalam adalah jenis codebase yang paling cepat membuat agent kehilangan arah.&lt;/p&gt;
&lt;p&gt;Panduan instalasi menjelaskan cara mengarahkan Copilot CLI ke sana. Itu setup satu kali.&lt;/p&gt;
&lt;p&gt;Sejujurnya? Mengembalikan 68 menit per hari bukan sekadar tweak kecil untuk kualitas hidup. Itu hampir 6 jam per minggu.&lt;/p&gt;
&lt;h2 id="penutup"&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Context rot adalah batasan arsitektural yang nyata, bukan bug yang akan dipatch. auto-memory mengatasinya dengan memberi agent mekanisme recall yang murah dan presisi, bukan re-exploration yang mahal dan berisik. Kalau Anda melakukan pengembangan serius berbantuan AI dengan GitHub Copilot CLI, instalasi 30 detiknya layak dilakukan.&lt;/p&gt;
&lt;p&gt;Lihat: &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory di GitHub&lt;/a&gt;. Post asli oleh 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>