From 28814bdc6e59a3e0f0e65c425efc14c9e61deeac Mon Sep 17 00:00:00 2001 From: "DATAEXPRESS\\4734" Date: Tue, 10 Mar 2026 11:01:58 +0800 Subject: [PATCH] fix error(old AI gen version error) --- permission/zen_sync_base_security.txt | 128 +++++++++++++------------- 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/permission/zen_sync_base_security.txt b/permission/zen_sync_base_security.txt index c87aba3..a80747f 100644 --- a/permission/zen_sync_base_security.txt +++ b/permission/zen_sync_base_security.txt @@ -1,81 +1,85 @@ DELIMITER // -CREATE PROCEDURE zen_sync_base_security( - IN p_token VARCHAR(100), - IN p_functiontag VARCHAR(100) +CREATE OR REPLACE PROCEDURE zen_sync_base_security ( + IN p_token VARCHAR(100), + IN p_functiontag VARCHAR(100) ) /* Function : 在單一資料庫的架構下, 在 Wizard 產生程式後, 直接同步 menu 及基本權限設定 Description: 目的是產生程式後, 就可以直接在測試環境執行 - Build Date : 2023-12-10 + Build Date : 2023/08/04 Modify History Item Who Date Modify Docs ==== ========== ========== ================================================ - 1 Michael 2023-12-10 改寫為 MySQL 版 - + 1 Michael 2026-03-10 Init 重新用 Gemini 改寫(舊版有誤) + */ BEGIN - DECLARE parenttag VARCHAR(100); - DECLARE cnt INT; - DECLARE user_id VARCHAR(100); - DECLARE err_code SMALLINT; - DECLARE err_msg NVARCHAR(100); + -- 變數宣告必須放在最前面 + DECLARE v_parenttag VARCHAR(100); + DECLARE v_cnt INT; + DECLARE v_userid VARCHAR(100); + DECLARE v_err_code SMALLINT DEFAULT 0; + DECLARE v_err_msg NVARCHAR(100) DEFAULT '選單及權限設定成功 !!'; - SET err_code = 0; - SET err_msg = '選單及權限設定成功 !!'; + -- Step 1: 驗證使用者身份 [cite: 2] + SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1; - 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; + IF IFNULL(v_userid, '') = '' THEN + SET v_err_code = 4; + SET v_err_msg = '原密碼輸入錯誤, 請重新輸入'; ELSE - SET err_code = 9; - SET err_msg = '必須是單一資料庫架構才能執行 !!'; + -- Step 2: 根據 zen_function 寫入 menu [cite: 3] + -- 獲取父節點標籤 + SELECT IFNULL(parenttag, '') INTO v_parenttag + FROM zen_function + WHERE functiontag = p_functiontag LIMIT 1; + + IF IFNULL(v_parenttag, '') = '' THEN + SET v_parenttag = ''; + END IF; + + -- 如果 parent_menuid 不存在,則自動產生 [cite: 4, 5] + SELECT COUNT(*) INTO v_cnt + FROM sys_menutable + WHERE menuid = v_parenttag AND v_parenttag <> ''; + + IF v_cnt = 0 AND v_parenttag <> '' THEN + INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned) + SELECT parenttag, '', CONCAT(functionname, '(目錄)'), projectid, functiontag, '00' + FROM zen_function + WHERE functiontag = p_functiontag; + + INSERT INTO sys_rolemenusecurity (roleid, menuid, controlname) + VALUES ('00', p_functiontag, 'read'); + END IF; + + -- 檢查並插入目前的 functiontag 選單 [cite: 7, 8] + SELECT COUNT(*) INTO v_cnt FROM sys_menutable WHERE menuid = p_functiontag; + + IF v_cnt = 0 THEN + INSERT INTO sys_menutable (menuid, parent_menuid, caption, moduleid, seq_no, owned) + SELECT functiontag, v_parenttag, functionname, projectid, functiontag, '00' + FROM zen_function + WHERE functiontag = p_functiontag; + END IF; + + -- Step 3: 根據 zen_fields 寫入基本權限 (read, insert, update, delete) [cite: 9, 10] + SELECT COUNT(*) INTO v_cnt FROM sys_rolemenusecurity WHERE menuid = p_functiontag; + + IF v_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; END IF; - END IF; + + -- 回傳執行結果 [cite: 11] + SELECT v_err_code AS code, v_err_msg AS msg; - SELECT err_code AS code, err_msg AS msg; - END // -DELIMITER ; +DELIMITER ; \ No newline at end of file