Files
SGGL_SHJ/SGGL/Database/20260917_Information_Cleanup.sql
T
lpf 8efe030f47 refactor: 清理旧模块资源并整理人员服务目录
为收敛当前分支代码范围并统一人员服务目录,移除历史模块与静态资源,减少无效代码和目录分散带来的维护成本。
2026-09-19 13:45:38 +08:00

214 lines
7.7 KiB
Transact-SQL

/*
清理范围:已下线的 ZHGL/Information 旧报表及其数据库对象。
数据库已由用户提前备份,本脚本不重复备份。
脚本只删除已确认的 16 张旧 Information_ 表、9 个旧视图及其菜单权限残留。
明确保留:
- Information_MillionsMonthlyReport、Information_MillionsMonthlyReportItem
- View_Information_MillionsMonthlyReport、View_DataIn_MillionsMonthlyReport
- View_Project_HSSEData_HSSE 及其安全数据依赖
- InformationProject_Notice、InformationProject_Picture、
InformationProject_ProjectMap、InformationProject_ReceiveFileManager
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF DB_NAME() <> N'SGGLDB_SHJ'
BEGIN
RAISERROR(N'当前数据库不是 SGGLDB_SHJ,已停止执行。', 16, 1);
RETURN;
END;
DECLARE @DropTables TABLE
(
TableName sysname NOT NULL PRIMARY KEY,
DropOrder tinyint NOT NULL
);
INSERT INTO @DropTables (TableName, DropOrder)
VALUES
(N'Information_AccidentCauseReportItem', 1),
(N'Information_ActionWorkLedgerItem', 1),
(N'Information_DrillConductedQuarterlyReportItem', 1),
(N'Information_DrillPlanHalfYearReportItem', 1),
(N'Information_SafetyProductionEvaluationItem', 1),
(N'Information_AccidentCauseReport', 2),
(N'Information_ActionWorkLedger', 2),
(N'Information_DrillConductedQuarterlyReport', 2),
(N'Information_DrillPlanHalfYearReport', 2),
(N'Information_EPSummaryReport', 2),
(N'Information_QualityWorkSummaryReport', 2),
(N'Information_QuarterlyProjectQuality', 2),
(N'Information_SafetyProductionEvaluation', 2),
(N'Information_SafetyQuarterlyReport', 2),
(N'Information_UrgeReport', 2),
(N'Information_WorkSummaryReport', 2);
DECLARE @DropViews TABLE
(
ViewName sysname NOT NULL PRIMARY KEY
);
INSERT INTO @DropViews (ViewName)
VALUES
(N'View_Information_AccidentCauseReport'),
(N'View_Information_ActionWorkLedger'),
(N'View_Information_DrillConductedQuarterlyReport'),
(N'View_Information_DrillConductedQuarterlyReportItem'),
(N'View_Information_DrillPlanHalfYearReport'),
(N'View_Information_DrillPlanHalfYearReportItem'),
(N'View_Information_SafetyProductionEvaluation'),
(N'View_Information_SafetyQuarterlyReport'),
(N'View_DataIn_AccidentCauseReport');
DECLARE @MenuIds TABLE
(
MenuId nvarchar(100) NOT NULL PRIMARY KEY
);
INSERT INTO @MenuIds (MenuId)
VALUES
(N'4BC71D2E-7D94-48C1-A61A-139637825AA5'), -- 职工伤亡事故原因分析报表
(N'A3894BAD-3F4A-4BB4-98CF-A76C588AE53F'), -- 安全生产数据季报
(N'7985C759-8EB9-4B7D-AC65-00541280B46C'), -- 应急演练开展情况季报
(N'70DEB27A-D6FF-4D57-879B-0270F2967FA0'), -- 应急演练工作计划半年报
(N'07FEEC9D-09C1-4C19-9269-62F69532086C'), -- 安全管理工作总结报告
(N'12941594-2171-411A-8CC8-32E3BD9FCDDF'), -- 质量管理工作总结报告
(N'CF9C1F00-34B8-42E5-B2D1-704094169CA3'), -- 季度工程项目质量信息表
(N'5B344750-79DD-40AA-8AA7-34B04E41FA72'), -- 生态环保工作总结报告
(N'CB76394B-BDEB-4F45-9D19-F38612DC6591'), -- 安全生产治本攻坚三年行动工作台账
(N'C48087A8-4C9F-485D-B0A4-C85E112BA705'); -- 安全生产管理评价工作调度台账
/* 菜单已清理过,这里仅保证旧菜单及权限没有残留。 */
DELETE FROM dbo.Sys_MenuFlowOperate
WHERE MenuId IN (SELECT MenuId FROM @MenuIds);
DELETE FROM dbo.Sys_ButtonPower
WHERE MenuId IN (SELECT MenuId FROM @MenuIds)
OR ButtonToMenuId IN (SELECT MenuId FROM @MenuIds);
DELETE FROM dbo.Sys_RolePower
WHERE MenuId IN (SELECT MenuId FROM @MenuIds);
DELETE FROM dbo.Sys_Menu
WHERE MenuId IN (SELECT MenuId FROM @MenuIds);
/* 先删旧视图,避免删除表后留下失效对象。 */
DECLARE @Sql nvarchar(max);
DECLARE @ViewName sysname;
DECLARE view_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT ViewName
FROM @DropViews
WHERE OBJECT_ID(N'dbo.' + ViewName, N'V') IS NOT NULL;
OPEN view_cursor;
FETCH NEXT FROM view_cursor INTO @ViewName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = N'DROP VIEW dbo.' + QUOTENAME(@ViewName) + N';';
EXEC sys.sp_executesql @Sql;
FETCH NEXT FROM view_cursor INTO @ViewName;
END;
CLOSE view_cursor;
DEALLOCATE view_cursor;
/* 删除目标表涉及的全部外键,再按明细表、主表顺序删除表。 */
DECLARE @ForeignKeyName sysname;
DECLARE @ChildSchemaName sysname;
DECLARE @ChildTableName sysname;
DECLARE fk_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT fk.name,
child_schema.name,
child_table.name
FROM sys.foreign_keys fk
JOIN sys.tables child_table
ON child_table.object_id = fk.parent_object_id
JOIN sys.schemas child_schema
ON child_schema.schema_id = child_table.schema_id
WHERE EXISTS
(
SELECT 1
FROM @DropTables d
WHERE d.TableName = child_table.name
)
OR EXISTS
(
SELECT 1
FROM @DropTables d
WHERE d.TableName = OBJECT_NAME(fk.referenced_object_id)
);
OPEN fk_cursor;
FETCH NEXT FROM fk_cursor INTO @ForeignKeyName, @ChildSchemaName, @ChildTableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = N'ALTER TABLE ' + QUOTENAME(@ChildSchemaName) + N'.' + QUOTENAME(@ChildTableName)
+ N' DROP CONSTRAINT ' + QUOTENAME(@ForeignKeyName) + N';';
EXEC sys.sp_executesql @Sql;
FETCH NEXT FROM fk_cursor INTO @ForeignKeyName, @ChildSchemaName, @ChildTableName;
END;
CLOSE fk_cursor;
DEALLOCATE fk_cursor;
DECLARE @TableName sysname;
DECLARE table_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT TableName
FROM @DropTables
WHERE DropOrder < 99
ORDER BY DropOrder, TableName;
OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
IF OBJECT_ID(N'dbo.' + @TableName, N'U') IS NOT NULL
BEGIN
SET @Sql = N'DROP TABLE dbo.' + QUOTENAME(@TableName) + N';';
EXEC sys.sp_executesql @Sql;
END;
FETCH NEXT FROM table_cursor INTO @TableName;
END;
CLOSE table_cursor;
DEALLOCATE table_cursor;
COMMIT TRANSACTION;
/* 删除结果:以下对象均应为 0。 */
SELECT d.TableName AS ObjectName,
CASE WHEN OBJECT_ID(N'dbo.' + d.TableName, N'U') IS NULL THEN 0 ELSE 1 END AS ExistsFlag
FROM @DropTables d
WHERE d.DropOrder < 99
ORDER BY d.TableName;
SELECT d.ViewName AS ObjectName,
CASE WHEN OBJECT_ID(N'dbo.' + d.ViewName, N'V') IS NULL THEN 0 ELSE 1 END AS ExistsFlag
FROM @DropViews d
ORDER BY d.ViewName;
SELECT N'Sys_Menu' AS ObjectName, COUNT_BIG(*) AS Records
FROM dbo.Sys_Menu
WHERE MenuId IN (SELECT MenuId FROM @MenuIds)
UNION ALL
SELECT N'Sys_MenuFlowOperate', COUNT_BIG(*)
FROM dbo.Sys_MenuFlowOperate
WHERE MenuId IN (SELECT MenuId FROM @MenuIds)
UNION ALL
SELECT N'Sys_ButtonPower', COUNT_BIG(*)
FROM dbo.Sys_ButtonPower
WHERE MenuId IN (SELECT MenuId FROM @MenuIds)
OR ButtonToMenuId IN (SELECT MenuId FROM @MenuIds)
UNION ALL
SELECT N'Sys_RolePower', COUNT_BIG(*)
FROM dbo.Sys_RolePower
WHERE MenuId IN (SELECT MenuId FROM @MenuIds);
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;