欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL Server約束增強的兩點建議

 更新時間:2009年05月07日 15:58:16   作者:  
我們可以在CHECK的約束條件中加入任何邏輯表達式,而目前所有外鍵只能用來驗證一個或多個列的值是否相等。
在許多情況下,對外鍵使用更復(fù)雜的邏輯表達式是非常有用的。 此外,在某些情況下能夠在索引視圖創(chuàng)建約束也將非常實用。 我將舉例說明,同時我希望針對此文的投票鏈接會盡快加上。
當(dāng)外鍵中需要更為復(fù)雜的邏輯表達式時
考慮下面的簡單常識: 您的設(shè)備的最大電流不能超過您插入到它的電路的最大電流。 假設(shè)下面的表存儲電路和設(shè)備數(shù)據(jù):
復(fù)制代碼 代碼如下:

CREATE TABLE Data.Curcuits(CurcuitID INT NOT NULL
CONSTRAINT PK_Curcuits PRIMARY KEY,
MaximumCurrent INT NOT NULL,
Description VARCHAR(100) NOT NULL);
GO
INSERT INTO Data.Curcuits(CurcuitID,
MaximumCurrent,
Description)
SELECT 1, 25, 'Deck and Garage';
GO
CREATE TABLE Data.Devices(DeviceID INT NOT NULL
CONSTRAINT PK_Devices PRIMARY KEY,
CurcuitID INT NULL,
MaximumCurrent INT NOT NULL,
Description VARCHAR(100) NOT NULL,
CONSTRAINT FK_Devices_Curcuits FOREIGN KEY(CurcuitID)
REFERENCES Data.Curcuits(CurcuitID)
);
GO

It would be very convenient to issue a simple command and implement this business rule:
一個非常簡便的命令就可能實現(xiàn)這個業(yè)務(wù)規(guī)則:
ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits
FOREIGN KEY(CurcuitID, MaximumCurrent)
REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent)
MATCH ON((Data.Devices.CurcuitID = Data.Curcuits.CurcuitID) AND
(Data.Devices.MaximumCurrent <= Data.Curcuits.MaximumCurrent));
However, it is not supported, so I need to use a workaround, one more column and three constraints instead of one, as follows:
然而,該語句并不被支持,所以必須采用其他辦法——多增加一列約束,使用3個而不是1個約束,如下所示:
ALTER TABLE Data.Curcuits
ADD CONSTRAINT UNQ_Curcuits UNIQUE(CurcuitID, MaximumCurrent);
GO
ALTER TABLE Data.Devices ADD CurcuitMaximumCurrent INT NULL;
GO
ALTER TABLE Data.Devices DROP CONSTRAINT FK_Devices_Curcuits;
GO
ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits
FOREIGN KEY(CurcuitID, CurcuitMaximumCurrent)
REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent)
ON UPDATE CASCADE;
GO
ALTER TABLE Data.Devices
ADD CONSTRAINT CHK_Devices_SufficientCurcuitMaximumCurrent
CHECK(CurcuitMaximumCurrent >= MaximumCurrent);
GO
You can verify that the constraints work:
你可以驗證該約束有效:
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 1, 1, 50, 25, 'Electric car charger'
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CHK_Devices_SufficientCurcuitMaximumCurrent". The conflict occurred in database "Test", table "data.Devices".
The statement has been terminated.
INSERT 語句和CHECK約束"CHK_Devices_SufficientCurcuitMaximumCurrent"發(fā)生沖突。 該沖突發(fā)生在數(shù)據(jù)庫"Test"的"data.Devices"表。
該語句被終止執(zhí)行。
As you have seen, the implementation of a very simple and very common business rule is quite involved, because such business rules are not directly supported by the database engine.
可以看出,一個非常簡單而普通的業(yè)務(wù)規(guī)則實現(xiàn)起來也相當(dāng)繁雜,因為數(shù)據(jù)庫引擎并不直接支持這種業(yè)務(wù)規(guī)則。
When you want to create constraints on indexed views
在索引視圖上創(chuàng)建約束
Even when your database guarantees that “the maximum current of your device cannot exceed the maximum current of the circuit you plug it into”, it is not good enough. Consider the following sample data:
盡管數(shù)據(jù)庫保證“您的設(shè)備的最大電流不能超過您插入到它的電路的最大電流”,但這還不夠。請看下列示例數(shù)據(jù):
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 2, 1, 15, 25, 'ShopVac';
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 3, 1, 15, 25, 'Miter Saw';
The database structure allows to plug more than one device into a circuit, which is correct, but if you turn both devices on, their combined maximum current exceeds the circuit's maximum current. To enforce this business rule, it would be natural to create an indexed view, so that the database guarantees that the totals are always correct:
數(shù)據(jù)庫中的數(shù)據(jù)表明可以插入一個以上的設(shè)備到電路,這沒有錯,可是當(dāng)所有的設(shè)備都打開時,它們的最大電流之和會超過電路最大電流。為了加強這個業(yè)務(wù)規(guī)則,很自然的會創(chuàng)建一個索引視圖以使數(shù)據(jù)庫保證電流之和總是正確的。
CREATE VIEW Data.TotalMaximumCurrentPerCircuit WITH SCHEMABINDING
AS
SELECT d.CurcuitID,
c.MaximumCurrent AS CircuitMaximumCurrent,
SUM(d.MaximumCurrent) AS TotalMaximumCurrent,
COUNT_BIG(*) AS NumDevices
FROM Data.Devices d JOIN Data.Curcuits c ON d.CurcuitID = c.CurcuitID
GROUP BY d.CurcuitID, c.MaximumCurrent;
GO
CREATE UNIQUE CLUSTERED INDEX Data_TotalMaximumCurrentPerCircuit
ON Data.TotalMaximumCurrentPerCircuit(CurcuitID);
GO
If I could create a check constraint on that indexed view, I would be all set:
如果能在該索引視圖上創(chuàng)建一個約束,我將進行這樣的設(shè)置:
ALTER VIEW Data.TotalMaximumCurrentPerCircuit
ADD CONSTRAINT CHK_TotalMaximumCurrentPerCircuit_ValidCurcuit
CHECK(TotalMaximumCurrent <= CircuitMaximumCurrent)
Instead, I need to use triggers or rather contrived kludges. A built in native support for such quite common business rules would increase the usefulness of SQL Server.
實際上,我必須使用觸發(fā)器或者精心拼湊Check約束來實現(xiàn)。如果數(shù)據(jù)庫內(nèi)置支持這種相當(dāng)普遍的業(yè)務(wù)規(guī)則,那將會增加SQL Server的實用性 。

相關(guān)文章

  • 詳解Sql基礎(chǔ)語法

    詳解Sql基礎(chǔ)語法

    這篇文章主要介紹了詳解Sql基礎(chǔ)語法的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • SQL窗口函數(shù)之取值窗口函數(shù)的使用

    SQL窗口函數(shù)之取值窗口函數(shù)的使用

    取值窗口函數(shù)可以用于返回窗口內(nèi)指定位置的數(shù)據(jù)行,本文就主要介紹了SQL 取值窗口函數(shù)的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2022-04-04
  • Sql注入工具_動力節(jié)點Java學(xué)院整理

    Sql注入工具_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Sql注入工具的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SQLServer 參數(shù)化查詢經(jīng)驗分享

    SQLServer 參數(shù)化查詢經(jīng)驗分享

    本篇文章將介紹參數(shù)化查詢。我將討論如果一個查詢可以被參數(shù)化,那么SQL Server優(yōu)化器怎樣嘗試將其參數(shù)化,以及你可以怎樣建立你自己的參數(shù)化查詢。
    2010-05-05
  • 教你使用SQL語句進行數(shù)據(jù)庫復(fù)雜查詢

    教你使用SQL語句進行數(shù)據(jù)庫復(fù)雜查詢

    這篇文章主要介紹了使用SQL語句進行數(shù)據(jù)庫復(fù)雜查詢,本篇文章結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 淺談為什么#{}可以防止SQL注入

    淺談為什么#{}可以防止SQL注入

    本文主要介紹了淺談為什么#{}可以防止SQL注入,#{} 匹配的是一個占位符,會對一些敏感字符進行過濾,編譯過后會對傳遞的值加上雙引號,因此可以防止 SQL 注入問題,感興趣的可以來了解一下
    2022-05-05
  • 分析SQL語句性能3種方法分享

    分析SQL語句性能3種方法分享

    分析SQL語句性能3種方法分享,需要的朋友可以參考下
    2012-05-05
  • sqlserver2017共享功能目錄路徑不可改的解決方法

    sqlserver2017共享功能目錄路徑不可改的解決方法

    這篇文章主要介紹了sqlserver2017共享功能目錄路徑不可改的解決方法,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Sqlserver 高并發(fā)和大數(shù)據(jù)存儲方案

    Sqlserver 高并發(fā)和大數(shù)據(jù)存儲方案

    本文主要介紹了Sqlserver 高并發(fā)和大數(shù)據(jù)存儲方案。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • sql server2008調(diào)試存儲過程的完整步驟

    sql server2008調(diào)試存儲過程的完整步驟

    這篇文章主要給大家分享介紹了關(guān)于sql server2008調(diào)試存儲過程的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論