我在数据库表中有一个“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)
答案 0 :(得分:1)
为什么不在客户的表中添加另一列'IsBeingEdited'?你可以简单地说:
SELECT id FROM customer WHERE id IN (CheckCustomers) AND IsBeingEdited = 1;
该列表显示当前正在编辑的客户的ID,对(并且可以轻松改为其他列名称)?所以你也可以向第二位经理展示。
答案 1 :(得分: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
答案 2 :(得分:0)
我建议改变这种设计。任何时候都需要执行诸如拆分字符串以获取字符串中的“隐藏”字段之类的内容,这违反了使用关系数据库的基本原则之一,即一行中的每个字段都应存储单个值。这可以使用吗?大概。这样做是个好主意吗?不在我看来。
正如其他人所指出的,有几种方法可以改变设计。可以将一列添加到Customer表以指示客户已被锁定。可以使用包含CustomerID和经理ID的单独表(例如,CustomerLocked) - 这将允许添加附加信息,例如客户被锁定的时间等,如果有人要锁定一个,这可能是有用的。客户,然后离开他们的办公桌。
我相信这些变化中的任何一个都能满足要求。例如,假设创建了一个LockedCustomer表:
Table LockedCustomer
CustomerID NUMBER PRIMARY KEY
ManagerID VARCHAR
AddDate DATE
让我们说经理A锁定了客户111,222和333;因此,在LockedCustomer表中将存在以下行:
CustomerID ManagerID
111 A
222 A
333 A
现在来了经理B,他希望锁定客户222.应用程序管理员B正在尝试将新行插入LockedCustomer表,如下所示:
INSERT INTO LockedCustomer (CustomerID, ManagerID)
VALUES (222, 'B');
此语句应该失败,因为表中已存在CustomerID 222,而CustomerID列是LockedCustomer上的主键。这是有道理的,因为我们只希望给定的CustomerID在任何时间点在LockedCustomer表中最多存在一次。应用程序管理器B正在使用然后可以检测INSERT由于主键约束违规而失败,并且将理解这意味着此时客户无法被锁定。通过重新查询LockedCustomer表以获取其他数据,如:
SELECT *
FROM LockedCustomer
WHERE CustomerID = 222
应用程序可以向Manager 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?
分享并享受。