我最近创建了一个在更新前触发器上调用的函数。
函数如下所示:
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""}"
谢谢