程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 測試SQL Server的業務規則鏈接方法

測試SQL Server的業務規則鏈接方法

編輯:關於SqlServer

有一個古老的爭論,是關於在哪裡存儲應用程序業務邏輯的:是在應用程序本身的業務邏輯層中還是在數據庫層中。應用程序邏輯層的絕對支持者提出,數據庫的唯一目的就是保存數據,以備應用程序所用。提倡用數據庫來存儲業務規則的人則堅持認為,業務規則最好存儲在數據庫中,因為數據也存儲在那裡,規則在那裡更容易運行。而在我看來,對於存儲應用程序的邏輯來說,沒有一個“最好的地方”——它真正取決於您正在解決的業務問題。

鏈接數據庫存儲過程

如果您更喜歡將全部或一部分業務邏輯存儲在數據庫中的話,那麼知道SQL Server中的一種被我稱作業務規則鏈接的技術是很有好處的。基本思想就是您可以在數據庫中運行一系列的存儲過程,這是以在您需要的時候,不同進程的元數據存儲在一個數據庫表格中為基礎的。這樣做的好處就是,規則都存儲在數據庫的程序中,並且因為存儲過程的運行是以一個表格中的值為基礎的,所以您可以改變程序執行的順序,還能夠很容易地打開或終止業務規則。讓我們來看一個例子,這樣概念會更清晰。

業務規則鏈接實例

要用我想用的方式在數據庫中執行業務規則,就必須定義元數據。下面這些信息將會以數據庫表格的形式被保存:存儲過程的名稱、業務規則運行的順序、所運行業務程序的類型和業務規則是否活動等。列表A中包括了創建表格的腳本。

CREATE TABLE BusinessLogic
(
   ProcessType VARCHAR(20) NOT NULL,
   RunSequence TINYINT NOT NULL,
   LogicProcedure VARCHAR(255) NOT NULL,
   BusinessLogicActive BIT DEFAULT(1) NOT NULL,
   CONSTRAINT pk_BusinessLogic PRIMARY KEY (ProcessType, RunSequence)
)

表A

在列表B中,我在BusinessLogic表中加載了數據。這些數據是稍後我將用來處理業務規則的。RunSequence是執行存儲過程的實際順序(過程被存儲在LogicProcedure字段中)。表格中還包含了一個指示符,用來表示業務規則是否為活動的。存儲這個數據讓我能夠改變規則運行的順序,或者在需要的時候打開或終止規則,而無需對代碼做出更改。要向業務邏輯系統中添加規則也十分簡單,因為所需做的就是向數據庫中添加程序,然後在元數據表格中添加需要的數據就可以了。

在列表C中,我創建了業務規則程序(例子中包含的程序是非常簡單的;但是,在現實情況中,如果需要的話,它們可以很復雜)。所有的程序中包括了相同的輸入參數;這是業務規則鏈接的一個小小的局限性。

INSERT INTO BusinessLogic(ProcessType, RunSequence, LogicProcedure)
VALUES('CustomerOrders', 1, 'usp_Rule1')
INSERT INTO BusinessLogic(ProcessType, RunSequence, LogicProcedure)
VALUES('CustomerOrders', 2, 'usp_Rule2')
INSERT INTO BusinessLogic(ProcessType, RunSequence, LogicProcedure)
VALUES('CustomerOrders', 3, 'usp_Rule3')
INSERT INTO BusinessLogic(ProcessType, RunSequence, LogicProcedure)
VALUES('CustomerOrders', 4, 'usp_Rule4')

列表B

CREATE PROCEDURE usp_Rule1 (@RunSequence TINYINT)
AS
   PRINT 'In Procedure: ' + OBJECT_NAME(@@PROCID)
   PRINT 'Parameter Value Passed In:' + CAST(@RunSequenceAS VARCHAR(2))
GO
CREATE PROCEDURE usp_Rule2 (@RunSequence TINYINT)
AS
   PRINT 'In Procedure: ' + OBJECT_NAME(@@PROCID)
   PRINT 'Parameter Value Passed In:' + CAST(@RunSequenceAS VARCHAR(2))
GO
CREATE PROCEDURE usp_Rule3 (@RunSequence TINYINT)
AS
   PRINT 'In Procedure: ' + OBJECT_NAME(@@PROCID)
   PRINT 'Parameter Value Passed In:' + CAST(@RunSequenceAS VARCHAR(2))
GO
CREATE PROCEDURE usp_Rule4 (@RunSequence TINYINT)
AS
   PRINT 'In Procedure: ' + OBJECT_NAME(@@PROCID)
   PRINT 'Parameter Value Passed In:' + CAST(@RunSequenceAS VARCHAR(2))
GO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved