關於SQLServer2000中觸發器的使用——多行資料提交
關於觸發器的使用,有很多爭議。
觸發器的好處不言而喻是增強了資料的校驗能力,能夠有效地實現複雜的業務邏輯。在一定程度上走的比約束和check走的更遠。
關於觸發器的壞處,最典型的就是觸發器的使用會導致系統效能下降,資料的不可控性,尤其是跨表檢測,以及可能導致的觸發器遞迴更加加深了資料的維護難度和不可控性。
本文無意討論觸發器的原理和好壞,旨在描述一個關於批次資料提交時的觸發器是如何設計的。
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [TRI_xxx] ON xxx
FOR INSERT,UPDATE
AS
SET NOCOUNT ON
DECLARE
--檢測標誌設定
@CHECK INT,
--定義公共變數
@TODAY DATETIME
--定義基表變數
@field1 INT,
@field2 INT,
@field3 VARCHAR(20),
@fieldN INT,
--定義跨表變數
@table1_field1 INT,
@table1_field2 INT,
@tableN_fieldM INT
--定義遊標
DECLARE cur_xxx CURSOR FOR
SELECT field1,field2,field3,fieldN FROM INSERTED
--如果非集合修改,則定義為如下
/*
SELECT @field1=field1,
@field2=field2,
@field3=field3,
@field4=field4,
FROM INSERTED
*/
SET @TODAY=CONVERT(VARCHAR(10),GETDATE(),120)
OPEN CUR_ZYGD
FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN
WHILE (@@FETCH_STATUS=0)
BEGIN
------------------------------------------------------------------------
--------------------以下針對不同的規則,進行相關處理--------------------
------------------------------------------------------------------------
--滿足某某條件,則不處理直接退出
IF cond1
BEGIN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
END
--滿足某某條件,則提示處理直接退出
IF cond2
BEGIN
RAISERROR('XXX錯誤!',16,1)
ROLLBACK TRAN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
END
--跨表檢查,滿足某某條件,則提示處理直接退出
SELECT TOP 1 @table1_field1=field1 FROM table1 WHERE 1=1
IF cond3 IS NOT NULL
BEGIN
RAISERROR('XXX錯誤!',16,1)
ROLLBACK TRAN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
ELSE
BEGIN
SET @field1=@table1_field1 --可能會根據其他跨表的結果更新當前值
END
--最後根據主鍵更新相關值
UPDATE xxx
SET field1=@field1,
field2=@field2
WHERE PrimaryKey=@PrimaryKey AND (ISNULL(field1,'')<>ISNULL(@field1,'') OR ISNULL(field2,0)<>ISNULL(@field2,0))
FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN
END
CLOSE CUR_xxx
DEALLOCATE CUR_xxx
SET NOCOUNT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
觸發器的好處不言而喻是增強了資料的校驗能力,能夠有效地實現複雜的業務邏輯。在一定程度上走的比約束和check走的更遠。
關於觸發器的壞處,最典型的就是觸發器的使用會導致系統效能下降,資料的不可控性,尤其是跨表檢測,以及可能導致的觸發器遞迴更加加深了資料的維護難度和不可控性。
本文無意討論觸發器的原理和好壞,旨在描述一個關於批次資料提交時的觸發器是如何設計的。
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [TRI_xxx] ON xxx
FOR INSERT,UPDATE
AS
SET NOCOUNT ON
DECLARE
--檢測標誌設定
@CHECK INT,
--定義公共變數
@TODAY DATETIME
--定義基表變數
@field1 INT,
@field2 INT,
@field3 VARCHAR(20),
@fieldN INT,
--定義跨表變數
@table1_field1 INT,
@table1_field2 INT,
@tableN_fieldM INT
--定義遊標
DECLARE cur_xxx CURSOR FOR
SELECT field1,field2,field3,fieldN FROM INSERTED
--如果非集合修改,則定義為如下
/*
SELECT @field1=field1,
@field2=field2,
@field3=field3,
@field4=field4,
FROM INSERTED
*/
SET @TODAY=CONVERT(VARCHAR(10),GETDATE(),120)
OPEN CUR_ZYGD
FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN
WHILE (@@FETCH_STATUS=0)
BEGIN
------------------------------------------------------------------------
--------------------以下針對不同的規則,進行相關處理--------------------
------------------------------------------------------------------------
--滿足某某條件,則不處理直接退出
IF cond1
BEGIN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
END
--滿足某某條件,則提示處理直接退出
IF cond2
BEGIN
RAISERROR('XXX錯誤!',16,1)
ROLLBACK TRAN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
END
--跨表檢查,滿足某某條件,則提示處理直接退出
SELECT TOP 1 @table1_field1=field1 FROM table1 WHERE 1=1
IF cond3 IS NOT NULL
BEGIN
RAISERROR('XXX錯誤!',16,1)
ROLLBACK TRAN
CLOSE cur_xxx --非遊標,無需該語句
DEALLOCATE cur_xxx --非遊標,無需該語句
RETURN
ELSE
BEGIN
SET @field1=@table1_field1 --可能會根據其他跨表的結果更新當前值
END
--最後根據主鍵更新相關值
UPDATE xxx
SET field1=@field1,
field2=@field2
WHERE PrimaryKey=@PrimaryKey AND (ISNULL(field1,'')<>ISNULL(@field1,'') OR ISNULL(field2,0)<>ISNULL(@field2,0))
FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN
END
CLOSE CUR_xxx
DEALLOCATE CUR_xxx
SET NOCOUNT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-620586/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫的觸發器的使用資料庫觸發器
- MySQL使用觸發器MySql觸發器
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- MySQL觸發器的使用規則MySql觸發器
- SqlServer觸發器的建立與使用SQLServer觸發器
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- 關於iOS開發中copy的使用iOS
- SAP 資料更新的觸發
- 數位電路中的觸發器觸發器
- 觸發器實現表資料自動更新觸發器
- 25. 使用MySQL之使用觸發器MySql觸發器
- pt-osc使用增量資料觸發器的不足之處總結和推薦觸發器
- MySQL全面瓦解17:觸發器相關MySql觸發器
- jquery和bootstrap獲取checkbox選中的多行資料jQueryboot
- 關於Web開發中的“程式=資料結構+演算法”Web資料結構演算法
- 基於gitee WebHook完成程式碼提交就觸發Jenkins自動構建GiteeWebHookJenkins
- 觸發form表單自動提交的方式有哪些?ORM
- 通過觸發器記錄資料庫連線資訊觸發器資料庫
- 關於Web開發中“程式=資料結構+演算法”的思考Web資料結構演算法
- 關於虛擬機器的使用虛擬機
- Sqlserver關於TDE透明資料加密的使用總結SQLServer加密
- 關於使用Spring Boot的Kafka教程 - DZone大資料Spring BootKafka大資料
- 關於jQuery中的選擇器jQuery
- mysql觸發器MySql觸發器
- D觸發器觸發器
- 使用GoldenGate EVENTACTIONS執行資料的實時觸發和定製化Go
- 頭歌資料庫實驗七:函式與觸發器資料庫函式觸發器
- 模板表單資料提交於後臺的接受機制
- 關於SQL Server資料庫中的使用者許可權和角色管理SQLServer資料庫
- (轉)git中關於fetch的使用Git
- 使用 antd 的 form 元件來自定義提交的資料格式ORM元件
- 關於伺服器資料遷移,介紹在伺服器資料遷移計劃中的7個步驟伺服器
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- MySQL觸發器的使用和優缺點介紹ZGMHMySql觸發器
- 關於資料湖、資料倉儲的想法
- 關於java中的類載入器Java
- oracle 觸發器,當一個表更新或插入時將資料同步至另個庫中的某個表中Oracle觸發器
- 技術分享:NodeJS中的Events(事件觸發器)講解NodeJS事件觸發器
- SqlServer-觸發器SQLServer觸發器