You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Supabase中TCE加密列插入时报"query returned no rows"的解决方法

问题分析与解决

1. 安全标签表名不匹配(最核心问题)

你给加密列设置安全标签时,写的表名是user_databases,但实际表名是user_databases_tce,这会导致pgsodium找不到正确的列加密配置,触发器执行时直接报错。

修正安全标签的SQL:

SECURITY LABEL FOR pgsodium
    ON COLUMN user_databases_tce.database_string
    IS 'ENCRYPT WITH KEY COLUMN uuid';

2. 触发器函数建议用官方工具生成

你手动创建的触发器和函数可能存在逻辑问题,Supabase的TCE推荐用官方提供的pgsodium.create_column_encrypt_trigger自动生成,避免手动编写出错:

-- 先删除现有手动创建的触发器和函数
DROP TRIGGER IF EXISTS user_databases_tce_encrypt_secret_trigger_database_string ON user_databases_tce;
DROP FUNCTION IF EXISTS user_databases_tce_encrypt_secret_database_string;

-- 自动生成加密触发器
SELECT pgsodium.create_column_encrypt_trigger('user_databases_tce', 'database_string');

3. 验证外键关联的UUID存在性

插入数据时,uuid字段必须在user_schemas表中有对应记录,否则外键约束会触发异常。可以先执行查询确认:

SELECT uuid FROM user_schemas WHERE uuid = '你要插入的UUID值';

如果返回空行,得先在user_schemas中创建对应记录再插入。

4. 检查用户权限

确保执行插入操作的角色(包括Supabase客户端用的anon/authenticated)有以下权限:

  • user_databases_tce表的INSERT权限
  • pgsodium扩展的使用权限
  • user_schemas表的SELECT权限(外键检查需要读取该表)

执行以下语句赋予权限:

GRANT INSERT ON user_databases_tce TO authenticated, anon;
GRANT SELECT ON user_schemas TO authenticated, anon;

测试插入

修正后先通过SQL直接测试,排除客户端问题:

INSERT INTO user_databases_tce (database_string, uuid) VALUES ('测试加密内容', '已存在的UUID值');

如果这条SQL执行成功,说明问题出在客户端配置;如果还是报错,再排查触发器和安全标签的配置。

内容的提问来源于stack exchange,提问作者sumato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:25:11