/* SHIYE、DCGL、DataShow 第二批清理执行脚本 目标库:SGGLDB_SHJ 已确认删除: - SHIYE 实业安全简报 - DCGL 集团督查检查、检查通知单、检查整改及重点项目整改台账 - 上述模块对应的视图、菜单权限和业务数据表 - DataShow 页面已从 FineUIPro.Web 删除;其 CQMS 专属表和菜单已在首批脚本中处理 明确保留: - Person_Persons 人员管理及 HTGL 人员 API - WBS_* 表 - 焊接业务及共享的 Material_Material、Material_Inspection、Material_InspectionApprove 说明: - 数据库已由用户提前备份,本脚本不再执行备份。 - @ExecuteCleanup 已按用户确认设置为 1,执行前仍会校验数据库名和保护对象。 - 脚本会在同一事务中删除目标外键、视图、表及精确菜单权限记录,可重复执行。 - 不删除 Sys_Button 定义,也不删除人员、WBS 和焊接共享表。 */ USE [SGGLDB_SHJ]; GO SET NOCOUNT ON; SET XACT_ABORT ON; IF DB_NAME() <> N'SGGLDB_SHJ' BEGIN RAISERROR(N'当前数据库不是 SGGLDB_SHJ,已停止执行。', 16, 1); RETURN; END; DECLARE @ExecuteCleanup bit = 1; DECLARE @DropTables TABLE ( TableName sysname NOT NULL PRIMARY KEY, CleanupGroup nvarchar(100) NOT NULL ); INSERT INTO @DropTables (TableName, CleanupGroup) VALUES (N'Information_SafetyBriefing', N'SHIYE 实业安全简报'), (N'InformationProject_SafetyBriefing', N'SHIYE 实业安全简报'), (N'DCGL_Check_CheckInfo', N'DCGL 集团督查检查'), (N'DCGL_Check_CheckInfo_CheckFile', N'DCGL 集团督查检查'), (N'DCGL_Check_CheckInfo_CheckTeam', N'DCGL 集团督查检查'), (N'DCGL_Check_CheckInfo_TableNoticeItem', N'DCGL 集团督查检查'), (N'DCGL_Check_CheckRectify', N'DCGL 集团督查检查'), (N'DCGL_Check_CheckRectifyItem', N'DCGL 集团督查检查'), (N'DCGL_Report_KeyProjectRectificationSituationLedger', N'DCGL 集团督查检查'); DECLARE @DropViews TABLE ( ViewName sysname NOT NULL PRIMARY KEY, CleanupGroup nvarchar(100) NOT NULL ); INSERT INTO @DropViews (ViewName, CleanupGroup) VALUES (N'View_DCGL_CheckRectifyListFromSUB', N'DCGL 集团督查检查'), (N'View_DCGLKeyProjectRectificationSituationLedger', N'DCGL 集团督查检查'); DECLARE @MenuIds TABLE ( MenuId nvarchar(100) NOT NULL PRIMARY KEY, MenuName nvarchar(100) NOT NULL ); /* 只删除已从当前菜单 XML 核对过的 SHIYE/DCGL 节点,旧孤立节点不存在时自动跳过。 */ INSERT INTO @MenuIds (MenuId, MenuName) VALUES (N'86F71934-7149-470E-BEAB-FFDC5BF3C0F2', N'实业安全简报'), (N'AAC7C263-6E25-49DC-985B-DC3FA7AAF3A1', N'旧实业安全简报节点'), (N'8B9C0F42-D36F-4798-94AB-F56723E8B714', N'集团督查检查'), (N'15443DE9-4AC2-43F9-A622-9F9253ECB157', N'督查检查通知单'), (N'2E4A3E58-44B7-41B0-BFE3-634DF29AAE27', N'集团下发督查检查整改'), (N'35BA8E89-4575-4A3F-9C22-98B323E67DA1', N'重点工程项目质量专项整治行动开展情况台账'); DECLARE @ProtectedTables TABLE ( TableName sysname NOT NULL PRIMARY KEY, ProtectionNote nvarchar(200) NOT NULL ); INSERT INTO @ProtectedTables (TableName, ProtectionNote) VALUES (N'Person_Persons', N'人员管理及 HTGL 人员 API'), (N'Material_Material', N'焊接库存共享物料'), (N'Material_Inspection', N'焊接库存共享检验'), (N'Material_InspectionApprove', N'焊接共享检验审批'); /* 执行前打印目标对象及保护对象状态。 */ SELECT d.CleanupGroup, d.TableName, CASE WHEN t.object_id IS NULL THEN N'不存在/已清理' ELSE N'待删除' END AS TableStatus, COALESCE(SUM(CASE WHEN p.index_id IN (0, 1) THEN p.rows ELSE 0 END), 0) AS [RowCount] FROM @DropTables d LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = d.TableName LEFT JOIN sys.partitions p ON p.object_id = t.object_id GROUP BY d.CleanupGroup, d.TableName, t.object_id ORDER BY d.CleanupGroup, d.TableName; SELECT v.CleanupGroup, v.ViewName, CASE WHEN o.object_id IS NULL THEN N'不存在/已清理' ELSE N'待删除' END AS ViewStatus FROM @DropViews v LEFT JOIN sys.views o ON o.schema_id = SCHEMA_ID(N'dbo') AND o.name = v.ViewName ORDER BY v.CleanupGroup, v.ViewName; SELECT p.TableName, p.ProtectionNote, CASE WHEN t.object_id IS NULL THEN N'缺失' ELSE N'存在' END AS TableStatus FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName ORDER BY p.TableName; SELECT N'WBS 表数量' AS Metric, COUNT(*) AS Value FROM sys.tables WHERE schema_id = SCHEMA_ID(N'dbo') AND name LIKE N'WBS[_]%'; IF EXISTS ( SELECT 1 FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName WHERE t.object_id IS NULL ) BEGIN RAISERROR(N'保护表缺失,已停止执行。', 16, 1); RETURN; END; IF NOT EXISTS ( SELECT 1 FROM sys.tables WHERE schema_id = SCHEMA_ID(N'dbo') AND name LIKE N'WBS[_]%' ) BEGIN RAISERROR(N'WBS 表缺失,已停止执行。', 16, 1); RETURN; END; IF @ExecuteCleanup = 0 BEGIN PRINT N'当前为预览模式,未删除任何数据库对象。'; RETURN; END; BEGIN TRY BEGIN TRANSACTION; DECLARE @Sql nvarchar(max) = N''; /* 先解除所有涉及目标表的外键,包含目标表之间及目标表指向共享表的外键。 */ SELECT @Sql = @Sql + N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + N'.' + QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + N' DROP CONSTRAINT ' + QUOTENAME(fk.name) + N';' + CHAR(13) + CHAR(10) FROM sys.foreign_keys fk WHERE EXISTS ( SELECT 1 FROM @DropTables d JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = d.TableName WHERE t.object_id = fk.parent_object_id OR t.object_id = fk.referenced_object_id ); IF @Sql <> N'' EXEC sys.sp_executesql @Sql; SET @Sql = N''; /* 先删除视图,再删除其依赖的业务表。 */ SELECT @Sql = @Sql + N'DROP VIEW ' + QUOTENAME(OBJECT_SCHEMA_NAME(v.object_id)) + N'.' + QUOTENAME(v.name) + N';' + CHAR(13) + CHAR(10) FROM @DropViews d JOIN sys.views v ON v.schema_id = SCHEMA_ID(N'dbo') AND v.name = d.ViewName; IF @Sql <> N'' EXEC sys.sp_executesql @Sql; SET @Sql = N''; /* 外键和视图已解除后,按实际存在对象删除目标表。 */ SELECT @Sql = @Sql + N'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + QUOTENAME(t.name) + N';' + CHAR(13) + CHAR(10) FROM @DropTables d JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = d.TableName; IF @Sql <> N'' EXEC sys.sp_executesql @Sql; /* 删除目标菜单和对应按钮/角色权限,不删除 Sys_Button 定义。 */ DELETE FROM dbo.Sys_ButtonPower WHERE MenuId IN (SELECT MenuId FROM @MenuIds) OR ButtonToMenuId IN (SELECT MenuId FROM @MenuIds); DECLARE @DeletedButtonPower int = @@ROWCOUNT; DELETE FROM dbo.Sys_RolePower WHERE MenuId IN (SELECT MenuId FROM @MenuIds); DECLARE @DeletedRolePower int = @@ROWCOUNT; DELETE FROM dbo.Sys_Menu WHERE MenuId IN (SELECT MenuId FROM @MenuIds); DECLARE @DeletedMenus int = @@ROWCOUNT; COMMIT TRANSACTION; SELECT @DeletedButtonPower AS DeletedSysButtonPower, @DeletedRolePower AS DeletedSysRolePower, @DeletedMenus AS DeletedSysMenu; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; THROW; END CATCH; /* 执行后核验目标对象及保护对象。 */ SELECT d.TableName, CASE WHEN t.object_id IS NULL THEN N'已删除/不存在' ELSE N'仍存在' END AS CleanupStatus FROM @DropTables d LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = d.TableName ORDER BY d.TableName; SELECT d.ViewName, CASE WHEN v.object_id IS NULL THEN N'已删除/不存在' ELSE N'仍存在' END AS CleanupStatus FROM @DropViews d LEFT JOIN sys.views v ON v.schema_id = SCHEMA_ID(N'dbo') AND v.name = d.ViewName ORDER BY d.ViewName; SELECT p.TableName, CASE WHEN t.object_id IS NULL THEN N'缺失' ELSE N'仍存在' END AS ProtectionStatus FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName ORDER BY p.TableName; SELECT N'目标表剩余数量' AS Metric, COUNT(*) AS Value FROM sys.tables t JOIN @DropTables d ON d.TableName = t.name WHERE t.schema_id = SCHEMA_ID(N'dbo'); SELECT N'目标视图剩余数量' AS Metric, COUNT(*) AS Value FROM sys.views v JOIN @DropViews d ON d.ViewName = v.name WHERE v.schema_id = SCHEMA_ID(N'dbo'); SELECT N'目标菜单剩余数量' AS Metric, COUNT(*) AS Value FROM dbo.Sys_Menu m JOIN @MenuIds i ON i.MenuId = m.MenuId; SELECT N'WBS 表数量' AS Metric, COUNT(*) AS Value FROM sys.tables WHERE schema_id = SCHEMA_ID(N'dbo') AND name LIKE N'WBS[_]%'; SELECT TableName, SUM([RowCount]) AS [RowCount] FROM ( SELECT t.name AS TableName, CASE WHEN p.index_id IN (0, 1) THEN p.rows ELSE 0 END AS [RowCount] FROM sys.tables t LEFT JOIN sys.partitions p ON p.object_id = t.object_id WHERE t.schema_id = SCHEMA_ID(N'dbo') AND t.name IN ( N'Person_Persons', N'Material_Material', N'Material_Inspection', N'Material_InspectionApprove' ) ) AS ProtectedData GROUP BY TableName ORDER BY TableName;