自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

測試SQL Server業(yè)務(wù)規(guī)則鏈接方法

數(shù)據(jù)庫 SQL Server
一直以來關(guān)于在哪里存儲應(yīng)用程序業(yè)務(wù)邏輯有著很大的爭議,本文是作者就個人的看法來講述業(yè)務(wù)規(guī)則鏈接的方法。

有一個持續(xù)很長時間的爭論,是關(guān)于在哪里存儲應(yīng)用程序業(yè)務(wù)邏輯的:是在應(yīng)用程序本身的業(yè)務(wù)邏輯層中還是在數(shù)據(jù)庫層中。應(yīng)用程序邏輯層的絕對支持者提出,數(shù)據(jù)庫的唯一目的就是保存數(shù)據(jù),以備應(yīng)用程序所用。提倡用數(shù)據(jù)庫來存儲業(yè)務(wù)規(guī)則的人則堅持認為,業(yè)務(wù)規(guī)則***存儲在數(shù)據(jù)庫中,因為數(shù)據(jù)也存儲在那里,規(guī)則在那里更容易運行。而在我看來,對于存儲應(yīng)用程序的邏輯來說,沒有一個“***的地方”——它真正取決于您正在解決的業(yè)務(wù)問題。

鏈接數(shù)據(jù)庫存儲過程

如果您更喜歡將全部或一部分業(yè)務(wù)邏輯存儲在數(shù)據(jù)庫中的話,那么知道 SQL Server 中的一種被我稱作業(yè)務(wù)規(guī)則鏈接的技術(shù)是很有好處的?;舅枷刖褪悄梢栽跀?shù)據(jù)庫中運行一系列的存儲過程,這是以在您需要的時候,不同進程的元數(shù)據(jù)存儲在一個數(shù)據(jù)庫表格中為基礎(chǔ)的。這樣做的好處就是,規(guī)則都存儲在數(shù)據(jù)庫的程序中,并且因為存儲過程的運行是以一個表格中的值為基礎(chǔ)的,所以您可以改變程序執(zhí)行的順序,還能夠很容易地打開或終止業(yè)務(wù)規(guī)則。讓我們來看一個例子,這樣概念會更清晰。

業(yè)務(wù)規(guī)則鏈接實例

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

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)
)

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

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')

在列表 C 中,我創(chuàng)建了業(yè)務(wù)規(guī)則程序(例子中包含的程序是非常簡單的;但是,在現(xiàn)實情況中,如果需要的話,它們可以很復(fù)雜)。所有的程序中包括了相同的輸入?yún)?shù);這是業(yè)務(wù)規(guī)則鏈接的一個小小的局限性。

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

接下來就是處理業(yè)務(wù)規(guī)則的代碼了。在列表 D 中,我用一個指針在表格中迭代,該表格中的記錄都保存著元數(shù)據(jù)。當(dāng)可以用一種不同的循環(huán)結(jié)構(gòu)來完成同一個邏輯時,用指針要簡單一些。不管是怎么樣完成的,都需要用某種類型的迭代循環(huán)和執(zhí)行所需要的業(yè)務(wù)程序。運行這個代碼將執(zhí)行每一個文章前面所定義的四個存儲過程。

在列表 D 中,有兩個主要引人注意的地方。***個就是用來從表格中檢索記錄的 select 語句,所檢索的記錄中包含了處理業(yè)務(wù)規(guī)則的信息。從這個簡單的查詢中,我可以為任何類型的業(yè)務(wù)處理從 BusinessLogic 表中返回行。我還能保證規(guī)則是活動的,并且按照它們需要執(zhí)行的順序返回。

DECLARE @LogicProcedure VARCHAR(255)
DECLARE @RunSequence TINYINT
DECLARE LogicCursor CURSOR
FOR
SELECT LogicProcedure, RunSequence FROM BusinessLogic
WHERE
   ProcessType = 'CustomerOrders' AND
   BusinessLogicActive = 1
ORDER BY RunSequence ASC
OPEN LogicCursor
FETCH NEXT FROM LogicCursor
INTO @LogicProcedure, @RunSequence
WHILE @@FETCH_STATUS = 0
BEGIN
   EXECUTE @LogicProcedure --//Call procedure stored in variable
   @RunSequence = @RunSequence --//Pass in parameter
   PRINT '-----------------------------'
FETCH NEXT FROM LogicCursor
INTO @LogicProcedure, @RunSequence
END
CLOSE LogicCursor
DEALLOCATE LogicCursor
GO

第二個就是執(zhí)行業(yè)務(wù)規(guī)則的方式。當(dāng)指針迭代時,它從 BusinessLogic 表中檢索將要被執(zhí)行的存儲過程的名稱,然后將其儲存在一個邏輯變量中。EXECUTE 命令允許用戶執(zhí)行存儲過程,即使該存儲過程的名稱被儲存在一個變量中。在這種方式下,調(diào)用存儲過程還使得我能夠向存儲過程中輸入所需的參數(shù)。

這使我回到了先前關(guān)于業(yè)務(wù)程序具有相同數(shù)量的輸入?yún)?shù)這一點。我能夠以一種相當(dāng)動態(tài)的方式運行業(yè)務(wù)程序,這取決于在程序運行時 BusinessLogic 表中儲存了什么。但是,現(xiàn)在我還沒有一種方法可以動態(tài)地向業(yè)務(wù)程序輸入?yún)?shù)。

一種簡單的解決辦法就是保證所有的業(yè)務(wù)程序接受相同數(shù)量的參數(shù),不管用不用它們。這種技術(shù)保證我們始終為業(yè)務(wù)程序提供所需的參數(shù)。也有其他的方法可以實現(xiàn)這些所需參數(shù)的輸入,但是那些不是這篇文章所要討論的。

扼要重述

如果您的應(yīng)用程序在數(shù)據(jù)庫中儲存它的任何一個或全部業(yè)務(wù)邏輯,那么有可能它就是被我稱作業(yè)務(wù)規(guī)則鏈接的一個候選者。這種方法允許存儲過程在數(shù)據(jù)庫中依次運行,并且讓您能夠在需要的時候打開或終止這些業(yè)務(wù)規(guī)則。

【編輯推薦】

  1. SQL Server查詢速度緩慢解決辦法
  2. SQL Server視圖管理中需要遵守的四個限制條件
  3. 淺析SQL Server三大算法的I/O成本
責(zé)任編輯:楊鵬飛 來源: onegreen.net
相關(guān)推薦

2011-03-29 15:42:08

SQL Server鏈接

2010-06-30 14:45:07

SQL Server業(yè)

2011-03-29 09:40:31

SQL Server數(shù)據(jù)庫鏈接

2010-11-11 14:05:17

SQL Server排

2010-11-11 14:14:52

SQL Server排

2010-11-09 17:04:20

SQL Server死

2009-04-10 09:22:48

SQL Server并發(fā)測試

2011-08-23 16:45:52

JSP鏈接SQL Se

2010-08-23 08:43:49

SQL ServerMySQL

2015-07-22 17:27:41

SQL SERVER 鏈接

2022-11-04 08:34:27

Oracle數(shù)據(jù)庫

2010-07-05 17:55:26

SQL Server更

2010-09-13 14:05:09

sql server外

2010-10-22 10:16:04

SQL Server驗

2010-10-19 14:11:20

SQL SERVER恢

2013-02-25 10:33:36

2010-07-21 10:36:18

SQL Server

2010-11-10 15:23:55

SQL SERVER

2010-09-02 11:20:47

SQL刪除

2013-04-16 09:35:52

數(shù)據(jù)挖掘
點贊
收藏

51CTO技術(shù)棧公眾號