<?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>RLS on hdknr blog</title><link>https://hdknr.github.io/blogs/tags/rls/</link><description>Recent content in RLS on hdknr blog</description><generator>Hugo -- 0.157.0</generator><language>ja</language><lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hdknr.github.io/blogs/tags/rls/index.xml" rel="self" type="application/rss+xml"/><item><title>Supabase</title><link>https://hdknr.github.io/blogs/wiki/tools/supabase/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/wiki/tools/supabase/</guid><description>PostgreSQL ベースの BaaS プラットフォーム。Firebase のオープンソース代替。Claude Code 向け agent-skills でベストプラクティスを自動適用可能</description></item><item><title>Supabase × Claude Code: agent-skills でパフォーマンスと RLS の正確性を高める</title><link>https://hdknr.github.io/blogs/posts/2026/03/supabase-claude-code-agent-skills-%E3%81%A7%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%A8-rls-%E3%81%AE%E6%AD%A3%E7%A2%BA%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://hdknr.github.io/blogs/posts/2026/03/supabase-claude-code-agent-skills-%E3%81%A7%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%A8-rls-%E3%81%AE%E6%AD%A3%E7%A2%BA%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B/</guid><description>&lt;h2 id="supabase-とは"&gt;Supabase とは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://supabase.com"&gt;Supabase&lt;/a&gt; は &lt;strong&gt;Firebase のオープンソース代替&lt;/strong&gt; として急成長している BaaS（Backend as a Service）だ。PostgreSQL をベースに、認証・リアルタイムデータベース・ストレージ・Edge Functions をワンストップで提供する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL がそのまま使える&lt;/strong&gt; — 独自のクエリ言語ではなく標準 SQL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt; — テーブル単位でアクセス制御ポリシーを定義&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動生成 REST API&lt;/strong&gt; — テーブル定義から即座に CRUD API が生成される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;オープンソース&lt;/strong&gt; — セルフホスティングも可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;無料枠あり&lt;/strong&gt; — 個人プロジェクトなら無料で始められる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Firebase との最大の違いは「中身が PostgreSQL」である点だ。NoSQL ではなく RDB なので、既存の SQL 知識がそのまま活かせる。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Supabase を使っているプロジェクトで Claude Code を活用している場合、公式の &lt;code&gt;supabase/agent-skills&lt;/code&gt; をインストールするだけでコード品質とパフォーマンスが大幅に向上する。特に Row Level Security (RLS) の書き方ミスを防ぐ効果が高い。&lt;/p&gt;
&lt;h2 id="なぜ-agent-skills-が必要なのか"&gt;なぜ agent-skills が必要なのか&lt;/h2&gt;
&lt;p&gt;Claude Code は Supabase の細かいベストプラクティスをデフォルトでは把握していない。たとえば RLS ポリシーで頻出する次のパターンを考えてほしい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ❌ Claude がデフォルトで書きがちなコード
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;create&lt;/span&gt; policy &lt;span style="color:#e6db74"&gt;&amp;#34;users can view own records&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;.records
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; (auth.uid() &lt;span style="color:#f92672"&gt;=&lt;/span&gt; user_id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ✅ パフォーマンスを考慮した正しい書き方
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;create&lt;/span&gt; policy &lt;span style="color:#e6db74"&gt;&amp;#34;users can view own records&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;.records
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; ((&lt;span style="color:#66d9ef"&gt;select&lt;/span&gt; auth.uid()) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; user_id);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;auth.uid()&lt;/code&gt; をそのまま使うとクエリの行ごとに関数が評価されるが、&lt;code&gt;(select auth.uid() as uid)&lt;/code&gt; のようにサブクエリ化することでクエリプランナーが一度だけ評価するよう最適化できる。これによってテーブルスキャン時のパフォーマンスが大幅に改善する。&lt;/p&gt;</description></item></channel></rss>