gpt4 book ai didi

sql - 检查 View 中约束的替代方法

转载 作者:行者123 更新时间:2023-12-02 22:29:00 25 4
gpt4 key购买 nike

所以我有两个表:

Requests
--------
Id
RequestSchemeId
ReceivedByUserId

ForwardedRequests
-----------------
Id
RequestId (FK to Id column of Requests Table)
ForwardedToUserId

和一个 View

ForwardedRequestsInRequestSchemes
---------------------------------
Requests.RequestSchemeId
Requests.ReceivedByUserId
ForwardedRequests.ForwardedToUserId

在 View 中向 Requests.ReceivedByUserId != ForwardedRequests.ForwardedToUserId 添加约束等效的标准/推荐方法是什么?

我知道 View 中不允许检查约束。使用 SQL Server 2008。

编辑:

这是 this question 的后续问题.

业务规则:

  1. 同一请求可以转发给多个用户。因此,ForwardedRequests 表中存在 Id 列。

  2. 对于特定的 RequestScheme,用户只能接收一个请求。因此,我在 Requests 表中为 RequestSchemeId+ReceivedByUserId 创建了一个 UniqueKey 约束。

  3. 仅当转发的用户在相同方案下尚未有来自任何其他用户的转发请求时,才能将请求转发给其他用户。正如马丁在 linked question 中建议的那样,我从两个表创建了一个 View ,并在 Requests.RequestSchemeId+ForwardedRequests.ForwardedToUserId 上添加了唯一约束。

  4. 此问题涉及的业务规则是请求的接收者不能将其转发给自己。

最佳答案

我可以想出几种让 SQL Server 为您强制执行此操作的方法。尽管都很有兴趣看到其他方法,但两者都非常老套。

1) 您可以向索引 View ForwardedRequestsInRequestSchemes 添加一个附加列 1/(ForwardedToUserId - ReceivedByUserId) AS FailIfSame,这会引发 除以零错误 如果两个值相同。但这确实意味着您最终会在索引 View 中存储冗余列。

2) 您可以创建一个新 View ,该 View 返回交叉连接到两行表上的任何此类行,然后在该 View 上定义唯一约束。该 View 将始终为空。

CREATE TABLE dbo.TwoRows(C INT) INSERT INTO dbo.TwoRows VALUES(1),(1)

GO

CREATE VIEW dbo.FailIfForwardedUserEqualToReceivedByUser
WITH SCHEMABINDING
AS
SELECT 1 AS C
FROM dbo.ForwardedRequests FR
INNER JOIN dbo.Requests R
ON R.Id = FR.RequestId AND R.ReceivedByUserId = FR.ForwardedToUserId
CROSS JOIN dbo.TwoRows

GO

CREATE UNIQUE CLUSTERED INDEX ix ON
dbo.FailIfForwardedUserEqualToReceivedByUser(C)

关于sql - 检查 View 中约束的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9751115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com