微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如果在另一个表中引用了行,则防止软删除

我有两个表tableA和tableB。它们通过其ID(ATableID,BTableID)上的外键连接。 TableB具有一个存储过程,该存储过程允许对行进行存档。它具有2个列,分别称为Available_Days和Available_Night。在表A中 还存在Available_Days和Available_Night列,它们通过左联接与tableB联接。如果TableA的这些列中有数据,则必须不能在TableB中存档该行。

这是当前的存储过程,我需要帮助来实现上述标准。

@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)被引用,在这种情况下,将提示他们更新行。其他表,然后再次尝试删除

再一次,期望的结果是如果在另一表中引用了该行的信息,则防止该行的归档/软删除(防止设置DateArchived = GETDATE())。

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

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’

我目前无法对其进行测试,但会更新此信息,让您知道其中一项工作是否完成。如果您对改进有任何建议,请留下评论或答案。 :)

解决方法

解决方案: 我想出了一个非常简单的解决方案来解决我的问题。我忘记了所有有关归档/软删除存储过程的信息,并为表A和表B创建了两个存储过程,它们从表中选择了一条记录。即:

@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

这两个两个表通过外键(在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匹配,则显示警告并重定向到索引页。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。