【问题标题】:Supabase http_get triggered but failed on creating userSupabase http_get 触发但创建用户失败
【发布时间】:2022-06-15 00:33:47
【问题描述】:

如果有新记录插入到 supabase 的 auth users 表中,下面的触发函数会触发

declare
api_url text;

begin
SET search_path = extensions;

api_url := concat('https://cccccxzxxt?nme=',new.id);

SELECT * FROM http_get(api_url);

SET search_path = none;

return new;

end;

http_get 确实被触发了,但我在尝试创建新用户时收到 {"code":500,"msg":"Database error Saving new user","error_id":"xxx"} user 并且在 auth users 表中没有创建用户。

【问题讨论】:

    标签: postgresql supabase


    【解决方案1】:

    问题很可能是您在触发器结束时将search_path 设置为none。这意味着在您的触发器之后运行的任何 SQL 语句都将无法执行,除非它们仅使用完全限定名称(例如 auth.usersusers)。

    确实,当我重现您的触发器时,我在 PostgreSQL 日志中看到以下错误:

    {
       "query": "UPDATE \"users\" SET \"role\" = $1, \"updated_at\" = $2 WHERE users.id = $3",
       "event_message": relation "users" does not exist
    }
    

    这很可能是 Supabase 的 GoTrue 服务器在插入新用户后立即执行的更新(即在您的触发器之后)。请参阅:https://github.com/supabase/gotrue/blob/bfaa68ec2412abb44b76838dcfb817e68eb49aed/api/signup.go#L311)。

    要解决此问题,您应该:

    1. 避免完全操纵search_path,而是使用您正在调用的函数的完全限定名称,即extensions.http_get
    2. PostgreSQL 有特殊的语法用于仅在函数执行期间更改配置参数的值(例如 search_path)然后恢复,请参阅:https://www.postgresql.org/docs/current/sql-createfunction.htmlSET configuration_parameter { TO value | = value | FROM CURRENT }

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-04-22
      • 2017-05-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多