-- V14__system_management 的达梦版(DM8):MySQL 原版 ../migration/V14__system_management.sql -- 的等价迁移。 -- 用途:达梦不在 Flyway 支持列表、内置迁移默认关闭(见 application.yml),本脚本 -- 供 DISQL / DM 管理工具手工执行或外部迁移工具引用;目录与 db/migration 平级, -- 不参与 Flyway 扫描(放 db/migration 子目录会与 MySQL 版冲突为重复 V14)。 -- 语义与 MySQL 版完全一致: -- 1. sys_role 加 manage_system / manage_audit_log BIT/TINYINT NOT NULL DEFAULT 0; -- 2. 新建 sys_metric_sample 资源采样表(BIGINT IDENTITY 主键 + sampled_at 索引); -- 3. 重建 sys_audit_log 两组 CHECK 白名单(动作 42 项 / 目标 12 项,含 SYSTEM)。 -- 幂等:列/表/约束均先探测后执行,重复运行无副作用;与 Python 版 Alembic 0029 -- 双引擎互冲安全(谁先跑,后者全部跳过或重建同集合)。 -- 语法说明:达梦无 MySQL 的 SET @var / IF() / PREPARE 动态 SQL,改用 DMSQL 匿名块 + -- EXECUTE IMMEDIATE;系统字典用 Oracle 兼容视图 USER_TAB_COLUMNS / USER_TABLES / -- USER_CONSTRAINTS(未加引号建表时名称大写存储)。 -- 1. sys_role 管理位加列(已存在则跳过) DECLARE v_count INT; BEGIN SELECT COUNT(*) INTO v_count FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'SYS_ROLE' AND COLUMN_NAME = 'MANAGE_SYSTEM'; IF v_count = 0 THEN EXECUTE IMMEDIATE 'ALTER TABLE SYS_ROLE ADD COLUMN MANAGE_SYSTEM TINYINT NOT NULL DEFAULT 0'; END IF; END; / DECLARE v_count INT; BEGIN SELECT COUNT(*) INTO v_count FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'SYS_ROLE' AND COLUMN_NAME = 'MANAGE_AUDIT_LOG'; IF v_count = 0 THEN EXECUTE IMMEDIATE 'ALTER TABLE SYS_ROLE ADD COLUMN MANAGE_AUDIT_LOG TINYINT NOT NULL DEFAULT 0'; END IF; END; / -- 2. 资源采样表(已存在则整段跳过,索引随表一并创建) DECLARE v_count INT; BEGIN SELECT COUNT(*) INTO v_count FROM USER_TABLES WHERE TABLE_NAME = 'SYS_METRIC_SAMPLE'; IF v_count = 0 THEN EXECUTE IMMEDIATE 'CREATE TABLE SYS_METRIC_SAMPLE ( ID BIGINT IDENTITY(1, 1) NOT NULL, SAMPLED_AT TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, CPU_PERCENT FLOAT DEFAULT NULL, MEM_USED_BYTES BIGINT NOT NULL, MEM_TOTAL_BYTES BIGINT NOT NULL, PRIMARY KEY (ID) )'; EXECUTE IMMEDIATE 'CREATE INDEX IX_SYS_METRIC_SAMPLE_TIME ON SYS_METRIC_SAMPLE (SAMPLED_AT)'; END IF; END; / -- 3. 删除旧 CHECK 约束(不存在则跳过;按达梦大写存储名探测与删除) DECLARE v_count INT; BEGIN SELECT COUNT(*) INTO v_count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'SYS_AUDIT_LOG' AND CONSTRAINT_NAME = 'CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE'; IF v_count > 0 THEN EXECUTE IMMEDIATE 'ALTER TABLE SYS_AUDIT_LOG DROP CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE'; END IF; END; / DECLARE v_count INT; BEGIN SELECT COUNT(*) INTO v_count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'SYS_AUDIT_LOG' AND CONSTRAINT_NAME = 'CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE'; IF v_count > 0 THEN EXECUTE IMMEDIATE 'ALTER TABLE SYS_AUDIT_LOG DROP CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE'; END IF; END; / -- 4. 重建 CHECK 白名单(不带引号,达梦自动大写,与探测名一致;42 项动作 / 12 项目标) ALTER TABLE SYS_AUDIT_LOG ADD CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE CHECK (ACTION_TYPE IN ( 'LOGIN', 'LOGOUT', 'VIEW_DOCUMENT', 'DOWNLOAD_DOCUMENT', 'UPLOAD_DOCUMENT', 'BATCH_IMPORT', 'EDIT_DOCUMENT', 'DELETE_DOCUMENT', 'CREATE_CATEGORY', 'EDIT_CATEGORY', 'DELETE_CATEGORY', 'CHANGE_PERMISSION', 'BIND_ATTACHMENT', 'UNBIND_ATTACHMENT', 'RESTORE_DOCUMENT', 'CREATE_ORGANIZATION', 'EDIT_ORGANIZATION', 'DELETE_ORGANIZATION', 'CREATE_USER', 'EDIT_USER', 'DELETE_USER', 'RESET_USER_PASSWORD', 'REORDER_DOCUMENT', 'REORDER_ATTACHMENT', 'REORDER_CATEGORY', 'CREATE_ROLE', 'EDIT_ROLE', 'DELETE_ROLE', 'CHANGE_ROLE_PERMISSION', 'CHANGE_ROLE_USER', 'DOCUMENT_PASSWORD_SET', 'DOCUMENT_PASSWORD_REMOVE', 'CREATE_IP_ENTRY', 'EDIT_IP_ENTRY', 'DELETE_IP_ENTRY', 'ASSIGN_ORG_IP', 'MOVE_DOCUMENT', 'MOVE_ATTACHMENT', 'BACKUP_CREATE', 'PREVIEW_CACHE_CLEAR', 'FORCE_OFFLINE', 'BACKUP_TEST_TARGET')); ALTER TABLE SYS_AUDIT_LOG ADD CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE CHECK (TARGET_TYPE IS NULL OR TARGET_TYPE IN ( 'AUTH', 'CATEGORY', 'DOCUMENT', 'ATTACHMENT', 'PERMISSION', 'ATTACHMENT_BINDING', 'ORGANIZATION', 'USER', 'ROLE', 'IP_ENTRY', 'BACKUP', 'SYSTEM'));