Files
SGGL_SHJ/SGGL/Database/20260916_SHIYE_DCGL_DataShow_Cleanup.sql
T

335 lines
9.6 KiB
Transact-SQL
Raw Normal View History

/*
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;