Передача списка в хранимую процедуру MySQL и проверка присутствия ВСЕХ значений

У меня есть запрос, где я проверяю, что пользователь имеет ВСЕ разрешения, представленные в списке разрешений.

Итак, это что-то вроде этого ...

SELECT DISTINCT account_id
FROM   pp_acl_user_roles ur, pp_acl_role_permissions rp
JOIN pp_acl_permissions p ON rp.permission_id=p.id
WHERE (
  ur.account_id = '1'
  #check for permission ids OR keys depending on what has been passed in.
  AND ( p.id IN ('read_accounts', 'write_accounts') OR p.key IN ('read_accounts', 'write_accounts') )
  AND ur.role_id = rp.role_id
)
#ensure we have ALL the permissions we asked for, not just some -makes IN() an AND not an OR.
GROUP BY ur.account_id
HAVING COUNT(DISTINCT rp.permission_id) = 2

Он проверяет либо списокidс или списокkeys для разрешений, так что он может быть вызван с любым, так что эта строка.

p.id IN ('read_accounts', 'write_accounts') OR p.key IN ('read_accounts', 'write_accounts')

может быть

p.id IN (1, 2) OR p.key IN (1, 2)

в зависимости от того, как это называется.

HAVING в конце обеспечивает соответствиевсе предметы, которые мы просили.

Это нормально, но я хочу переместить его в хранимую процедуру, и у меня возникла проблема.

Я должен был изменитьIN заFIND_IN_SET так что я мог бы передать список строк в процедуру, но проблема в том, что у меня нет способа динамически рассчитать, какмного элементы находятся в списке, поэтому я не могу проверить, все ли они присутствуют.

Я дошел до этого ...

CREATE PROCEDURE has_permission( IN account_id BIGINT, IN permissions TEXT )
BEGIN
  SELECT DISTINCT account_id
  FROM   pp_acl_user_roles ur, pp_acl_role_permissions rp
  JOIN pp_acl_permissions p ON rp.permission_id=p.id
  WHERE (
    ur.account_id = account_id
    #check for permission ids OR keys depending on what has been passed in.
    AND ( FIND_IN_SET(p.id, permissions) OR FIND_IN_SET(p.key, permissions) )
    AND ur.role_id = rp.role_id
  )
  #ensure we have ALL the permissions we asked for, not just some -makes IN() an AND not an OR.
  GROUP BY ur.account_id;
  HAVING COUNT(DISTINCT rp.permission_id) = ????????????
END //                      
DELIMITER ; 

Но нет способа рассчитать длину разрешений, переданных в.

Я уверен, что есть способ присоединиться к таблице perms на основе элементов в строке и убедиться, что в обеих таблицах есть совпадения, но я не могу решить это.

Любые указатели высоко ценится ...

Ответы на вопрос(1)

Ваш ответ на вопрос