54 lines
1.0 KiB
SQL
54 lines
1.0 KiB
SQL
DROP PROCEDURE IF EXISTS account.role_sync;
|
|
|
|
DELIMITER $$
|
|
CREATE DEFINER=`root`@`%` 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 ;
|