/* 清理范围:已下线的 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;