DBA 常面臨挑戰:伺服器停機通知需列出受影響「應用程式名稱」,而非資料庫名稱。IT 主管與業務單位不懂 DB_FIN_01 代表什麼,但清楚「財務系統」。本文分享建立「資料庫-應用程式對應元資料庫」的實務做法,讓技術與業務語言無縫轉換。
CREATE TABLE [dbo].[Applications] (
[AppID] INT IDENTITY(154,1) NOT NULL PRIMARY KEY,
[ApplicationName] VARCHAR(100) NOT NULL
);
CREATE TABLE [dbo].[Database_Applications] (
[DB_AppID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[ServerName] VARCHAR(50) NOT NULL,
[DatabaseName] VARCHAR(100) NOT NULL,
[ApplicationName] VARCHAR(100) NULL -- 故意不正規化,存名稱而非 FK
);
Database_Applications 即可產生報表,無需 JOIN每日元資料載入後,執行以下查詢找出尚未登記的新資料庫:
SELECT D.[Server], D.DatabaseName
FROM dbo.Databases D
LEFT JOIN dbo.Database_Applications DA
ON D.DatabaseName = DA.DatabaseName AND D.[Server] = DA.[ServerName]
WHERE DA.DB_AppID IS NULL
ORDER BY D.[Server], D.DatabaseName;
CREATE PROCEDURE [dbo].[pAdd_Application]
@ServerName VARCHAR(50),
@DatabaseName VARCHAR(100),
@ApplicationName VARCHAR(100)
AS
BEGIN
-- 1. 更新已存在但未指定應用的記錄
UPDATE dbo.Database_Applications
SET ApplicationName = @ApplicationName
WHERE ServerName = @ServerName
AND DatabaseName = @DatabaseName
AND ApplicationName IS NULL;
-- 2. 若應用程式不存在於主檔,自動新增
IF (SELECT COUNT(*) FROM dbo.Applications WHERE ApplicationName = @ApplicationName) = 0
BEGIN
INSERT INTO dbo.Applications (ApplicationName) VALUES (@ApplicationName);
PRINT 'Added new Application: ' + @ApplicationName + ' to Applications table';
SELECT * FROM dbo.Applications WHERE ApplicationName = @ApplicationName;
END
-- 3. 回傳關聯記錄
SELECT ServerName, DatabaseName, ApplicationName
FROM dbo.Database_Applications
WHERE ServerName = @ServerName
AND DatabaseName = @DatabaseName
AND ApplicationName = @ApplicationName;
END
dbo.DatabasespAdd_Application 登記Database_Applications 產出應用程式清單刻意不將 pAdd_Application 整合入 SSIS 最後步驟,保留人工確認環節,避免誤登記、確保 DBA 掌握新資料庫動態。
Environment (Prod/Dev/Test)、Criticality (高/中/低)、OwnerTeam 欄位「資料庫-應用程式對應元資料庫」成本極低 (兩張表、一個預存程序、一個每日查詢),效益極高:讓 DBA 用業務語言說話,讓業務單位聽得懂技術影響。這是從「管理資料庫」進化到「管理業務資料服務」的關鍵一步。