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
相关产品推荐
相关产品推荐

