提供單一預存程序 pr_backup_db,支援:
BACKUP DATABASE 指令並執行。IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'pr_backup_db' AND xtype = 'P')
DROP PROCEDURE pr_backup_db;
GO
CREATE PROCEDURE pr_backup_db
@flag VARCHAR(20) OUTPUT, -- 回傳狀態:'ok' / 'db not exist' / 'file type error'
@backup_db_name VARCHAR(128), -- 目標資料庫
@filename VARCHAR(1000) -- 完整備份檔路徑(含檔名),必須以 \ 結尾目錄
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(4000), @par NVARCHAR(1000);
-- 1. 驗證資料庫存在
IF NOT EXISTS (SELECT 1 FROM master..sysdatabases WHERE name = @backup_db_name)
BEGIN
SELECT @flag = 'db not exist';
RETURN;
END
-- 2. 驗證路徑格式:必須包含 \ 且不以 \ 結尾(預期為檔案完整路徑)
IF CHARINDEX('\', @filename) = 0 OR RIGHT(@filename, 1) = '\'
BEGIN
SELECT @flag = 'file type error';
RETURN;
END
-- 3. 動態建構並執行 BACKUP 指令
SELECT @par = '@filename VARCHAR(1000)';
SELECT @sql = 'BACKUP DATABASE ' + QUOTENAME(@backup_db_name) + ' TO DISK = @filename WITH INIT, NAME = N''AutoBackup_' + CONVERT(VARCHAR(20), GETDATE(), 112) + ''', STATS = 10';
EXEC sp_executesql @sql, @par, @filename = @filename;
SELECT @flag = 'ok';
END
GO
DECLARE @result VARCHAR(20);
EXEC pr_backup_db @flag = @result OUTPUT, @backup_db_name = 'Northwind', @filename = 'D:\Backups\Northwind_20240115.bak';
SELECT @result AS BackupResult; -- 應回傳 'ok'
| 需求 | 實作方向 |
|---|---|
| 支援差異/記錄備份 | 新增 @backup_type 參數('FULL'/'DIFF'/'LOG'),動態加入 WITH DIFFERENTIAL 或 BACKUP LOG |
| 多檔案條狀備份 | 接受檔案路徑陣列/表值參數,迴圈建構 TO DISK=... 子句 |
| 壓縮/加密 | SQL 2008+ 加入 WITH COMPRESSION, ENCRYPTION |
| 非同步執行與進度回報 | SQL Agent Job + msdb.dbo.backupset 監控 |
| 備份保留策略 | 搭配維護計畫或 PowerShell 清理過期 .bak |
sysadmin 或 db_backupoperator 角色,且 SQL Server 服務帳號對目標資料夾有寫入權限。WITH INIT 會覆寫同名檔案;生產環境建議檔名含日期時間避免誤覆寫。