后台批量删除实体所有附件
期初OBA导入时,可能附件信息导入错误(客户提供错误)
但是OBA没有批量删除的功能
可以执行以下SQL语句,清理对应实体的所有附件信息
@TargetEntity可以在实体扩展字段处找到,类全名就是
注意:DB_NAME()会获取当前环境数据库名称,请务必切换到文档库所对应的业务库下执行语句
/* * ==============================================================================
* 脚本名称:U9 附件跨库强力清除工具 (含多语言表 Trl 清理版)
* 作用:清理指定 Entity 的 Base_Attachment, Base_Attachment_Trl 及 FileInfo
* 逻辑:
* 1. 锁定 Base_Attachment.ID 和 Base_Attachment.FileHandler
* 2. 删除 Base_Attachment_Trl (ID = Base_Attachment.ID)
* 3. 删除 Base_Attachment
* 4. 删除 FileInfo (跨库)
* ==============================================================================
*/
-- 【1. 配置区域】请在此处修改数据库名称
DECLARE @BusinessDBName NVARCHAR(128) = DB_NAME(); -- 自动获取当前业务数据库名,请在文档库所对应的业务库环境下执行
DECLARE @DocDBName NVARCHAR(128) = 'U9TESTDoc'; -- 存储文件的数据库 (文档库)
DECLARE @TargetEntity NVARCHAR(256) = 'UFIDA.U9.CBO.SCM.Item.ItemMaster'; -- 目标实体名称
-- ==============================================================================
-- 以下逻辑自动执行,无需修改
-- ==============================================================================
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
DECLARE @Params NVARCHAR(MAX);
PRINT '----------------------------------------------------------';
PRINT '任务开始: ' + CONVERT(VARCHAR, GETDATE(), 120);
PRINT '当前业务库: [' + @BusinessDBName + ']';
PRINT '目标文档库: [' + @DocDBName + ']';
PRINT '----------------------------------------------------------';
IF DB_ID(@DocDBName) IS NULL
BEGIN
RAISERROR(N'错误: 未找到名为 [%s] 的文档数据库,请检查配置。', 16, 1, @DocDBName);
RETURN;
END
-- 构建动态 SQL
SET @SQL = N'
USE [' + @BusinessDBName + '];
BEGIN TRY
BEGIN TRANSACTION;
-- 1. 创建临时表,同时锁定 主键ID (用于删表) 和 FileHandler (用于删文件)
CREATE TABLE #TempDeleteIDs (
SysID BIGINT PRIMARY KEY, -- Base_Attachment.ID
FileID NVARCHAR(50) -- Base_Attachment.FileHandler
);
-- 填充待删除列表
INSERT INTO #TempDeleteIDs (SysID, FileID)
SELECT A.ID, A.FileHandler
FROM [dbo].[Base_Attachment] AS A
INNER JOIN [' + @DocDBName + '].[dbo].[FileInfo] AS B ON A.FileHandler = B.ID
WHERE A.EntityFullName = @p_EntityName;
DECLARE @DelCount INT = (SELECT COUNT(1) FROM #TempDeleteIDs);
IF @DelCount > 0
BEGIN
PRINT ''>> 发现匹配记录: '' + CAST(@DelCount AS NVARCHAR(20)) + '' 条,开始清理...'';
-- 2. 删除多语言表 (Base_Attachment_Trl)
-- 关系: Base_Attachment_Trl.ID = Base_Attachment.ID
DELETE T
FROM [dbo].[Base_Attachment_Trl] T
INNER JOIN #TempDeleteIDs TMP ON T.ID = TMP.SysID;
PRINT ''>> [Base_Attachment_Trl] (多语言表) 清理完成。'';
-- 3. 删除业务主表 (Base_Attachment)
DELETE A
FROM [dbo].[Base_Attachment] A
INNER JOIN #TempDeleteIDs TMP ON A.ID = TMP.SysID;
PRINT ''>> [Base_Attachment] (主表) 清理完成。'';
-- 4. 删除文件库数据 (FileInfo)
DELETE B
FROM [' + @DocDBName + '].[dbo].[FileInfo] B
INNER JOIN #TempDeleteIDs TMP ON B.ID = TMP.FileID;
PRINT ''>> [' + @DocDBName + '].[dbo].[FileInfo] (文件数据) 清理完成。'';
COMMIT TRANSACTION;
PRINT ''>> SUCCESS: 事务已提交,3张表的数据已全部清除。'';
END
ELSE
BEGIN
ROLLBACK TRANSACTION;
PRINT ''>> 提示: 未发现 EntityFullName 为指定名称的附件记录,无需执行删除。'';
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE();
PRINT ''!! 异常: 发生错误,事务已回滚。原因: '' + @ErrMsg;
RAISERROR(@ErrMsg, 16, 1);
END CATCH;
';
-- 定义参数
SET @Params = N'@p_EntityName NVARCHAR(256)';
-- 执行动态 SQL
EXEC sp_executesql @SQL, @Params, @p_EntityName = @TargetEntity;
PRINT '----------------------------------------------------------';
PRINT '任务结束: ' + CONVERT(VARCHAR, GETDATE(), 120);
TargetEntity参数示例

评论 (0)