使用者 |
---|
ID |
名称 |
团体 |
---|
ID |
名称 |
users_in_groups |
---|
用户身份 |
group_id |
我正在postgres中编写一个存储过程,该存储过程接收一个组名和users数组并将用户添加到该组中,我想首先断言该用户存在于其中users
-因为我想引发一个自定义错误,以便我可以捕获它服务器(如果我依赖于-等默认错误FK violation
,则无法在服务器中对其进行足够明确的分类)。
CREATE FUNCTION add_users_to_group(group_name text, users text[])
RETURNS VOID AS $$
DECLARE
does_all_users_exists boolean;
BEGIN
SELECT exist FROM (
WITH to_check (user_to_check) as (select unnest(users))
SELECT bool_and(EXISTS (
SELECT * FROM users where id = to_check.user_to_check
)) as exist from to_check) as existance INTO does_all_users_exists;
IF NOT does_all_users_exists THEN
RAISE EXCEPTION '%', does_all_users_exists USING ERRCODE = 'XXXXX';
-- TODO: loop through each user and insert into users_in_groups
END;
$$ LANGUAGE PLPGSQL VOLATILE STRICT SECURITY INVOKER;
当我对users
表中存在的用户执行该函数时,会抛出错误,并且消息为:(f
因此我的变量为false),但是当我仅运行查询时,该查询为我提供了所有用户的存在:
WITH to_check (user_to_check) as (select unnest(users))
SELECT bool_and(EXISTS (
SELECT * FROM users where id = to_check.user_to_check
)) as exist from to_check
我懂了true
。但我把它放在这样的表中:
# | 存在(布尔) |
---|---|
1个 | 真正 |
所以我想我需要以某种方式提取真实信息。
无论如何,我知道在插入之前验证存在是否有更好的解决方案,欢迎提出建议。
您的逻辑似乎不必要地复杂。您可以使用NOT EXISTS
以下命令检查是否不存在任何用户:
SELECT 1
FROM UNNEST(users) user_to_check
WHERE NOT EXISTS (SELECT 1 FROM users u WHERE u.id = user_to_check)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句