90 lines
3.4 KiB
SQL
90 lines
3.4 KiB
SQL
-- 规则版本停用状态字段化迁移脚本
|
|
-- 将停用状态从审计表迁移到版本表中的状态字段
|
|
|
|
-- 1. 为 cfg_rule_version 表添加状态相关字段
|
|
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.cfg_rule_version') AND name = N'status')
|
|
BEGIN
|
|
ALTER TABLE dbo.cfg_rule_version ADD status INT NOT NULL DEFAULT 1; -- 1:Active, 0:Disabled
|
|
PRINT '已添加 status 字段到 cfg_rule_version 表';
|
|
END
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.cfg_rule_version') AND name = N'disabled_at_utc')
|
|
BEGIN
|
|
ALTER TABLE dbo.cfg_rule_version ADD disabled_at_utc DATETIME2 NULL;
|
|
PRINT '已添加 disabled_at_utc 字段到 cfg_rule_version 表';
|
|
END
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.cfg_rule_version') AND name = N'disabled_by')
|
|
BEGIN
|
|
ALTER TABLE dbo.cfg_rule_version ADD disabled_by NVARCHAR(64) NULL;
|
|
PRINT '已添加 disabled_by 字段到 cfg_rule_version 表';
|
|
END
|
|
|
|
-- 2. 迁移现有的停用状态数据
|
|
UPDATE v
|
|
SET v.status = 0,
|
|
v.disabled_at_utc = a.action_at_utc,
|
|
v.disabled_by = a.operator_name
|
|
FROM dbo.cfg_rule_version v
|
|
INNER JOIN (
|
|
-- 获取每个版本的最新停用记录
|
|
SELECT
|
|
product_type_code,
|
|
version_no,
|
|
action_at_utc,
|
|
operator_name,
|
|
ROW_NUMBER() OVER (PARTITION BY product_type_code, version_no ORDER BY action_at_utc DESC) as rn
|
|
FROM dbo.cfg_rule_version_audit
|
|
WHERE action_type = 'DISABLE'
|
|
) a ON v.product_type_code = a.product_type_code AND v.version_no = a.version_no AND a.rn = 1
|
|
WHERE EXISTS (
|
|
SELECT 1 FROM dbo.cfg_rule_version_audit a2
|
|
WHERE a2.product_type_code = v.product_type_code
|
|
AND a2.version_no = v.version_no
|
|
AND a2.action_type = 'DISABLE'
|
|
);
|
|
|
|
PRINT '已迁移现有停用状态数据';
|
|
|
|
-- 3. 为新字段添加索引
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.cfg_rule_version') AND name = N'IX_cfg_rule_version_status')
|
|
BEGIN
|
|
CREATE INDEX IX_cfg_rule_version_status ON dbo.cfg_rule_version(status);
|
|
PRINT '已创建 status 字段索引';
|
|
END
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.cfg_rule_version') AND name = N'IX_cfg_rule_version_disabled_at')
|
|
BEGIN
|
|
CREATE INDEX IX_cfg_rule_version_disabled_at ON dbo.cfg_rule_version(disabled_at_utc);
|
|
PRINT '已创建 disabled_at_utc 字段索引';
|
|
END
|
|
|
|
-- 4. 更新现有查询以使用新的状态字段(示例)
|
|
/*
|
|
-- 旧的查询方式:
|
|
SELECT version_no, snapshot_json, published_at_utc, published_by
|
|
,disabled_audit.action_at_utc AS disabled_at_utc
|
|
,disabled_audit.operator_name AS disabled_by
|
|
FROM dbo.cfg_rule_version
|
|
OUTER APPLY (
|
|
SELECT TOP(1) action_at_utc, operator_name
|
|
FROM dbo.cfg_rule_version_audit
|
|
WHERE product_type_code = @product_type_code
|
|
AND version_no = dbo.cfg_rule_version.version_no
|
|
AND action_type = 'DISABLE'
|
|
ORDER BY action_at_utc DESC
|
|
) disabled_audit
|
|
WHERE product_type_code = @product_type_code
|
|
ORDER BY published_at_utc DESC
|
|
|
|
-- 新的查询方式:
|
|
SELECT version_no, snapshot_json, published_at_utc, published_by
|
|
,disabled_at_utc, disabled_by
|
|
,CASE WHEN status = 0 THEN 1 ELSE 0 END AS is_disabled
|
|
FROM dbo.cfg_rule_version
|
|
WHERE product_type_code = @product_type_code
|
|
ORDER BY published_at_utc DESC
|
|
*/
|
|
|
|
PRINT '规则版本停用状态字段化迁移完成';
|