Eine Liste in die gespeicherte MySQL-Prozedur einfügen und prüfen, ob ALLE Werte vorhanden sind

Ich habe eine Abfrage, bei der ich überprüfe, ob der Benutzer ALLE Berechtigungen in einer Liste von Berechtigungen hat.

Also, es ist so etwas wie das ...

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

Es wird nach einer Liste von @ gesuchids oder eine Liste vonkeys für die Berechtigungen, also könnte es mit beiden aufgerufen werden, also diese Zeile.

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

könnte sei

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

abhängig davon, wie es heißt.

DasHAVING am Ende stellt sicher, dass wir @ abgestimall die Gegenstände, nach denen wir gefragt haben.

Das ist in Ordnung, aber ich möchte es auf eine gespeicherte Prozedur verschieben und stoße auf ein Problem.

Ich musste @ ändeIN zumFIND_IN_SET also könnte ich eine String-Liste in die Prozedur übergeben, aber das Problem ist, ich habe keine Möglichkeit, dynamisch zu berechnen, wieviel Elemente sind in der Liste enthalten, daher kann ich nicht überprüfen, ob sie alle vorhanden sind.

Ich habe das bis jetzt ...

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 ; 

Aber es gibt keine Möglichkeit, die Länge der übergebenen Berechtigungen zu berechnen.

Ich bin mir sicher, dass es eine Möglichkeit gibt, sich auf der Grundlage der Elemente in der Zeichenfolge der Tabelle perms anzuschließen und sicherzustellen, dass wir Übereinstimmungen in beiden Tabellen haben, aber ich kann es nicht herausfinden.

Alle Hinweise sehr geschätzt ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage