【066】后台批量删除实体所有附件
侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计收到 2 条评论

【066】后台批量删除实体所有附件

竹秋廿九
2025-11-26 / 0 评论 / 16 阅读 / 正在检测是否收录...

后台批量删除实体所有附件

期初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参数示例

7b1626c1-f00e-4f76-8a61-f3902944449f

1

评论 (0)

取消