如果行在另一个 table 中被引用,则防止软删除

prevent soft delete if row is referenced in another table

我有两个 tables,tableA 和 tableB。它们通过 ID 上的外键连接(ATableID、BTableID)。 TableB 有一个允许对行进行归档的存储过程,其中有 2 列名为 Available_Days 和 Available_Night。在表A中 还有列 Available_Days 和 Available_Night,它们通过左连接连接到 tableB。如果表A中的那些列中有数据,则表B中的行一定无法归档。

这是当前的存储过程,我需要帮助来实现上面解释的条件。

@BTableID VARCHAR(500) = '',
@UserArchived INT = 0

AS

DECLARE @Local BTableID VARCHAR(500)
DECLARE @LocalUserArchived INT
DECLARE @LocalSql NVARCHAR(500)

set @Local BTableID = @BTableID;
set @LocalUserArchived = @UserArchived;


set @LocalSql = 'UPDATE tableB
SET DateArchived = GETDATE(),
UserArchived = '+CAST(@UserArchived as NVARCHAR)+'
WHERE BTableID  IN ('+@ BTableID +')'

如果当前方向不明智,我也欢迎任何建议。 对于完整的上下文,此存储过程将在 php Laravel 框架中使用,在该框架中用户将能够删除行(TableB),除非该行信息在其他地方(TableA)被引用,在这种情况下, 他们将被提示更新另一个 table ,然后再尝试删除。

再一次,期望的结果是防止 archiving/soft 删除(防止设置 DateArchived = GETDATE())如果某行的信息在另一个 table.

中被引用

更新: 我做了两个可能的调整(目前无法测试它们,因为我目前无法访问数据库。)

set @LocalSql = 'UPDATE BTable
SET DateArchived = GETDATE(),
UserArchived = '+CAST(@UserArchived as NVARCHAR)+'
WHERE BTableID IN ('+@BTableID+')
WHERE NOT EXISTS (
SELECT FROM ATable at
WHERE tp.ATable_FK = tp.BTableID)'

set @LocalSql = 'UPDATE tableB
SET DateArchived = GETDATE(),
UserArchived = '+CAST(@UserArchived as NVARCHAR)+'
WHERE tableBID IN ('+@tableBID+')
LEFT JOIN tableA cm ON cm.tableAID = tp.tableBID
WHERE cm.tableAID IS NULL’

我目前无法对它们进行测试,但会更新此 post 以告知您是否完成了这项工作。如果您有任何改进建议,请发表评论或回答。 :)

解决方案: 我想出了一个非常简单的解决方案来解决我的问题。我完全忘记了 archive/soft 删除存储过程,并为 table A 和 table B 创建了两个存储过程,它们从 table 中选择一条记录。即:

@TableAIB int
    
    AS 
    
    SELECT
    TableBID,
    TableBDescription,
    FROM TableB
    WHERE TableBID = @TableBID
    
    RETURN @@ERRO

GO


@TableAID int

AS 

SELECT
TableAID,
TabelADescritption
FROM TableA
WHERE TableAID = @TableAID

RETURN @@ERROR

GO

这两个 table 通过外键连接(在 tableAID 和 tableBID 上)。

然后在控制器中我这样做了:

public function archive(int $id)
{

    $tableA = tableA::find($id);
    $tableB = tableB::find($id);

    if ($tableA->TableAID == $tableB->TableBID){
        return redirect()->route(‘myPage.index')
            ->with('warning', ’This can not be archived, it is being used in another row. ');
    }
}

这实际上是说,如果两个存储过程的 ID 匹配,则重定向到带有警告的索引页。