init_pgsql.sql 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. -- =============================================================================
  2. -- FranklinWH Toolbox - PostgreSQL 从零初始化脚本
  3. -- =============================================================================
  4. -- 作用:
  5. -- 1. 创建业务角色 fwh_toolbox
  6. -- 2. 创建业务数据库 fwh_toolbox_db(owner = fwh_toolbox)
  7. -- 3. 创建 schema:original / alarm_snapshot / public
  8. -- 4. 创建后端“显式管理”的两张表(alarm_snapshot.*)
  9. --
  10. -- 说明:
  11. -- * original schema 下的“站点原始数据表”由后端在运行时按需动态建表
  12. -- (表名为雪花ID的十六进制串,如 6901c3b1d05017860aaf87e3),
  13. -- 因此本脚本只创建 schema,不预建这些动态表。
  14. -- * alarm_snapshot 下两张表结构来自线上库 pg_dump,后端不做 AutoMigrate,
  15. -- 需要本脚本预先建好。
  16. --
  17. -- 使用方式(作为 postgres 超级用户执行):
  18. -- sudo -u postgres psql -v fwh_pwd=你的密码 -f init_pgsql.sql
  19. -- 密码直接传入、无需加引号(脚本内部用 %L 做安全转义)。
  20. -- 若不传 fwh_pwd,默认使用 fwh_toolbox(仅供本地开发,请勿用于生产)。
  21. -- =============================================================================
  22. \set ON_ERROR_STOP on
  23. -- 默认密码(可通过 -v fwh_pwd=xxx 覆盖,无需自行加引号)
  24. \if :{?fwh_pwd}
  25. \else
  26. \set fwh_pwd fwh_toolbox
  27. \endif
  28. -- ---------------------------------------------------------------------------
  29. -- 1. 角色
  30. -- 使用 format(... %L ...) 对密码做安全的字面量转义,支持含特殊字符的密码。
  31. -- ---------------------------------------------------------------------------
  32. SELECT format('CREATE ROLE fwh_toolbox LOGIN PASSWORD %L', :'fwh_pwd')
  33. WHERE NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fwh_toolbox')
  34. \gexec
  35. -- ---------------------------------------------------------------------------
  36. -- 2. 数据库(owner = fwh_toolbox)
  37. -- CREATE DATABASE 不能在事务块或 DO 块中执行,用 \gexec 条件创建
  38. -- ---------------------------------------------------------------------------
  39. SELECT 'CREATE DATABASE fwh_toolbox_db OWNER fwh_toolbox ENCODING ''UTF8'''
  40. WHERE NOT EXISTS (SELECT 1 FROM pg_database WHERE datname = 'fwh_toolbox_db')
  41. \gexec
  42. -- 切换到业务库继续初始化
  43. \connect fwh_toolbox_db
  44. -- ---------------------------------------------------------------------------
  45. -- 3. Schema
  46. -- ---------------------------------------------------------------------------
  47. CREATE SCHEMA IF NOT EXISTS original AUTHORIZATION fwh_toolbox;
  48. CREATE SCHEMA IF NOT EXISTS alarm_snapshot AUTHORIZATION fwh_toolbox;
  49. -- public schema 默认存在,owner 为 postgres,授予业务角色使用权
  50. GRANT USAGE, CREATE ON SCHEMA public TO fwh_toolbox;
  51. -- ---------------------------------------------------------------------------
  52. -- 4. alarm_snapshot 表(后端不做 AutoMigrate,需预建)
  53. -- ---------------------------------------------------------------------------
  54. -- 4.1 站点告警快照数据
  55. CREATE TABLE IF NOT EXISTS alarm_snapshot.site_alarm_snapshot_data (
  56. id bigint NOT NULL,
  57. sn character varying(32) NOT NULL,
  58. file_record_id bigint NOT NULL,
  59. log_time timestamp(0) without time zone NOT NULL,
  60. json_data jsonb NOT NULL,
  61. zone_info text
  62. );
  63. COMMENT ON TABLE alarm_snapshot.site_alarm_snapshot_data IS '站点告警快照数据';
  64. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_data.sn IS '站点SN';
  65. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_data.file_record_id IS '文件记录表的id';
  66. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_data.log_time IS '日志记录时间(UTC时间)';
  67. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_data.json_data IS 'json数据(二进制)';
  68. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_data.zone_info IS '时区信息';
  69. -- 自增身份列(幂等:仅在未定义 identity 时添加)
  70. DO $$
  71. BEGIN
  72. IF NOT EXISTS (
  73. SELECT 1 FROM pg_attribute
  74. WHERE attrelid = 'alarm_snapshot.site_alarm_snapshot_data'::regclass
  75. AND attname = 'id'
  76. AND attidentity <> ''
  77. ) THEN
  78. ALTER TABLE alarm_snapshot.site_alarm_snapshot_data
  79. ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
  80. SEQUENCE NAME alarm_snapshot.site_alarm_snapshot_data_id_seq
  81. START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1
  82. );
  83. END IF;
  84. END$$;
  85. -- 约束(幂等)
  86. DO $$
  87. BEGIN
  88. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'site_alarm_snapshot_data_id_pkey') THEN
  89. ALTER TABLE ONLY alarm_snapshot.site_alarm_snapshot_data
  90. ADD CONSTRAINT site_alarm_snapshot_data_id_pkey PRIMARY KEY (id);
  91. END IF;
  92. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'site_alarm_snapshot_data_sn_file_record_id_log_time_unique') THEN
  93. ALTER TABLE ONLY alarm_snapshot.site_alarm_snapshot_data
  94. ADD CONSTRAINT site_alarm_snapshot_data_sn_file_record_id_log_time_unique
  95. UNIQUE (sn, file_record_id, log_time);
  96. END IF;
  97. END$$;
  98. -- 4.2 站点告警快照文件处理记录
  99. CREATE TABLE IF NOT EXISTS alarm_snapshot.site_alarm_snapshot_file_record (
  100. id bigint NOT NULL,
  101. code_type integer,
  102. file_name text NOT NULL,
  103. file_url text NOT NULL,
  104. sn character varying(32) NOT NULL,
  105. log_time date NOT NULL,
  106. start_time timestamp(0) without time zone NOT NULL,
  107. end_time timestamp(0) without time zone NOT NULL,
  108. complete_time timestamp(0) without time zone NOT NULL,
  109. state smallint DEFAULT 0 NOT NULL
  110. );
  111. COMMENT ON TABLE alarm_snapshot.site_alarm_snapshot_file_record IS '站点告警快照的文件处理记录';
  112. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.sn IS 'site SN';
  113. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.log_time IS '日志记录日期(format YYYY-MM-DD)';
  114. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.start_time IS '记录开始时间(format YYYY-MM-DD HH:mm:SS)';
  115. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.end_time IS '记录结束时间(format YYYY-MM-DD HH:mm:SS)';
  116. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.complete_time IS '记录上传完成时间(format YYYY-MM-DD HH:mm:SS)';
  117. COMMENT ON COLUMN alarm_snapshot.site_alarm_snapshot_file_record.state IS '文件分析状态(0-分析中;1-完成;-1-失败)';
  118. DO $$
  119. BEGIN
  120. IF NOT EXISTS (
  121. SELECT 1 FROM pg_attribute
  122. WHERE attrelid = 'alarm_snapshot.site_alarm_snapshot_file_record'::regclass
  123. AND attname = 'id'
  124. AND attidentity <> ''
  125. ) THEN
  126. ALTER TABLE alarm_snapshot.site_alarm_snapshot_file_record
  127. ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
  128. SEQUENCE NAME alarm_snapshot.site_alarm_snapshot_file_record_id_seq
  129. START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1
  130. );
  131. END IF;
  132. END$$;
  133. DO $$
  134. BEGIN
  135. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'site_alarm_snapshot_file_record_id_pkey') THEN
  136. ALTER TABLE ONLY alarm_snapshot.site_alarm_snapshot_file_record
  137. ADD CONSTRAINT site_alarm_snapshot_file_record_id_pkey PRIMARY KEY (id);
  138. END IF;
  139. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'site_alarm_snapshot_file_record_file_url_unique') THEN
  140. ALTER TABLE ONLY alarm_snapshot.site_alarm_snapshot_file_record
  141. ADD CONSTRAINT site_alarm_snapshot_file_record_file_url_unique UNIQUE (file_url);
  142. END IF;
  143. END$$;
  144. -- ---------------------------------------------------------------------------
  145. -- 5. 归属与授权
  146. -- ---------------------------------------------------------------------------
  147. ALTER TABLE alarm_snapshot.site_alarm_snapshot_data OWNER TO fwh_toolbox;
  148. ALTER TABLE alarm_snapshot.site_alarm_snapshot_file_record OWNER TO fwh_toolbox;
  149. GRANT ALL ON ALL TABLES IN SCHEMA alarm_snapshot TO fwh_toolbox;
  150. GRANT ALL ON ALL SEQUENCES IN SCHEMA alarm_snapshot TO fwh_toolbox;
  151. GRANT ALL ON ALL TABLES IN SCHEMA original TO fwh_toolbox;
  152. GRANT ALL ON ALL SEQUENCES IN SCHEMA original TO fwh_toolbox;
  153. \echo '✅ PostgreSQL 初始化完成:数据库 fwh_toolbox_db / schema original,alarm_snapshot / alarm_snapshot 表已就绪'