52 lines
1.0 KiB
MySQL
52 lines
1.0 KiB
MySQL
|
DELIMITER $$
|
||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `account`.`role_sync`()
|
||
|
BEGIN
|
||
|
/**
|
||
|
* Synchronize the @roleRole table with the current role hierarchy. This
|
||
|
* procedure must be called every time the @roleInherit table is modified so
|
||
|
* that the changes made on it are effective.
|
||
|
*/
|
||
|
DECLARE vRoleId INT;
|
||
|
DECLARE vDone BOOL;
|
||
|
|
||
|
DECLARE cur CURSOR FOR
|
||
|
SELECT id FROM role;
|
||
|
|
||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||
|
|
||
|
DROP TEMPORARY TABLE IF EXISTS tRoleRole;
|
||
|
CREATE TEMPORARY TABLE tRoleRole
|
||
|
ENGINE = MEMORY
|
||
|
SELECT * FROM roleRole LIMIT 0;
|
||
|
|
||
|
OPEN cur;
|
||
|
|
||
|
l: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
FETCH cur INTO vRoleId;
|
||
|
|
||
|
IF vDone THEN
|
||
|
LEAVE l;
|
||
|
END IF;
|
||
|
|
||
|
CALL role_getDescendents(vRoleId);
|
||
|
|
||
|
INSERT INTO tRoleRole (role, inheritsFrom)
|
||
|
SELECT vRoleId, id FROM tmp.role;
|
||
|
|
||
|
DROP TEMPORARY TABLE tmp.role;
|
||
|
END LOOP;
|
||
|
|
||
|
CLOSE cur;
|
||
|
|
||
|
START TRANSACTION;
|
||
|
DELETE FROM roleRole;
|
||
|
INSERT INTO roleRole SELECT * FROM tRoleRole;
|
||
|
COMMIT;
|
||
|
|
||
|
DROP TEMPORARY TABLE tRoleRole;
|
||
|
|
||
|
CALL role_syncPrivileges;
|
||
|
END$$
|
||
|
DELIMITER ;
|