作者:吴小彬x | 来源:互联网 | 2024-11-03 16:21
在数据表中,我需要触发一个操作来刷新特定列的数据。例如,对于以下表格:|ID|Name|IsDeleted||----|-------|-----------||1|test|True||2|test2|False|我希望在点击“更新”按钮时,能够仅刷新选定行的“IsDeleted”列。这将有助于确保数据的实时性和准确性。
所以我有这张桌子:
ID Name IsDeleted
1 test True
2 test2 False
我目前有以下触发器:
CREATE TRIGGER [dbo].[Trigger_test_IsDeleted]
ON [dbo].[test]
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.test
SET IsDeleted = 1
WHERE ID = 1;
END
当我在索引视图中的一行上单击删除按钮时,我需要此触发器启动并将该确切行上的IsDeleted设置为1(或True)。但是,使用上述触发器执行此操作显然只会删除ID = 1的行源。如果我省略WHERE语句,它将所有行的IsDeleted设置为true。
我需要触发器来动态确定按下“删除”的位置,并且只删除该行。
我知道在MySQL中,可以通过在删除触发器中使用以下命令来完成此操作:
SET new.IsDeleted = 1
有没有办法获得与“新”相同的效果。在SQL Server触发器中?
并且由于我们处于主题上,因此我想实现相同的目的,但是要更改控制器中的当前代码。这是现在的样子:
//POST - Delete
[HttpPost,actionName("Delete")]
[ValidateAntiForgeryToken]
public async Task Delete(int? id)
{
var test = await _db.Test.FindAsync(id);
if (test== null)
{
return View();
}
_db.Test.Remove(test);
await _db.SaveChangesAsync();
return RedirectToaction(nameof(Index));
}
此代码将对数据库执行普通的删除操作。我想更改它以将“ IsDeleted”设置为1,而不是删除记录。
如果您要更新标志而不是删除(有些人称其为SOFT DELETE
),则应按以下方式更新触发器:
CREATE TRIGGER [dbo].[Trigger_test_IsDeleted]
ON [dbo].[test]
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.test
SET deleted.IsDeleted = 1
WHERE ID = deleted.ID; --<-- This is the key point
END
,
您需要检查“已删除”虚拟表,并相应地执行更新。 EG:
create table test(id int primary key,IsDeleted bit default 0)
go
CREATE OR ALTER TRIGGER [dbo].[Trigger_test_IsDeleted]
ON [dbo].[test]
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.test
SET IsDeleted = 1
WHERE ID in (select id from deleted);
END
go
insert into test(id,IsDeleted) values (1,0),(2,(3,0)
delete from test where id = 2
select * from test
输出
id IsDeleted
----------- ---------
1 0
2 1
3 0
(3 rows affected)