DELIMITER // CREATE PROCEDURE zen_sync_base_security( IN p_token VARCHAR(100), IN p_functiontag VARCHAR(100) ) /* Function : 在單一資料庫的架構下, 在 Wizard 產生程式後, 直接同步 menu 及基本權限設定 Description: 目的是產生程式後, 就可以直接在測試環境執行 Build Date : 2023-12-10 Modify History Item Who Date Modify Docs ==== ========== ========== ================================================ 1 Michael 2023-12-10 改寫為 MySQL 版 */ BEGIN DECLARE parenttag VARCHAR(100); DECLARE cnt INT; DECLARE user_id VARCHAR(100); DECLARE err_code SMALLINT; DECLARE err_msg NVARCHAR(100); SET err_code = 0; SET err_msg = '選單及權限設定成功 !!'; SELECT userid INTO user_id FROM sys_users WHERE token = p_token; IF COALESCE(user_id, '') = '' THEN SET err_code = 4; SET err_msg = '原密碼輸入錯誤, 請重新輸入'; ELSE -- step 1: 先判斷是否是單一 db 架構 -- if EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'sys_menutable') IF 1 = 1 THEN -- 利用同義字(Synonym) 解決括資料庫問題 20230823 Michael -- step 2: 根據 zen_function 寫入 menu -- 如果 parent_menuid 不存在, 要一併自動產生 SELECT parenttag INTO parenttag FROM zen_function WHERE functiontag = p_functiontag; IF COALESCE(parenttag, '') = '' THEN SET parenttag = ''; END IF; SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = parenttag AND parenttag <> ''; IF cnt = 0 THEN INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned) SELECT parenttag, '', functionname + '(目錄)', projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag; INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname) SELECT '00', p_functiontag, 'read'; END IF; SELECT COUNT(*) INTO cnt FROM sys_menutable WHERE menuid = p_functiontag; IF cnt = 0 THEN INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned) SELECT functiontag, parenttag, functionname, projectid, functiontag, '00' FROM zen_function WHERE functiontag = p_functiontag; END IF; -- step 3: 根據 zen_fields 寫入 security SELECT COUNT(*) INTO cnt FROM sys_rolemenusecurity WHERE menuid = p_functiontag; IF cnt = 0 THEN INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname) SELECT '00', p_functiontag, 'read' UNION SELECT '00', p_functiontag, 'insert' UNION SELECT '00', p_functiontag, 'update' UNION SELECT '00', p_functiontag, 'delete'; END IF; ELSE SET err_code = 9; SET err_msg = '必須是單一資料庫架構才能執行 !!'; END IF; END IF; SELECT err_code AS code, err_msg AS msg; END // DELIMITER ;