#vthang

How to merge permissions with sql

Jan 19, 2021

Giả sư ta sử dụng bitwise operators để implement permissions nhưng số quyền lúc này đã > 64 (overflow) thì chúng ta cần tách các quyền thành các nhóm quyền. Và việc update permissions lúc này trở nên phức tạp hơn do không thể sử dụng 1 thành phần 64bit để lưu trữ nữa mà sẽ phải là int array. Để đảm bảo merge quyền được đúng thứ tự thì ta sẽ query như sau:

with test as (
    select 1 as id, array [1, 8] as new_permissions union
    select 1 as id, array [1, 2, 6] as new_permissions
)
select id, array_agg(elem order by odr) as permissions
from (
    select id, odr, bit_or(coalesce(elem, 0)) as elem
    from test
    cross join unnest(new_permissions) with ordinality as u(elem, odr)
    group by 1, 2
) s
group by 1
order by 1

output:

id | permissions
---|------------
1  | {1, 10, 6}