V14__system_management.sql 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. -- V14__system_management 的达梦版(DM8):MySQL 原版 ../migration/V14__system_management.sql
  2. -- 的等价迁移。
  3. -- 用途:达梦不在 Flyway 支持列表、内置迁移默认关闭(见 application.yml),本脚本
  4. -- 供 DISQL / DM 管理工具手工执行或外部迁移工具引用;目录与 db/migration 平级,
  5. -- 不参与 Flyway 扫描(放 db/migration 子目录会与 MySQL 版冲突为重复 V14)。
  6. -- 语义与 MySQL 版完全一致:
  7. -- 1. sys_role 加 manage_system / manage_audit_log BIT/TINYINT NOT NULL DEFAULT 0;
  8. -- 2. 新建 sys_metric_sample 资源采样表(BIGINT IDENTITY 主键 + sampled_at 索引);
  9. -- 3. 重建 sys_audit_log 两组 CHECK 白名单(动作 42 项 / 目标 12 项,含 SYSTEM)。
  10. -- 幂等:列/表/约束均先探测后执行,重复运行无副作用;与 Python 版 Alembic 0029
  11. -- 双引擎互冲安全(谁先跑,后者全部跳过或重建同集合)。
  12. -- 语法说明:达梦无 MySQL 的 SET @var / IF() / PREPARE 动态 SQL,改用 DMSQL 匿名块 +
  13. -- EXECUTE IMMEDIATE;系统字典用 Oracle 兼容视图 USER_TAB_COLUMNS / USER_TABLES /
  14. -- USER_CONSTRAINTS(未加引号建表时名称大写存储)。
  15. -- 1. sys_role 管理位加列(已存在则跳过)
  16. DECLARE
  17. v_count INT;
  18. BEGIN
  19. SELECT COUNT(*) INTO v_count
  20. FROM USER_TAB_COLUMNS
  21. WHERE TABLE_NAME = 'SYS_ROLE'
  22. AND COLUMN_NAME = 'MANAGE_SYSTEM';
  23. IF v_count = 0 THEN
  24. EXECUTE IMMEDIATE
  25. 'ALTER TABLE SYS_ROLE ADD COLUMN MANAGE_SYSTEM TINYINT NOT NULL DEFAULT 0';
  26. END IF;
  27. END;
  28. /
  29. DECLARE
  30. v_count INT;
  31. BEGIN
  32. SELECT COUNT(*) INTO v_count
  33. FROM USER_TAB_COLUMNS
  34. WHERE TABLE_NAME = 'SYS_ROLE'
  35. AND COLUMN_NAME = 'MANAGE_AUDIT_LOG';
  36. IF v_count = 0 THEN
  37. EXECUTE IMMEDIATE
  38. 'ALTER TABLE SYS_ROLE ADD COLUMN MANAGE_AUDIT_LOG TINYINT NOT NULL DEFAULT 0';
  39. END IF;
  40. END;
  41. /
  42. -- 2. 资源采样表(已存在则整段跳过,索引随表一并创建)
  43. DECLARE
  44. v_count INT;
  45. BEGIN
  46. SELECT COUNT(*) INTO v_count
  47. FROM USER_TABLES
  48. WHERE TABLE_NAME = 'SYS_METRIC_SAMPLE';
  49. IF v_count = 0 THEN
  50. EXECUTE IMMEDIATE 'CREATE TABLE SYS_METRIC_SAMPLE (
  51. ID BIGINT IDENTITY(1, 1) NOT NULL,
  52. SAMPLED_AT TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL,
  53. CPU_PERCENT FLOAT DEFAULT NULL,
  54. MEM_USED_BYTES BIGINT NOT NULL,
  55. MEM_TOTAL_BYTES BIGINT NOT NULL,
  56. PRIMARY KEY (ID)
  57. )';
  58. EXECUTE IMMEDIATE
  59. 'CREATE INDEX IX_SYS_METRIC_SAMPLE_TIME ON SYS_METRIC_SAMPLE (SAMPLED_AT)';
  60. END IF;
  61. END;
  62. /
  63. -- 3. 删除旧 CHECK 约束(不存在则跳过;按达梦大写存储名探测与删除)
  64. DECLARE
  65. v_count INT;
  66. BEGIN
  67. SELECT COUNT(*) INTO v_count
  68. FROM USER_CONSTRAINTS
  69. WHERE TABLE_NAME = 'SYS_AUDIT_LOG'
  70. AND CONSTRAINT_NAME = 'CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE';
  71. IF v_count > 0 THEN
  72. EXECUTE IMMEDIATE
  73. 'ALTER TABLE SYS_AUDIT_LOG DROP CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE';
  74. END IF;
  75. END;
  76. /
  77. DECLARE
  78. v_count INT;
  79. BEGIN
  80. SELECT COUNT(*) INTO v_count
  81. FROM USER_CONSTRAINTS
  82. WHERE TABLE_NAME = 'SYS_AUDIT_LOG'
  83. AND CONSTRAINT_NAME = 'CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE';
  84. IF v_count > 0 THEN
  85. EXECUTE IMMEDIATE
  86. 'ALTER TABLE SYS_AUDIT_LOG DROP CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE';
  87. END IF;
  88. END;
  89. /
  90. -- 4. 重建 CHECK 白名单(不带引号,达梦自动大写,与探测名一致;42 项动作 / 12 项目标)
  91. ALTER TABLE SYS_AUDIT_LOG ADD CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_ACTION_TYPE
  92. CHECK (ACTION_TYPE IN (
  93. 'LOGIN', 'LOGOUT', 'VIEW_DOCUMENT', 'DOWNLOAD_DOCUMENT',
  94. 'UPLOAD_DOCUMENT', 'BATCH_IMPORT', 'EDIT_DOCUMENT', 'DELETE_DOCUMENT',
  95. 'CREATE_CATEGORY', 'EDIT_CATEGORY', 'DELETE_CATEGORY', 'CHANGE_PERMISSION',
  96. 'BIND_ATTACHMENT', 'UNBIND_ATTACHMENT', 'RESTORE_DOCUMENT',
  97. 'CREATE_ORGANIZATION', 'EDIT_ORGANIZATION', 'DELETE_ORGANIZATION',
  98. 'CREATE_USER', 'EDIT_USER', 'DELETE_USER', 'RESET_USER_PASSWORD',
  99. 'REORDER_DOCUMENT', 'REORDER_ATTACHMENT', 'REORDER_CATEGORY',
  100. 'CREATE_ROLE', 'EDIT_ROLE', 'DELETE_ROLE', 'CHANGE_ROLE_PERMISSION',
  101. 'CHANGE_ROLE_USER', 'DOCUMENT_PASSWORD_SET', 'DOCUMENT_PASSWORD_REMOVE',
  102. 'CREATE_IP_ENTRY', 'EDIT_IP_ENTRY', 'DELETE_IP_ENTRY', 'ASSIGN_ORG_IP',
  103. 'MOVE_DOCUMENT', 'MOVE_ATTACHMENT', 'BACKUP_CREATE',
  104. 'PREVIEW_CACHE_CLEAR', 'FORCE_OFFLINE', 'BACKUP_TEST_TARGET'));
  105. ALTER TABLE SYS_AUDIT_LOG ADD CONSTRAINT CK_SYS_AUDIT_LOG_AUDIT_TARGET_TYPE
  106. CHECK (TARGET_TYPE IS NULL OR TARGET_TYPE IN (
  107. 'AUTH', 'CATEGORY', 'DOCUMENT', 'ATTACHMENT', 'PERMISSION',
  108. 'ATTACHMENT_BINDING', 'ORGANIZATION', 'USER', 'ROLE', 'IP_ENTRY',
  109. 'BACKUP', 'SYSTEM'));