首页 > 解决方案 > 在 SQL Server 中将记录的状态设置为 false 之前检查记录的子记录

问题描述

我的 SQL Server 数据库中有一个包含一些关系表的应用程序。

在应用程序中,每当用户删除和记录时,我都不会从数据库中删除它,而是将“状态”(表列)设为“假”。

例如:用户将从中删除一条记录tblAccounts,记录有一个“状态”列,可以是真/假。删除操作记录设置为 false。

现在的问题是这个帐户可能会在其他交易中被引用。如果它在其他表中使用,那么它不应该允许用户删除(使其为假)。

如果我允许用​​户从表中物理删除记录,它将引发外键错误,但在这种情况下(使其为假)我如何检查子行而不删除并提示用户。

我可以通过对每个表的选择查询来做到这一点,但这会减慢我的应用程序的速度。

有没有其他方法/想法来实现它?

标签: c#sqlasp.netsql-server

解决方案


您可以使用外键来执行此操作,这里的技巧是在 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 |

推荐阅读