c# - 在 SQL Server 中将记录的状态设置为 false 之前检查记录的子记录
问题描述
我的 SQL Server 数据库中有一个包含一些关系表的应用程序。
在应用程序中,每当用户删除和记录时,我都不会从数据库中删除它,而是将“状态”(表列)设为“假”。
例如:用户将从中删除一条记录tblAccounts
,记录有一个“状态”列,可以是真/假。删除操作记录设置为 false。
现在的问题是这个帐户可能会在其他交易中被引用。如果它在其他表中使用,那么它不应该允许用户删除(使其为假)。
如果我允许用户从表中物理删除记录,它将引发外键错误,但在这种情况下(使其为假)我如何检查子行而不删除并提示用户。
我可以通过对每个表的选择查询来做到这一点,但这会减慢我的应用程序的速度。
有没有其他方法/想法来实现它?
解决方案
您可以使用外键来执行此操作,这里的技巧是在 tblAccounts 中将两个列(AccountID 和 Status)设为主要列。然后在事务表中,您创建一个外键(AccountID 和 Status),并在 UPDATE/Delete 时使用级联。这意味着,如果您从 tblAccounts 更改/删除帐户 ID 或其状态,这些更改也将应用于所有外键。
这是一个例子:
CREATE TABLE tblAccounts(
ID INT,
AccountID INT NOT NULL,
[Status] BIT NOT NULL
)
ALTER TABLE tblAccounts
ADD PRIMARY KEY (AccountID, [Status])
CREATE TABLE tblTransactions(
[ID] INT,
[TransID] INT NOT NULL PRIMARY KEY,
[AcctID] INT NOT NULL,
[Status] BIT NOT NULL
)
ALTER TABLE tblTransactions
ADD FOREIGN KEY (AcctID,[Status]) REFERENCES tblAccounts(AccountID, [Status])
ON UPDATE CASCADE
ON DELETE CASCADE
INSERT INTO tblAccounts (ID, AccountID, [Status])
VALUES
(1,1000,1),
(2,1100,1),
(3,1200,1),
(4,1300,1)
INSERT INTO tblTransactions(ID, TransID, AcctID,[Status])
VALUES
(1,5000,1000,1),
(2,3258,1300,1),
(3,5852,1000,1),
(4,9631,1100,1),
(5,1870,1200,1)
tblAccounts
| ID | AccountID | Status |
|----|-----------|--------|
| 1 | 1000 | true |
| 2 | 1100 | true |
| 3 | 1200 | true |
| 4 | 1300 | true |
tblTransactions
| ID | TransID | AcctID | Status |
|----|---------|--------|--------|
| 1 | 5000 | 1000 | true |
| 2 | 3258 | 1300 | true |
| 3 | 5852 | 1000 | true |
| 4 | 9631 | 1100 | true |
| 5 | 1870 | 1200 | true |
让我们将 AccountID 1100 的状态更改为 false
UPDATE tblAccounts
SET
[Status] = 0
WHERE
AccountID = 1100
检查 tblAccount
| ID | AccountID | Status |
|----|-----------|--------|
| 1 | 1000 | true |
| 2 | 1100 | false|
| 3 | 1200 | true |
| 4 | 1300 | true |
检查 tblTransactions
| ID | TransID | AcctID | Status |
|----|---------|--------|--------|
| 1 | 5000 | 1000 | true |
| 2 | 3258 | 1300 | true |
| 3 | 5852 | 1000 | true |
| 4 | 9631 | 1100 | false|
| 5 | 1870 | 1200 | true |