0

我最近创建了一个在更新前触发器上调用的函数。

函数如下所示:

CREATE FUNCTION public.update_meta()
  RETURNS trigger
  LANGUAGE 'plpgsql'
  SECURITY DEFINER
  AS $$
   BEGIN
     IF (new.metadata->'created_by') IS NULL THEN
       new.metadata := jsonb_set(new.metadata, '{created_by}', to_jsonb(auth.uid()::text));
     END IF;

     RETURN new;
   END;
  $$;

auth.uid()函数返回一个uuid. 它看起来像这样:

CREATE FUNCTION auth.uid()
   RETURNS uuid
   LANGUAGE 'sql'
   STABLE PARALLEL UNSAFE
AS $$
 select
 nullif(
   coalesce(
     current_setting('request.jwt.claim.sub', true),
     (current_setting('request.jwt.claims', true)::jsonb ->> 'sub')
   ),
   ''
 )::uuid
$$;

我遇到的问题是以下行:

jsonb_set(new.metadata, '{created_by}', to_jsonb(auth.uid()::text));

由于某种原因,这jsonb_set总是返回null,我不知道为什么。

当尝试像这样对值进行硬编码时,它正在工作:

jsonb_set(new.metadata, '{created_by}', to_jsonb('SOME_RANDOM_VALUE'::text));

auth.uid() 总是返回 a uuid,所以这不是问题。我只是找不到为什么在 is 中使用函数时to_json不起作用..

更新

以下代码正在运行,所以我真的不知道该auth.uid()函数有什么问题

CREATE OR REPLACE function public.test()
returns uuid
LANGUAGE 'sql'
 AS $$
  select
   'fcb8284c-1bd4-4d50-b5df-09a091b01d8c'::uuid;
$$;

select jsonb_set('{"olivier": "olivier"}', '{created_by}', to_jsonb(public.test()::text));

Returning: "{""olivier"": ""olivier"", ""created_by"": ""fcb8284c-1bd4-4d50-b5df-09a091b01d8c""}"

谢谢

4

0 回答 0