{"id":23711,"date":"2025-11-14T23:44:24","date_gmt":"2025-11-14T23:44:24","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=23711"},"modified":"2025-11-14T23:44:24","modified_gmt":"2025-11-14T23:44:24","slug":"drizzle-orm-%e3%81%a7%e6%a4%9c%e8%a8%bc%e3%81%99%e3%82%8b-row-level-security","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/23711\/","title":{"rendered":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security"},"content":{"rendered":"\n<\/p>\n<div>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/s\/swx-satoshi-moriyama\/20251115\/20251115055636.png\" width=\"1200\" height=\"630\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<h2 id=\"\u306f\u3058\u3081\u306b\">\u306f\u3058\u3081\u306b<\/h2>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u672c\u90e8\u30c7\u30a3\u30d9\u30ed\u30c3\u30d7\u30e1\u30f3\u30c8\u30b5\u30fc\u30d3\u30b9\uff11\u8ab2\u306e\u68ee\u5c71\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u3001RDS \u306b\u304a\u3051\u308b RLS (Row Level Security) \u306b\u3064\u3044\u3066\u8a18\u4e8b\u306b\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u524d\u8077\u304b\u3089\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 SaaS \u306e\u958b\u767a\u306b\u643a\u308f\u3063\u3066\u304a\u308a\u3001\u30ea\u30ec\u30fc\u30b7\u30e7\u30ca\u30eb\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u304a\u3051\u308b\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u6226\u7565\u306e\u4e00\u3064\u3067\u3042\u308b\u3001Row Level Security \u306b\u3064\u3044\u3066\u691c\u8a3c\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u4eca\u56de\u306f\u6700\u8fd1\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7\u4e2d\u306e TypeScript \u306e ORM \u3067\u3042\u308b Drizzle \u3092\u4f7f\u3063\u3066\u52d5\u4f5c\u691c\u8a3c\u3092\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Form.drizzle.team%2F\" title=\"Drizzle ORM - next gen TypeScript ORM.\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\" loading=\"lazy\"><\/iframe><cite class=\"hatena-citation\"><a target=\"_blank\" href=\"https:\/\/orm.drizzle.team\/\">orm.drizzle.team<\/a><\/cite><\/p>\n<h2 id=\"Row-Level-Security-\u3068\u306f\">Row Level Security \u3068\u306f<\/h2>\n<p>Row Level Security\uff08RLS\uff09\u306f\u3001PostgreSQL 9.5 \u4ee5\u964d\u3067\u5229\u7528\u53ef\u80fd\u306a\u6a5f\u80fd\u3067\u3001\u30c6\u30fc\u30d6\u30eb\u306e\u884c\u30ec\u30d9\u30eb\u3067\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u5f93\u6765\u306e\u30c6\u30fc\u30d6\u30eb\u30fb\u30ab\u30e9\u30e0\u30ec\u30d9\u30eb\u306e\u6a29\u9650\u5236\u5fa1\u3067\u306f\u3001\u300c\u30c6\u30fc\u30d6\u30eb\u5168\u4f53\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u304b\u3069\u3046\u304b\u300d\u3057\u304b\u5236\u5fa1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001RLS \u3092\u4f7f\u3046\u3053\u3068\u3067\u300c\u3069\u306e\u884c\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u304b\u300d\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30ec\u30d9\u30eb\u3067\u5236\u5fa1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 SaaS \u3067\u306f\u3001\u8907\u6570\u306e\u9867\u5ba2\uff08\u30c6\u30ca\u30f3\u30c8\uff09\u306e\u30c7\u30fc\u30bf\u3092\u540c\u4e00\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u7ba1\u7406\u3059\u308b\u30d1\u30bf\u30fc\u30f3\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5c64\u3067\u306e\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u306b\u52a0\u3048\u3066\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5c64\u3067\u3082 RLS \u306b\u3088\u308b\u5206\u96e2\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u591a\u5c64\u9632\u5fa1\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u3001\u3053\u306e RLS \u3092 TypeScript \u306e ORM \u3067\u3042\u308b Drizzle \u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u5b9f\u88c5\u3059\u308b\u969b\u306e\u30dd\u30a4\u30f3\u30c8\u3084\u6ce8\u610f\u70b9\u306b\u3064\u3044\u3066\u691c\u8a3c\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h2 id=\"\u52d5\u4f5c\u691c\u8a3c\">\u52d5\u4f5c\u691c\u8a3c<\/h2>\n<p>\u5b9f\u969b\u306b\u52d5\u4f5c\u691c\u8a3c\u3067\u304d\u308b\u3088\u3046\u306b\u4ee5\u4e0b\u691c\u8a3c\u30b3\u30fc\u30c9\u3092\u516c\u958b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Fgithub.com%2FSatoshiMoriyama%2Frds_rls_drizzle\" title=\"GitHub - SatoshiMoriyama\/rds_rls_drizzle\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\" loading=\"lazy\"><\/iframe><cite class=\"hatena-citation\"><a target=\"_blank\" href=\"https:\/\/github.com\/SatoshiMoriyama\/rds_rls_drizzle\">github.com<\/a><\/cite><\/p>\n<p>\u5b9f\u969b\u306b\u52d5\u4f5c\u3055\u305b\u3066\u307f\u305f\u3044\u5834\u5408\u306f\u30af\u30ed\u30fc\u30f3\u3057\u3066\u3044\u305f\u3060\u304d\u3001\u52d5\u4f5c\u78ba\u8a8d\u3057\u3066\u3044\u305f\u3060\u3051\u308c\u3070\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u306a\u304a\u3001\u3053\u306e\u30b3\u30fc\u30c9\u306f\u691c\u8a3c\u7528\u306e\u7c21\u6613\u5b9f\u88c5\u3067\u3059\u306e\u3067\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002<\/p>\n<h3 id=\"\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u3068-RLS-\u8a2d\u5b9a\">\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u3068 RLS \u8a2d\u5b9a<\/h3>\n<p>\u4eca\u56de\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8907\u6570\u30c6\u30ca\u30f3\u30c8\u306e\u6ce8\u6587\u3092\u7ba1\u7406\u3059\u308b<code>orders<\/code>\u30c6\u30fc\u30d6\u30eb\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<div class=\"s_table\"><table>\n<thead>\n<tr>\n<th> \u30ab\u30e9\u30e0\u540d     <\/th>\n<th> \u578b      <\/th>\n<th> \u8aac\u660e                    <\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td> id           <\/td>\n<td> SERIAL  <\/td>\n<td> \u4e3b\u30ad\u30fc                  <\/td>\n<\/tr>\n<tr>\n<td> tenant_id    <\/td>\n<td> INTEGER <\/td>\n<td> \u30c6\u30ca\u30f3\u30c8 ID\uff08\u5206\u96e2\u30ad\u30fc\uff09 <\/td>\n<\/tr>\n<tr>\n<td> product_name <\/td>\n<td> TEXT    <\/td>\n<td> \u5546\u54c1\u540d                  <\/td>\n<\/tr>\n<tr>\n<td> amount       <\/td>\n<td> INTEGER <\/td>\n<td> \u91d1\u984d                    <\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>\u5c5e\u6027<code>tenant_id<\/code>\u3092\u30ad\u30fc\u306b RLS \u3067\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u306f\u3001\u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\u3068 RLS \u306e\u6709\u52b9\u5316\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-sql\" data-lang=\"sql\" data-unlink=\"\">\n<span class=\"synStatement\">CREATE<\/span> <span class=\"synSpecial\">TABLE<\/span> orders (\n    id SERIAL PRIMARY KEY,\n    tenant_id <span class=\"synType\">INTEGER<\/span>,\n    product_name TEXT,\n    amount <span class=\"synType\">INTEGER<\/span>\n);\n  \n\n<span class=\"synStatement\">ALTER<\/span> <span class=\"synSpecial\">TABLE<\/span> orders ENABLE <span class=\"synSpecial\">ROW<\/span> <span class=\"synSpecial\">LEVEL<\/span> SECURITY;\n  \n\n<span class=\"synStatement\">CREATE<\/span> POLICY tenant_policy <span class=\"synSpecial\">ON<\/span> orders\n<span class=\"synSpecial\">FOR<\/span> <span class=\"synStatement\">ALL<\/span> <span class=\"synSpecial\">TO<\/span> app_user\n<span class=\"synSpecial\">USING<\/span> (tenant_id = current_setting(<span class=\"synSpecial\">'<\/span><span class=\"synConstant\">app.current_tenant<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synSpecial\">true<\/span>)::<span class=\"synType\">INTEGER<\/span>);\n  \n\n<span class=\"synStatement\">INSERT<\/span> <span class=\"synSpecial\">INTO<\/span> orders (tenant_id, product_name, amount) <span class=\"synSpecial\">VALUES<\/span>\n  (<span class=\"synConstant\">1<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product A<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">100<\/span>),\n  (<span class=\"synConstant\">1<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product B<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">200<\/span>),\n  (<span class=\"synConstant\">1<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product C<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">150<\/span>),\n  (<span class=\"synConstant\">2<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product D<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">300<\/span>),\n  (<span class=\"synConstant\">2<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product E<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">400<\/span>),\n  (<span class=\"synConstant\">2<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product F<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">250<\/span>),\n  (<span class=\"synConstant\">3<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product G<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">500<\/span>),\n  (<span class=\"synConstant\">3<\/span>, <span class=\"synSpecial\">'<\/span><span class=\"synConstant\">Product H<\/span><span class=\"synSpecial\">'<\/span>, <span class=\"synConstant\">600<\/span>);\n<\/pre>\n<p>\u30c6\u30fc\u30d6\u30eb\u5358\u4f4d\u3067 RLS \u3092\u6709\u52b9\u5316\u3057\u3001\u3069\u306e\u3088\u3046\u306b\u5206\u96e2\u3059\u308b\u304b\u3092\u30dd\u30ea\u30b7\u30fc\u3067\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u969b\u306b\u4f5c\u6210\u3059\u308b\u306b\u306f\u30d5\u30a9\u30eb\u30c0<code>postgres<\/code>\u306b<code>docker-compose.yml<\/code>\u3092\u683c\u7d0d\u3057\u3066\u3044\u307e\u3059\u306e\u3067\u3001\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3067 Docker \u3092\u8d77\u52d5\u3057\u3066\u3044\u305f\u3060\u3051\u308c\u3070\u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"code console\" data-lang=\"console\" data-unlink=\"\">cd postgres\ndocker compose up -d<\/pre>\n<p>\u306a\u304a\u3001PostgreSQL \u3067\u306f\u3001\u30c6\u30fc\u30d6\u30eb\u6240\u6709\u8005\u3084\u30b9\u30fc\u30d1\u30fc\u30e6\u30fc\u30b6\u30fc\u306f RLS \u30dd\u30ea\u30b7\u30fc\u306e\u5f71\u97ff\u3092\u53d7\u3051\u307e\u305b\u3093\u3002<\/p>\n<p>\u305d\u306e\u305f\u3081\u3001\u4eca\u56de\u306e\u691c\u8a3c\u3067\u306f<code>app_user<\/code>\u3068\u3044\u3046\u4e00\u822c\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3057\u3001\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u63a5\u7d9a\u3059\u308b\u3053\u3068\u3067 RLS \u306e\u52d5\u4f5c\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<h3 id=\"\u52d5\u4f5c\u78ba\u8a8dSQL\">\u52d5\u4f5c\u78ba\u8a8d\uff08SQL\uff09<\/h3>\n<p>\u307e\u305a\u306f SQL \u3067\u52d5\u4f5c\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code SQL\" data-lang=\"SQL\" data-unlink=\"\">-- Run-time parameter\u3092\u8a2d\u5b9a\u3057\u3066\u30af\u30a8\u30ea\u5b9f\u884c\nSET app.current_tenant=\"1\";\nSELECT * FROM orders;<\/pre>\n<p>\u554f\u984c\u306a\u304f\u3001\u30c6\u30ca\u30f3\u30c8ID\u304c<code>1<\/code>\u306e\u30c7\u30fc\u30bf\u3060\u3051\u53d6\u5f97\u3067\u304d\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/s\/swx-satoshi-moriyama\/20251114\/20251114060938.png\" width=\"1061\" height=\"287\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u3067\u306f\u3001\u6b21\u306b\u30c6\u30ca\u30f3\u30c8ID\u304c<code>2<\/code>\u306e\u5834\u5408\u3082\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code SQL\" data-lang=\"SQL\" data-unlink=\"\">SET app.current_tenant=\"2\";\nSELECT * FROM orders;<\/pre>\n<p>\u554f\u984c\u306a\u3044\u3067\u3059\u3002<\/p>\n<p><span itemscope=\"\" itemtype=\"http:\/\/schema.org\/Photograph\"><img decoding=\"async\" src=\"https:\/\/cdn-ak.f.st-hatena.com\/images\/fotolife\/s\/swx-satoshi-moriyama\/20251114\/20251114060956.png\" width=\"1081\" height=\"283\" loading=\"lazy\" title=\"\" class=\"hatena-fotolife\" itemprop=\"image\"\/><\/span><\/p>\n<p>\u306a\u304a\u3001\u52d5\u4f5c\u78ba\u8a8d\u306f Drizzle Studio \u306e SQL console \u3067\u5b9f\u65bd\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067 \u30ed\u30fc\u30ab\u30eb(<code>https:\/\/local.drizzle.studio<\/code>) \u4e0a\u3067\u52d5\u4f5c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">% pnpm db:studio\n\n&gt; drizzle-kit studio\n\n...\u7565\n\nDrizzle Studio is up and running on https:\/\/local.drizzle.studio<\/pre>\n<h2 id=\"\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u5229\u7528\u6642\u306e\u6ce8\u610f\u70b9\">\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u5229\u7528\u6642\u306e\u6ce8\u610f\u70b9<\/h2>\n<p>\u3053\u308c\u307e\u3067\u306e\u691c\u8a3c\u306e\u901a\u308a\u3001\u53d6\u5f97\u3057\u305f\u3044\u30c6\u30ca\u30f3\u30c8\u306e\u5bfe\u8c61\u306f<code>SET app.current_tenant=\"1\";<\/code>\u306e\u3088\u3046\u306a SET \u30b3\u30de\u30f3\u30c9\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>\u3044\u304f\u3064\u304b\u306e\u6761\u4ef6\u306f\u3042\u308b\u3082\u306e\u306e\u3001\u3053\u306e\u30b3\u30de\u30f3\u30c9\u3067\u8a2d\u5b9a\u3055\u308c\u305f\u5024\uff08<code>Run-time parameter<\/code>\uff09\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u7d42\u4e86\u6642\u307e\u3067\u306f\u7dad\u6301\u3055\u308c\u308b\u8a2d\u5b9a\u3067\u3059\u3002<\/p>\n<blockquote>\n<p>If SET (or equivalently SET SESSION) is issued within a transaction that is later aborted, the effects of the SET command disappear when the transaction is rolled back. Once the surrounding transaction is committed, the effects will persist until the end of the session, unless overridden by another SET.<\/p>\n<\/blockquote>\n<p><a target=\"_blank\" href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-set.html\">PostgreSQL: Documentation: 18: SET<\/a><\/p>\n<p>\u3053\u306e\u6319\u52d5\u306b\u3088\u308a\u3001\uff11\u3064\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\uff08\uff1d\u30bb\u30c3\u30b7\u30e7\u30f3\uff09\u3092\u8907\u6570\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u4f7f\u3044\u56de\u3059\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u3068\u306e\u4f75\u7528\u6642\u306b\u306f\u8003\u616e\u3059\u3079\u304d\u70b9\u304c\u3044\u304f\u3064\u304b\u3042\u308a\u307e\u3059\u3002<\/p>\n<h3 id=\"Run-time-parameter-\u8a2d\u5b9a\u6f0f\u308c\u306b\u3088\u308b\u30c6\u30ca\u30f3\u30c8\u9593\u53c2\u7167\">Run-time parameter \u8a2d\u5b9a\u6f0f\u308c\u306b\u3088\u308b\u30c6\u30ca\u30f3\u30c8\u9593\u53c2\u7167<\/h3>\n<p>\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u306f\u3001\u4e00\u5b9a\u91cf\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u3042\u3089\u304b\u3058\u3081\u4f5c\u6210\u3057\u3066\u304a\u304d\u3001\u8907\u6570\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u305d\u308c\u3089\u3092\u4f7f\u3044\u56de\u3059\u3053\u3068\u3067\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u4f5c\u6210\u306e\u30b3\u30b9\u30c8\u3092\u524a\u6e1b\u3059\u308b\u6280\u8853\u3067\u3059\u3002<\/p>\n<p>\u3057\u304b\u3057\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u4f7f\u3044\u56de\u3059\u969b\u306b\u306f\u3001\u524d\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u8a2d\u5b9a\u3057\u305f Run-time parameter \u3082\u6b21\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5f15\u304d\u7d99\u304c\u308c\u3066\u3057\u307e\u3046\u3068\u3044\u3046\u7279\u6027\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u305d\u306e\u305f\u3081\u3001Run-time parameter \u306e\u8a2d\u5b9a\uff08\u4e0a\u66f8\u304d\uff09\u3092\u5fd8\u308c\u308b\u3068\u3001\u524d\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u8a2d\u5b9a\u3055\u308c\u305f\u5024\u304c\u6b8b\u3063\u305f\u307e\u307e\u306b\u306a\u308a\u3001\u81ea\u30c6\u30ca\u30f3\u30c8\u4ee5\u5916\u306e\u30c7\u30fc\u30bf\u304c\u53d6\u5f97\u3067\u304d\u3066\u3057\u307e\u3046\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3067\u3001\u64ec\u4f3c\u7684\u306b\u518d\u73fe\u3055\u305b\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u540c\u3058\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u3066\u3001\u30c6\u30ca\u30f3\u30c8\uff11\u3001\uff12\u306e\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30c6\u30ca\u30f3\u30c8\uff12\u5074\u306e\u30bd\u30fc\u30b9\u306f SET \u30b3\u30de\u30f3\u30c9\u306e\u8a2d\u5b9a\u304c\u629c\u3051\u3066\u3044\u308b\u30d1\u30bf\u30fc\u30f3\u3067\u3059\u3002<\/p>\n<pre class=\"code lang-typescript\" data-lang=\"typescript\" data-unlink=\"\"><span class=\"synSpecial\">import<\/span> <span class=\"synConstant\">\"dotenv\/config\"<\/span>;\n<span class=\"synSpecial\">import<\/span> <span class=\"synIdentifier\">{<\/span> db <span class=\"synIdentifier\">}<\/span> <span class=\"synSpecial\">from<\/span> <span class=\"synConstant\">\".\/db\/client.js\"<\/span>;\n<span class=\"synSpecial\">import<\/span> <span class=\"synIdentifier\">{<\/span> orders <span class=\"synIdentifier\">}<\/span> <span class=\"synSpecial\">from<\/span> <span class=\"synConstant\">\".\/db\/schema.js\"<\/span>;\n<span class=\"synSpecial\">import<\/span> <span class=\"synIdentifier\">{<\/span> sql <span class=\"synIdentifier\">}<\/span> <span class=\"synSpecial\">from<\/span> <span class=\"synConstant\">\"drizzle-orm\"<\/span>;\n  \n\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withTenantSession<\/span>T&gt;(\n<span class=\"synPreProc\">  tenantId<\/span>:<span class=\"synPreProc\"> <\/span><span class=\"synType\">number<\/span><span class=\"synStatement\">,<\/span>\n<span class=\"synPreProc\">  operation<\/span>:<span class=\"synPreProc\"> <\/span>() <span class=\"synIdentifier\">=&gt;<\/span><span class=\"synPreProc\"> <\/span><span class=\"synIdentifier\">Promise<\/span>T&gt;\n): <span class=\"synIdentifier\">Promise<\/span>T&gt; <span class=\"synIdentifier\">{<\/span>\n  <span class=\"synStatement\">await<\/span> db.execute(sql.raw(<span class=\"synConstant\">`SET app.current_tenant=\"<\/span><span class=\"synStatement\">${<\/span>tenantId<span class=\"synStatement\">}<\/span><span class=\"synConstant\">\"`<\/span>));\n  <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> operation();\n<span class=\"synIdentifier\">}<\/span>\n  \n\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withoutTenantSession<\/span>T&gt;(\n<span class=\"synPreProc\">  operation<\/span>:<span class=\"synPreProc\"> <\/span>() <span class=\"synIdentifier\">=&gt;<\/span><span class=\"synPreProc\"> <\/span><span class=\"synIdentifier\">Promise<\/span>T&gt;\n): <span class=\"synIdentifier\">Promise<\/span>T&gt; <span class=\"synIdentifier\">{<\/span>\n  <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> operation();\n<span class=\"synIdentifier\">}<\/span>\n  \n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">main<\/span>() <span class=\"synIdentifier\">{<\/span>\n  \n  <span class=\"synType\">console<\/span>.log(<span class=\"synConstant\">\"<\/span><span class=\"synSpecial\">\\n<\/span><span class=\"synConstant\">--- Tenant 1 Orders ---\"<\/span>);\n  <span class=\"synIdentifier\">const<\/span> tenant1Orders = <span class=\"synStatement\">await<\/span> withTenantSession(<span class=\"synConstant\">1<\/span>, <span class=\"synStatement\">async<\/span> ()<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db.select().from(orders);\n  <span class=\"synIdentifier\">}<\/span>);\n  <span class=\"synType\">console<\/span>.log(tenant1Orders);\n  \n  \n  <span class=\"synType\">console<\/span>.log(<span class=\"synConstant\">\"<\/span><span class=\"synSpecial\">\\n<\/span><span class=\"synConstant\">--- Tenant 2 Orders ---\"<\/span>);\n  <span class=\"synIdentifier\">const<\/span> noSessionOrders = <span class=\"synStatement\">await<\/span> withoutTenantSession(<span class=\"synStatement\">async<\/span> ()<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db.select().from(orders);\n  <span class=\"synIdentifier\">}<\/span>);\n  <span class=\"synType\">console<\/span>.log(noSessionOrders);\n  \n  <span class=\"synType\">process<\/span>.exit(<span class=\"synConstant\">0<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n  \nmain().<span class=\"synStatement\">catch<\/span>((<span class=\"synPreProc\">error<\/span>)<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n  <span class=\"synType\">console<\/span>.error(<span class=\"synConstant\">\"Error:\"<\/span>, error);\n  <span class=\"synType\">process<\/span>.exit(<span class=\"synConstant\">1<\/span>);\n<span class=\"synIdentifier\">}<\/span>);\n<\/pre>\n<p><code>pnpm run dev<\/code>\u3067\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u5b9f\u65bd\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">--- Tenant 1 Orders ---\n[\n  { id: 1, tenantId: 1, productName: 'Product A', amount: 100 },\n  { id: 2, tenantId: 1, productName: 'Product B', amount: 200 },\n  { id: 3, tenantId: 1, productName: 'Product C', amount: 150 }\n]\n\n--- Tenant 2 Orders ---\n[\n  { id: 1, tenantId: 1, productName: 'Product A', amount: 100 },\n  { id: 2, tenantId: 1, productName: 'Product B', amount: 200 },\n  { id: 3, tenantId: 1, productName: 'Product C', amount: 150 }\n]<\/pre>\n<p>\u30c6\u30ca\u30f3\u30c8 2 \u306e\u60c5\u5831\u3092\u53d6\u5f97\u3057\u305f\u3044\u306b\u3082\u95a2\u308f\u3089\u305a\u3001\u524d\u306e\u51e6\u7406\u306e\u30c6\u30ca\u30f3\u30c8\uff11\u306e\u30c7\u30fc\u30bf\u304c\u53d6\u5f97\u3067\u304d\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002<\/p>\n<p><strong>\u5225\u306e\u30c6\u30ca\u30f3\u30c8\u3078\u306e\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u306f\u30d3\u30b8\u30cd\u30b9\u4e0a\u3001\u975e\u5e38\u306b\u5927\u304d\u306a\u554f\u984c\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002<\/strong><\/p>\n<h3 id=\"\u30d4\u30f3\u7559\u3081\u554f\u984c\">\u30d4\u30f3\u7559\u3081\u554f\u984c<\/h3>\n<p>\u6b21\u306b Amazon RDS Proxy \u5229\u7528\u6642\u306b\u3082\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Faws.amazon.com%2Fjp%2Frds%2Fproxy%2F\" title=\"\u9ad8\u53ef\u7528\u6027\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7 \u2013 Amazon RDS Proxy \u2013 Amazon Web Services\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\" loading=\"lazy\"><\/iframe><cite class=\"hatena-citation\"><a target=\"_blank\" href=\"https:\/\/aws.amazon.com\/jp\/rds\/proxy\/\">aws.amazon.com<\/a><\/cite><\/p>\n<p>RDS Proxy \u306f\u3001Lambda \u306a\u3069\u306e\u30b9\u30b1\u30fc\u30eb\u3059\u308b\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30ea\u30bd\u30fc\u30b9\u3068 RDS \u306e\u9593\u3067\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u3092\u63d0\u4f9b\u3057\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3078\u306e\u63a5\u7d9a\u6570\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b\u30b5\u30fc\u30d3\u30b9\u3067\u3059\u3002<\/p>\n<p>\u3057\u304b\u3057\u3001\u7279\u5b9a\u306e\u64cd\u4f5c\uff08SET \u30b3\u30de\u30f3\u30c9\u306a\u3069\uff09\u3092\u5b9f\u884c\u3059\u308b\u3068\u300c\u30d4\u30f3\u7559\u3081\u300d\u304c\u767a\u751f\u3057\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u306e\u52b9\u679c\u304c\u5931\u308f\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u30d4\u30f3\u7559\u3081\u554f\u984c\u306b\u3064\u3044\u3066\u306f\u4e0b\u8a18\u306e\u30da\u30fc\u30b8\u306b\u8a73\u7d30\u306e\u8a18\u8f09\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u304c\u5229\u7528\u3057\u305f\u30ea\u30af\u30a8\u30b9\u30c8\u5c02\u7528\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u3068\u3057\u3066\u56fa\u5b9a\u3055\u308c\u3066\u3057\u307e\u3044\u3001<br \/>\n\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u306e\u518d\u5229\u7528\u304c\u3067\u304d\u306a\u304f\u306a\u308b\u554f\u984c\u3067\u3059\u3002<\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Fdocs.aws.amazon.com%2Fja_jp%2FAmazonRDS%2Flatest%2FAuroraUserGuide%2Frds-proxy-pinning.html\" title=\"RDS Proxy \u306e\u56fa\u5b9a\u306e\u56de\u907f - Amazon Aurora\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\" loading=\"lazy\"><\/iframe><cite class=\"hatena-citation\"><a target=\"_blank\" href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/AmazonRDS\/latest\/AuroraUserGuide\/rds-proxy-pinning.html\">docs.aws.amazon.com<\/a><\/cite><\/p>\n<p><iframe src=\"https:\/\/hatenablog-parts.com\/embed?url=https%3A%2F%2Fdocs.aws.amazon.com%2Fja_jp%2FAmazonRDS%2Flatest%2FUserGuide%2Frds-proxy-pinning.html\" title=\"RDS Proxy \u306e\u56fa\u5b9a\u306e\u56de\u907f - Amazon Relational Database Service\" class=\"embed-card embed-webcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;\" loading=\"lazy\"><\/iframe><cite class=\"hatena-citation\"><a target=\"_blank\" href=\"https:\/\/docs.aws.amazon.com\/ja_jp\/AmazonRDS\/latest\/UserGuide\/rds-proxy-pinning.html\">docs.aws.amazon.com<\/a><\/cite><\/p>\n<p>\u4e0a\u8a18\u30da\u30fc\u30b8\u306b Aurora PostgreSQL \/ RDS for PostgreSQL\u3067\u56fa\u5b9a\u304c\u767a\u751f\u3059\u308b\u6761\u4ef6\u3068\u3057\u3066\u3001<code>SET \u30b3\u30de\u30f3\u30c9\u306e\u4f7f\u7528<\/code>\u304c\u660e\u8a18\u3055\u308c\u3066\u304a\u308a\u3001\u3053\u306e\u70b9\u3078\u306e\u8003\u616e\u3082\u5fc5\u8981\u3067\u3059<\/p>\n<h2 id=\"\u89e3\u6c7a\u6cd5\">\u89e3\u6c7a\u6cd5<\/h2>\n<p>\u4e0a\u8a18\u306e\u554f\u984c\u306b\u5bfe\u3057\u3066\u3001\u3044\u304f\u3064\u304b\u89e3\u6c7a\u7b56\u3092\u8a18\u8f09\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<h3 id=\"SET-LOCAL\u30b3\u30de\u30f3\u30c9\u3092\u5229\u7528\u3059\u308b\"><code>SET LOCAL<\/code>\u30b3\u30de\u30f3\u30c9\u3092\u5229\u7528\u3059\u308b\u3002<\/h3>\n<p>\u307e\u305a\u306f<code>SET<\/code>\u3088\u308a\u3082\u9069\u7528\u30b9\u30b3\u30fc\u30d7\u304c\u72ed\u3044\u3001<code>SET LOCAL<\/code>\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3046\u3053\u3068\u3067\u89e3\u6c7a\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p><code>SET LOCAL<\/code>\u306f\u9069\u7528\u30b9\u30b3\u30fc\u30d7\u304c\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5185\u306b\u9650\u5b9a\u3055\u308c\u307e\u3059\u3002<br \/>\n\u305d\u306e\u305f\u3081\u3001\u4ed6\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u8a2d\u5b9a\u3057\u305f Run-time parameter \u3092\u4f7f\u3044\u56de\u3059\u3053\u3068\u304c\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u30d4\u30f3\u7559\u3081\u554f\u984c\u3082\u767a\u751f\u3057\u307e\u305b\u3093\u3002<\/p>\n<p>\u4ee5\u4e0b\u3001\u5148\u307b\u3069\u306e\u691c\u8a3c\u30bd\u30fc\u30b9\u3092<code>SET LOCAL<\/code>\u306b\u4fee\u6b63\u3057\u305f\u30bd\u30fc\u30b9\u3067\u52d5\u4f5c\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code lang-typescript\" data-lang=\"typescript\" data-unlink=\"\">\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withTenantSession<\/span>T&gt;(\n<span class=\"synPreProc\">  tenantId<\/span>:<span class=\"synPreProc\"> <\/span><span class=\"synType\">number<\/span><span class=\"synStatement\">,<\/span>\n<span class=\"synPreProc\">  operation<\/span>:<span class=\"synPreProc\"> <\/span>(<span class=\"synSpecial\">tx<\/span>:<span class=\"synSpecial\"> <\/span><span class=\"synType\">any<\/span>) <span class=\"synIdentifier\">=&gt;<\/span><span class=\"synPreProc\"> <\/span><span class=\"synIdentifier\">Promise<\/span>T&gt;\n): <span class=\"synIdentifier\">Promise<\/span>T&gt; <span class=\"synIdentifier\">{<\/span>\n  <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db.transaction(<span class=\"synStatement\">async<\/span> (<span class=\"synPreProc\">tx<\/span>)<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n    <span class=\"synStatement\">await<\/span> tx.execute(sql.raw(<span class=\"synConstant\">`SET LOCAL app.current_tenant=\"<\/span><span class=\"synStatement\">${<\/span>tenantId<span class=\"synStatement\">}<\/span><span class=\"synConstant\">\"`<\/span>));\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> operation(tx);\n  <span class=\"synIdentifier\">}<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n  \n\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withoutTenantSession<\/span>T&gt;(\n<span class=\"synPreProc\">  operation<\/span>:<span class=\"synPreProc\"> <\/span>() <span class=\"synIdentifier\">=&gt;<\/span><span class=\"synPreProc\"> <\/span><span class=\"synIdentifier\">Promise<\/span>T&gt;\n): <span class=\"synIdentifier\">Promise<\/span>T&gt; <span class=\"synIdentifier\">{<\/span>\n  <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> operation();\n<span class=\"synIdentifier\">}<\/span>\n  \n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">main<\/span>() <span class=\"synIdentifier\">{<\/span>\n  \n  <span class=\"synType\">console<\/span>.log(<span class=\"synConstant\">\"<\/span><span class=\"synSpecial\">\\n<\/span><span class=\"synConstant\">--- Tenant 1 Orders ---\"<\/span>);\n  <span class=\"synIdentifier\">const<\/span> tenant1Orders = <span class=\"synStatement\">await<\/span> withTenantSession(<span class=\"synConstant\">1<\/span>, <span class=\"synStatement\">async<\/span> (<span class=\"synPreProc\">tx<\/span>)<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> tx.select().from(orders);\n  <span class=\"synIdentifier\">}<\/span>);\n  <span class=\"synType\">console<\/span>.log(tenant1Orders);\n  \n  \n  <span class=\"synType\">console<\/span>.log(<span class=\"synConstant\">\"<\/span><span class=\"synSpecial\">\\n<\/span><span class=\"synConstant\">--- Tenant 2 Orders ---\"<\/span>);\n  <span class=\"synIdentifier\">const<\/span> noSessionOrders = <span class=\"synStatement\">await<\/span> withoutTenantSession(<span class=\"synStatement\">async<\/span> ()<span class=\"synPreProc\"> <\/span><span class=\"synType\">=&gt;<\/span> <span class=\"synIdentifier\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db.select().from(orders);\n  <span class=\"synIdentifier\">}<\/span>);\n  <span class=\"synType\">console<\/span>.log(noSessionOrders);\n  \n  <span class=\"synType\">process<\/span>.exit(<span class=\"synConstant\">0<\/span>);\n<span class=\"synIdentifier\">}<\/span>\n<\/pre>\n<p><code>pnpm run dev:set-local<\/code>\u3067\u5b9f\u884c\u53ef\u80fd\u306a\u306e\u3067\u3001\u5b9f\u65bd\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">--- Tenant 1 Orders ---\n[\n  { id: 1, tenantId: 1, productName: 'Product A', amount: 100 },\n  { id: 2, tenantId: 1, productName: 'Product B', amount: 200 },\n  { id: 3, tenantId: 1, productName: 'Product C', amount: 150 }\n]\n\n--- Tenant 2 Orders ---\nError: DrizzleQueryError: Failed query: select \"id\", \"tenant_id\", \"product_name\", \"amount\" from \"orders\"\nparams:\n  ...\n  query: 'select \"id\", \"tenant_id\", \"product_name\", \"amount\" from \"orders\"',\n  params: [],\n  cause: PostgresError: invalid input syntax for type integer: \"\"<\/pre>\n<p>\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u306d\u3002<\/p>\n<p>\u30dd\u30ea\u30b7\u30fc\u306b\u6307\u5b9a\u3057\u305f<code>USING (tenant_id = current_setting('app.current_tenant', true)::INTEGER);<\/code>\u306e\u8a55\u4fa1\u6642\u3001<code>app.current_tenant<\/code>\u306e\u5024\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u7a7a\u6587\u5b57\u304b\u3089\u6570\u5024\u3078\u306e\u5909\u63db\u304c\u767a\u751f\u3059\u308b\u3053\u3068\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30a8\u30e9\u30fc\u306f\u767a\u751f\u3059\u308b\u3082\u306e\u306e\u3001\u4ed6\u306e\u30c6\u30ca\u30f3\u30c8\u306e\u30c7\u30fc\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u4e8b\u8c61\u3092\u56de\u907f\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u96e3\u70b9\u3068\u3057\u3066\u306f\u660e\u793a\u7684\u306a\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u304c\u5fc5\u8981\u306a\u3053\u3068\u3067\u3059\u3002<\/p>\n<h3 id=\"\u660e\u793a\u7684\u306b-Where-\u53e5\u3092\u6307\u5b9a\u3059\u308b\">\u660e\u793a\u7684\u306b Where \u53e5\u3092\u6307\u5b9a\u3059\u308b<\/h3>\n<p>\u6b21\u306b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5074\u3067\u660e\u793a\u7684\u306b Where \u53e5\u3092\u6307\u5b9a\u3059\u308b\u65b9\u91dd\u3067\u3059\u3002<\/p>\n<p>RLS \u306e\u4ed5\u7d44\u307f\u306f\u3042\u304f\u307e\u3067\u6700\u7d42\u9632\u58c1\u3068\u3044\u3063\u305f\u8003\u3048\u65b9\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5074\u3067\u3082\u660e\u793a\u7684\u306b\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u3092\u3059\u308b\u30a2\u30d7\u30ed\u30fc\u30c1\u3067\u3059\u3002<\/p>\n<pre class=\"code lang-javascript\" data-lang=\"javascript\" data-unlink=\"\">\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withTenantSession<\/span><t class=\"synStatement\">&gt;<span class=\"synSpecial\">(<\/span>\n  tenantId: number<span class=\"synStatement\">,<\/span>\n  operation: <span class=\"synSpecial\">()<\/span> <span class=\"synStatement\">=&gt;<\/span> <span class=\"synType\">Promise<\/span><span class=\"synStatement\">T<span class=\"synStatement\">&gt;<\/span>\n<span class=\"synSpecial\">)<\/span>: <span class=\"synType\">Promise<\/span><span class=\"synStatement\">T<span class=\"synStatement\">&gt;<\/span> <span class=\"synSpecial\">{<\/span>\n  await db<span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">execute<\/span><span class=\"synSpecial\">(<\/span>sql<span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">raw<\/span><span class=\"synSpecial\">(<\/span><span class=\"synConstant\">`SET app.current_tenant=\"<\/span><span class=\"synSpecial\">${<\/span>tenantId<span class=\"synSpecial\">}<\/span><span class=\"synConstant\">\"`<\/span><span class=\"synSpecial\">))<\/span>;\n  return await <span class=\"synIdentifier\">operation<\/span><span class=\"synSpecial\">()<\/span>;\n<span class=\"synSpecial\">}<\/span>\n  \n\n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">withoutTenantSession<\/span><t class=\"synStatement\">&gt;<\/t><\/span><span class=\"synSpecial\">(<\/span>\n  operation: <span class=\"synSpecial\">()<\/span> <span class=\"synStatement\">=&gt;<\/span> <span class=\"synType\">Promise<\/span><span class=\"synStatement\">T<span class=\"synStatement\">&gt;<\/span>\n<span class=\"synSpecial\">)<\/span>: <span class=\"synType\">Promise<\/span><span class=\"synStatement\">T<span class=\"synStatement\">&gt;<\/span> <span class=\"synSpecial\">{<\/span>\n  return await <span class=\"synIdentifier\">operation<\/span><span class=\"synSpecial\">()<\/span>;\n<span class=\"synSpecial\">}<\/span>\n  \n<span class=\"synStatement\">async<\/span> <span class=\"synStatement\">function<\/span> <span class=\"synIdentifier\">main<\/span><span class=\"synSpecial\">()<\/span> <span class=\"synSpecial\">{<\/span>\n  \n  <span class=\"synConstant\">console<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">log<\/span><span class=\"synSpecial\">(<\/span><span class=\"synConstant\">\"\\n--- Tenant 1 Orders ---\"<\/span><span class=\"synSpecial\">)<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synType\">const<\/span> tenant1Orders <span class=\"synStatement\">=<\/span> <span class=\"synStatement\">await<\/span> <span class=\"synIdentifier\">withTenantSession<\/span><span class=\"synSpecial\">(<\/span><span class=\"synConstant\">1<\/span><span class=\"synStatement\">,<\/span> <span class=\"synStatement\">async<\/span> <span class=\"synSpecial\">()<\/span> <span class=\"synStatement\">=&gt;<\/span> <span class=\"synSpecial\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db<span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">select<\/span><span class=\"synSpecial\">()<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">from<\/span><span class=\"synSpecial\">(<\/span>orders<span class=\"synSpecial\">)<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">where<\/span><span class=\"synSpecial\">(<\/span><span class=\"synIdentifier\">eq<\/span><span class=\"synSpecial\">(<\/span>orders<span class=\"synStatement\">.<\/span>tenantId<span class=\"synStatement\">,<\/span> <span class=\"synConstant\">1<\/span><span class=\"synSpecial\">))<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synSpecial\">})<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synConstant\">console<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">log<\/span><span class=\"synSpecial\">(<\/span>tenant1Orders<span class=\"synSpecial\">)<\/span><span class=\"synStatement\">;<\/span>\n  \n  \n  <span class=\"synConstant\">console<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">log<\/span><span class=\"synSpecial\">(<\/span><span class=\"synConstant\">\"\\n--- Tenant 2 Orders ---\"<\/span><span class=\"synSpecial\">)<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synType\">const<\/span> tenant2Orders <span class=\"synStatement\">=<\/span> <span class=\"synStatement\">await<\/span> <span class=\"synIdentifier\">withoutTenantSession<\/span><span class=\"synSpecial\">(<\/span><span class=\"synStatement\">async<\/span> <span class=\"synSpecial\">()<\/span> <span class=\"synStatement\">=&gt;<\/span> <span class=\"synSpecial\">{<\/span>\n    <span class=\"synStatement\">return<\/span> <span class=\"synStatement\">await<\/span> db<span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">select<\/span><span class=\"synSpecial\">()<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">from<\/span><span class=\"synSpecial\">(<\/span>orders<span class=\"synSpecial\">)<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">where<\/span><span class=\"synSpecial\">(<\/span><span class=\"synIdentifier\">eq<\/span><span class=\"synSpecial\">(<\/span>orders<span class=\"synStatement\">.<\/span>tenantId<span class=\"synStatement\">,<\/span> <span class=\"synConstant\">2<\/span><span class=\"synSpecial\">))<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synSpecial\">})<\/span><span class=\"synStatement\">;<\/span>\n  <span class=\"synConstant\">console<\/span><span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">log<\/span><span class=\"synSpecial\">(<\/span>tenant2Orders<span class=\"synSpecial\">)<\/span><span class=\"synStatement\">;<\/span>\n  \n  process<span class=\"synStatement\">.<\/span><span class=\"synIdentifier\">exit<\/span><span class=\"synSpecial\">(<\/span><span class=\"synConstant\">0<\/span><span class=\"synSpecial\">)<\/span><span class=\"synStatement\">;<\/span>\n<span class=\"synSpecial\">}<\/span>\n<\/span><\/span><\/span><\/t><\/pre>\n<p><code>pnpm run dev:with-where<\/code>\u3067\u5b9f\u884c\u53ef\u80fd\u306a\u306e\u3067\u3001\u5b9f\u65bd\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"code\" data-lang=\"\" data-unlink=\"\">--- Tenant 1 Orders ---\n[\n  { id: 1, tenantId: 1, productName: 'Product A', amount: 100 },\n  { id: 2, tenantId: 1, productName: 'Product B', amount: 200 },\n  { id: 3, tenantId: 1, productName: 'Product C', amount: 150 }\n]\n\n--- Tenant 2 Orders ---\n[]<\/pre>\n<p>\u3053\u3061\u3089\u306f\u30a8\u30e9\u30fc\u306f\u51fa\u307e\u305b\u3093\u304c\u53d6\u5f97\u4ef6\u6570\u304c\uff10\u4ef6\u3068\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>\u5225\u30c6\u30ca\u30f3\u30c8\u306e\u30c7\u30fc\u30bf\u304c\u95b2\u89a7\u72b6\u614b\u306b\u3042\u308b\u3082\u306e\u306e\u3001Where \u53e5\u3067\u9664\u5916\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3067\u3059\u3002<\/p>\n<h2 id=\"\u307e\u3068\u3081\">\u307e\u3068\u3081<\/h2>\n<p>RLS \u306e\u5185\u5bb9\u3001\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30ea\u30f3\u30b0\u4f75\u7528\u6642\u306e\u6ce8\u610f\u70b9\u7b49\u3092\u307e\u3068\u3081\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u57fa\u672c\u7684\u306b\u306fRLS\u304c\u3042\u308c\u3070\u554f\u984c\u306a\u3044\u3001\u3068\u3044\u3046\u3088\u308a\u306f\u5404\u30ec\u30a4\u30e4\u30fc\u3067\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u3092\u3059\u308b\u3001\u591a\u5c64\u9632\u58c1\u304c\u826f\u3055\u305d\u3046\u3067\u3059\u3002<\/p>\n<p>\u30d7\u30fc\u30eb\u578b\u306e\u30c6\u30ca\u30f3\u30c8\u5206\u96e2\u6226\u7565\u306f\u69d8\u3005\u306a\u65b9\u6cd5\u304c\u3042\u308b\u306e\u3067\u3001\u691c\u8a0e\u3057\u3066\u307f\u305f\u3044\u3067\u3059\u306d\uff01<\/p>\n<p>\u8ab0\u304b\u306e\u304a\u5f79\u306b\u7acb\u3066\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<div class=\"profile-cards-list\">\n<div class=\"profile-card-container\">\n<div class=\"sw-profile\">\n<div class=\"sw-profile__txt-wrap\">\n<p class=\"sw-profile__name\">\u68ee\u5c71 \u667a\u53f2 <a target=\"_blank\" href=\"https:\/\/serverworks-blog.hatenablog.com\/archive\/author\/swx-satoshi-moriyama\">(\u8a18\u4e8b\u4e00\u89a7)<\/a><\/p>\n<p class=\"sw-profile__txt\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u672c\u90e8\u30c7\u30a3\u30d9\u30ed\u30c3\u30d7\u30e1\u30f3\u30c8\u30b5\u30fc\u30d3\u30b91\u8ab2<\/p>\n<p class=\"sw-profile__txt\">2025\u5e7410\u6708\u4e2d\u9014\u5165\u793e\u3002<\/p>\n<\/p><\/div>\n<\/div><\/div>\n<\/p><\/div>\n<\/div>\n<p><script>(function(d, s, id) {\n  var js, fjs = d.getElementsByTagName(s)[0];\n  if (d.getElementById(id)) return;\n  js = d.createElement(s); js.id = id;\n  js.src = \"\/\/connect.facebook.net\/ja_JP\/sdk.js#xfbml=1&version=v17.0\";\n  fjs.parentNode.insertBefore(js, fjs);\n}(document, 'script', 'facebook-jssdk'));<\/script><br \/>\n<br \/>\n<br \/><a href=\"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\u306f\u3058\u3081\u306b \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u672c\u90e8\u30c7\u30a3\u30d9\u30ed\u30c3\u30d7\u30e1\u30f3\u30c8\u30b5\u30fc\u30d3\u30b9\uff11\u8ab2\u306e\u68ee\u5c71\u3067\u3059\u3002 \u4eca\u56de\u306f\u3001RDS \u306b\u304a\u3051\u308b RLS (Row Level Security) \u306b\u3064\u3044\u3066\u8a18\u4e8b\u306b\u3057\u3066\u307f\u307e\u3059\u3002 \u524d\u8077\u304b\u3089\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 SaaS  [&hellip;]","protected":false},"author":1,"featured_media":23712,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-23711","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-company-tec"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"\u306f\u3058\u3081\u306b \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u672c\u90e8\u30c7\u30a3\u30d9\u30ed\u30c3\u30d7\u30e1\u30f3\u30c8\u30b5\u30fc\u30d3\u30b9\uff11\u8ab2\u306e\u68ee\u5c71\u3067\u3059\u3002 \u4eca\u56de\u306f\u3001RDS \u306b\u304a\u3051\u308b RLS (Row Level Security) \u306b\u3064\u3044\u3066\u8a18\u4e8b\u306b\u3057\u3066\u307f\u307e\u3059\u3002 \u524d\u8077\u304b\u3089\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 SaaS [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-14T23:44:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/23711\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security\",\"datePublished\":\"2025-11-14T23:44:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/23711\\\/\"},\"wordCount\":158,\"image\":{\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png\",\"articleSection\":[\"\u4f01\u696d\u30c6\u30c3\u30af\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/23711\\\/\",\"url\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle\",\"name\":\"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png\",\"datePublished\":\"2025-11-14T23:44:24+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png\",\"width\":1300,\"height\":683},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.serverworks.co.jp\\\/rds_rls_drizzle#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle","og_locale":"ja_JP","og_type":"article","og_title":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3","og_description":"\u306f\u3058\u3081\u306b \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u672c\u90e8\u30c7\u30a3\u30d9\u30ed\u30c3\u30d7\u30e1\u30f3\u30c8\u30b5\u30fc\u30d3\u30b9\uff11\u8ab2\u306e\u68ee\u5c71\u3067\u3059\u3002 \u4eca\u56de\u306f\u3001RDS \u306b\u304a\u3051\u308b RLS (Row Level Security) \u306b\u3064\u3044\u3066\u8a18\u4e8b\u306b\u3057\u3066\u307f\u307e\u3059\u3002 \u524d\u8077\u304b\u3089\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 SaaS [&hellip;]","og_url":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-11-14T23:44:24+00:00","og_image":[{"width":1300,"height":683,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"4\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/23711\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security","datePublished":"2025-11-14T23:44:24+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/23711\/"},"wordCount":158,"image":{"@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png","articleSection":["\u4f01\u696d\u30c6\u30c3\u30af"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/23711\/","url":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle","name":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#primaryimage"},"image":{"@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png","datePublished":"2025-11-14T23:44:24+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/https3A2F2Fcdn-ak.f.st-hatena.com2Fimages2Ffotolife2Fs2Fswx-satoshi-moriyama2F202511152F202.png","width":1300,"height":683},{"@type":"BreadcrumbList","@id":"https:\/\/blog.serverworks.co.jp\/rds_rls_drizzle#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"Drizzle ORM \u3067\u691c\u8a3c\u3059\u308b Row Level Security"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/23711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=23711"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/23711\/revisions"}],"predecessor-version":[{"id":23713,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/23711\/revisions\/23713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/23712"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=23711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=23711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=23711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}