場景:飯店系統含 RoomType (主表) 與 Room (從表,FK 關聯)。刪除房型時需同步標記對應房間為已刪除 (軟刪除),若任一步驟失敗全數回滾,保證資料一致性。
-- RoomType (主表) RoomTypeId (PK), TypeName, ..., TypeIsDel (BIT, 0=正常 1=刪除) -- Room (從表) RoomId (PK), RoomTypeId (FK), RoomName, ..., RoomIsDel (BIT)
CREATE PROCEDURE usp_DelRoomType
@RoomTypeId INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Error INT = 0;
BEGIN TRANSACTION;
-- 1. 標記房型刪除
UPDATE RoomType SET TypeIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
SET @Error += @@ERROR;
IF @Error <> 0
BEGIN
ROLLBACK TRANSACTION;
RETURN -1;
END
-- 2. 標記對應房間刪除
UPDATE Room SET RoomIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
SET @Error += @@ERROR;
IF @Error <> 0
BEGIN
ROLLBACK TRANSACTION;
RETURN -1;
END
COMMIT TRANSACTION;
RETURN 0;
END
| 技術點 | 說明 |
|---|---|
| 軟刪除 (IsDel) | 避免硬刪除觸發 FK 阻塞、歷史資料遺失、觸發器複雜度 |
| @@ERROR 即時檢查 | SQL Server 2005 前標準錯誤處理;新版建議用 TRY...CATCH |
| 交易範圍最小化 | 僅包含兩條 UPDATE,鎖定時間極短,降低阻塞風險 |
| 參數化 | 防 SQL 注入,利於計畫重用 |