我有一个sql server地址表。
用户可以放置StreetId或NeighborhoodId或CityID,但不能放置这三个字段中的2个。我可以通过ui限制用户,但我更愿意这样做在db级别强制执行此规则。
有办法做到这一点吗?
答案 0 :(得分:0)
您最好在业务逻辑层中执行此操作。
UI
^
业务逻辑
^
数据访问
这样的所有业务规则都可以在一个单独的业务逻辑层(BLL)中定义,如果不遵守规则,UI将调用并从BLL接收消息(可能会形成警告,信息或错误)至。如果对于当前用例遵守BLL中定义的所有规则,则BLL将调用将调用数据库的数据访问层(DAL),例如,数据访问层。使用已定义的业务规则使用BLL授权的参数的存储过程。
希望很清楚。
答案 1 :(得分:0)
这是我第一次遇到CHECK
约束。但我认为下面的代码可能会有所帮助。
假设我们有一张表BaseTable
CREATE TABLE dbo.BaseTable
(
StreetId VARCHAR(50),
NeighborhoodId VARCHAR(50),
CityID VARCHAR(50)
)
让我们添加一个CHECK
约束:
ALTER TABLE dbo.BaseTable
ADD CONSTRAINT CheckOnlyOneColumnValue
CHECK (
(
CASE WHEN StreetId IS NOT NULL THEN 1 ELSE 0 END
+ CASE WHEN NeighborhoodId IS NOT NULL THEN 1 ELSE 0 END
+ CASE WHEN CityID IS NOT NULL THEN 1 ELSE 0 END)
= 1
)
GO
<强>测试强>
这些插入查询可以正常工作:
INSERT INTO dbo.BaseTable(StreetId) VALUES ('StreetId')
INSERT INTO dbo.BaseTable(NeighborhoodId) VALUES ('NeighborhoodId')
INSERT INTO dbo.BaseTable(CityID) VALUES ('CityID')
但这些查询将失败:
INSERT INTO dbo.BaseTable(StreetId, NeighborhoodId)
VALUES ('StreetId', 'NeighborhoodId')
INSERT INTO dbo.BaseTable(StreetId, NeighborhoodId, CityID)
VALUES ('StreetId', 'NeighborhoodId', 'CityID')
UPDATE dbo.BaseTable SET NeighborhoodId = 'NeighborhoodId'
WHERE StreetId = 'StreetId'