在WorkFine应用端备份指定数据库并记录日志

厌倦了数据库、设计端之间来回奔波,那就使用此方法解决吧。

应用场景

写好了回写公式,做测试前总要备份下数据库,确保万无一失。之前写了备份全部用户数据库的存储过程,感觉不够灵活,需要一个指定数据库备份、查看备份结果的功能

效果展示

图片[1]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发
界面

视频演示

实现方法

  • 创建日志记录表
  • 创建存储过程
  • 引入WorkFine,外部数据源
  • 在WorkFine设置按钮 => 存储过程
  • 在WorkFine设置取值公式获取引入的外部数据源日志记录表

相关SQL语句

创建日志记录数据表

USE WF_WZGL;  -- 也可以选择其他数据库,如 msdb 或自定义的 DBA 数据库

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'BackupLog')
BEGIN
    CREATE TABLE BackupLog (
        Id INT IDENTITY(1,1) PRIMARY KEY,
        DatabaseName NVARCHAR(128) NOT NULL,            -- 数据库名称
        BackupStartTime DATETIME NOT NULL DEFAULT GETDATE(), -- 开始时间
        BackupFileSizeMB DECIMAL(10,2) NULL,            -- 备份文件大小(MB)
        BackupFilePath NVARCHAR(500) NOT NULL,          -- 文件路径
        Status NVARCHAR(50) NOT NULL DEFAULT 'Success'  -- 状态:Success / Failed
    );
    
    PRINT '✅ 日志表 [BackupLog] 已创建。';
END
ELSE
BEGIN
    PRINT 'ℹ️  日志表 [BackupLog] 已存在。';
END
图片[2]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发

创建存储过程语句

语句介绍

该脚本在 WF_WZGL 数据库中创建一个名为 BackupDatabase 的存储过程,用于:

  • 自动备份指定数据库到 C:\tempbak\ 路径
  • 文件名包含数据库名和时间戳(如:WF_WZGL_20251005_012000.bak
  • 记录备份开始时间、路径和状态(成功/失败)到 BackupLog 表
  • 支持重复执行,失败自动捕获并记录错误
USE WF_WZGL;
-- 当前数据库设为 WF_WZGL

-- 如果已存在同名存储过程,则删除
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'BackupDatabase' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
    DROP PROCEDURE dbo.BackupDatabase;
END
;

-- 使用动态 SQL 创建存储过程
DECLARE @SQL NVARCHAR(MAX) = '
CREATE PROCEDURE dbo.BackupDatabase
    @DatabaseName NVARCHAR(128)
AS
BEGIN
    SET NOCOUNT ON;

    -- 声明变量
    DECLARE @BackupPath NVARCHAR(500) = ''C:\tempbak\'';
    DECLARE @FileName NVARCHAR(500);
    DECLARE @DateTime NVARCHAR(50);
    DECLARE @SQLCmd NVARCHAR(2000);
    DECLARE @BackupStartTime DATETIME = GETDATE();
    DECLARE @Status NVARCHAR(50) = ''Success'';

    -- 检查数据库是否存在
    IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @DatabaseName)
    BEGIN
        RAISERROR(''❌ 错误:数据库 "%s" 不存在。'', 16, 1, @DatabaseName);

        -- 记录失败日志(FileSize 为 NULL)
        INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
        VALUES (@DatabaseName, @BackupStartTime, NULL, '''', ''Failed: Database not found'');

        RETURN;
    END

    -- 确保路径以反斜杠结尾
    IF RIGHT(@BackupPath, 1) <> ''\'' 
        SET @BackupPath = @BackupPath + ''\'';

    -- 生成时间戳
    SET @DateTime = CONVERT(VARCHAR(20), @BackupStartTime, 112) + ''_'' + 
                   REPLACE(CONVERT(VARCHAR(8), @BackupStartTime, 108), '':'', '''');

    -- 构造备份文件名
    SET @FileName = @BackupPath + @DatabaseName + ''_'' + @DateTime + ''.bak'';

    -- 输出信息
    PRINT ''📌 开始备份数据库:'' + @DatabaseName;
    PRINT ''📁 备份文件路径:'' + @FileName;

    -- 构建备份命令
    SET @SQLCmd = ''BACKUP DATABASE ['' + @DatabaseName + ''] TO DISK = '''''' + @FileName + '''''' WITH INIT, COMPRESSION, STATS = 5'';

    -- 执行备份
    BEGIN TRY
        EXEC sp_executesql @SQLCmd;

        -- 记录成功日志,FileSize 为 NULL
        INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
        VALUES (@DatabaseName, @BackupStartTime, NULL, @FileName, ''Success'');

        PRINT ''✅ 成功:数据库 "'' + @DatabaseName + ''" 已备份(文件大小未记录)。'';

    END TRY
    BEGIN CATCH
        SET @Status = ''Failed: '' + LEFT(ERROR_MESSAGE(), 200);

        -- 记录失败日志
        INSERT INTO dbo.BackupLog (DatabaseName, BackupStartTime, BackupFileSizeMB, BackupFilePath, Status)
        VALUES (@DatabaseName, @BackupStartTime, NULL, @FileName, @Status);

        DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
        RAISERROR(''❌ 备份失败 - %s'', 16, 1, @ErrorMessage);
    END CATCH
END
';

-- 执行动态创建存储过程
EXEC sp_executesql @SQL;

-- 验证是否创建成功
IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'BackupDatabase' AND schema_id = SCHEMA_ID('dbo'))
    PRINT '✅ 存储过程 [WF_WZGL.dbo.BackupDatabase] 已成功创建或更新(已移除文件大小获取)。';
ELSE
    PRINT '❌ 存储过程创建失败,请检查错误信息。';

查看备份文件大小

图片[3]-在WorkFine应用端备份指定数据库并记录日志-本牛千智丨专注WorkFine开发
-- 手动查询备份历史(可选)
USE msdb;
SELECT 
    database_name,
    backup_start_date,
    CAST(backup_size / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS SizeMB,
    physical_device_name
FROM msdb.dbo.backupset b
JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
WHERE database_name = 'WF_WZGL'
ORDER BY backup_start_date DESC;

相关文章

© 版权声明
THE END
喜欢就点赞吧
点赞15 分享