2011-06-09 78 views
0

我在數據庫表中有一列「SelectedCustomers」,其中包含管理員正在編輯的選定客戶。例如,它可以包含這個字符串'111,222,333',這意味着在當前時間管理者被選擇用這些ID 111,222和333來編輯顧客。如果另一個經理試圖編輯已經由第一經理編輯的顧客,第二經理應該得到一個錯誤,阻止他編輯這個客戶。這個檢查應該保存在sql中。並且讓我們說檢查商店程序獲得一個nvarchard「CheckCustomers」的值:'234,222,341'。並且由於第二位經理正在嘗試編輯已由第一位經理選擇編輯的ID爲222的客戶。第二位經理將收到一條錯誤消息。 SQL查詢應該如何? (我已經有一個「拆分」功能)。找到一個字符串,它拆分字符串

SELECT * FROM dbo.test WHERE dbo.Split(SelectedCustomers)IN (CheckCustomers) 
+1

我認爲你應該創建一個'SelectedCustomers' **表**而不是一個在CustomerId上使用唯一約束/主鍵來保存ManagerId和CustomerId的列。然後,如果CustomerId存在或不存在,那麼檢查針對該表的查詢應該是微不足道的。 – 2011-06-09 09:18:24

+2

正確的方法是創建一個LockedCustomers表,每個鎖定的客戶有一個條目。你在做什麼是不好的做法。 – 2011-06-09 09:19:15

回答

1

爲什麼不簡單地在客戶的表中添加另一列'IsBeingEdited'?然後,您可以簡單地說:

SELECT id FROM customer WHERE id IN (CheckCustomers) AND IsBeingEdited = 1; 

的列表顯示了客戶ID的當前編輯,右(並輕鬆多變像其他的名字列)?所以你也可以向第二位經理展示。

+0

看看我的例子;由於客戶ID 222,第二經理不能編輯所有其他客戶。如果我們發現一個客戶已經編輯就足夠了,以防止第二個管理員編輯他所有的所有選定的客戶 – Joe 2011-06-09 09:33:57

+0

然後上面的查詢也足夠了,您只需檢查返回的行數是否大於0 。如果是,那麼至少有一名選定的顧客正在被另一位經理編輯。 – LeleDumbo 2011-06-09 15:53:25

0

你可以用CROSS APPLY來做到這一點。

IF EXISTS (
    SELECT S.CustomerID 
    FROM dbo.test T 
    CROSS APPLY dbo.Split(T.SelectedCustomers) S 
    CROSS APPLY dbo.Split(T.CheckCustomers) C 
    WHERE S.CustomerID = C.CustomerID 
) 
BEGIN 
    RAISERROR('Customer is locked by another user', 16, 0) 
END 
0

我建議改變這個設計。任何時候做分裂字符串以獲取字符串內「隱藏」字段都是必要的,這違反了使用關係數據庫的基本原則之一,即一行中的每個字段應存儲單個值。這可以工作嗎?大概。這樣做是個好主意嗎?不是在我看來。

正如其他人指出的,有幾種方法來改變設計。可以將一列添加到客戶表中以指示客戶被鎖定。可以使用包含CustomerID和經理ID的單獨表格(例如CustomerLocked) - 這將允許添加附加信息,例如客戶被鎖定的時間等,如果有人鎖定客戶,然後離開他們的辦公桌。

我相信任何這些變化都能滿足要求。例如,假設一個LockedCustomer表創建:

Table LockedCustomer 
    CustomerID NUMBER PRIMARY KEY 
    ManagerID  VARCHAR 
    AddDate  DATE 

,讓我們說,一個經理已經鎖定客戶的111,222,333;因此在LockedCustomer表中的以下行會存在:

CustomerID  ManagerID 
111    A 
222    A 
333    A 

現在走來經理B,誰願意來鎖定客戶222的應用程序管理器B的使用嘗試插入新行到LockedCustomer表,如下:

INSERT INTO LockedCustomer (CustomerID, ManagerID) 
    VALUES (222, 'B'); 

這種說法應該失敗,因爲客戶ID 222已經在表中存在,並且CustomerID列是LockedCustomer主鍵。這是有道理的,因爲我們只想在任何時間點在LockedCustomer表中最多一次存在給定的CustomerID。應用程序管理器B正在使用可以檢測到INSERT由於主鍵約束違規而失敗,並且會理解這意味着此時客戶無法被鎖定。通過重新查詢LockedCustomer表額外的數據,如:

SELECT * 
    FROM LockedCustomer 
    WHERE CustomerID = 222 

應用程序可以顯示一個對話框,以管理者B可能看起來像

The customer you wished to edit (222) is currently in use 
by Manager A since 03-Jun-2011 2:17 PM. Would you like to 
    A) Wait 
    B) Send an email to Manager A 
    C) Take a long vacation 
    D) Violate company policy regarding alcohol consumption 
    during working hours 
Please select one of the above options? 

分享和享受。

+0

我也想提出這個建議,但重組數據庫對於OP來說可能是不可行的,所以我看看另一個解決方案。此外,每位客戶一次只能由一位經理進行編輯。所以,它比m-n關係更多1-n。 – LeleDumbo 2011-06-09 15:56:34

+0

@LeleDumbo:你的觀點很好。請注意,通過設置LockedCustomer表的方式,一次只能有一個人鎖定客戶(即CustomerID是LockedCustomer上的主鍵)。謝謝。 – 2011-06-10 16:12:45