删除审核表SQL Server数据库的触发器

问题描述

我将Mircosoft SSMS用于我的sql服务器,并将ASP.NET CORE用于我的网站。

以下查询是我的删除触发器。但是,每当我尝试删除网站中的某些内容时,都会弹出此错误:“ InvalidCastException:无法将类型为“ System.Guid”的对象转换为类型为“ system.int32”。”

删除触发器:

create trigger Branch_Delete
on Branch
after delete 
as
begin
set nocount on;
declare @BranchID uniqueidentifier
select @BranchID = deleted.BranchID
from deleted
insert into AuditLog(TableName,ModifiedBy,AuditDateTime,ID,Auditaction)
Values
('Branch',SUSER_SNAME(),GETDATE(),@BranchID,'Delete')
select BranchID from Deleted
end

型号:

namespace Test.Models
{
    public class BranchModel
    {
        [Key]
        [display(Name = "Branch ID")]
        public Guid BranchID { get; set; }

        [required(ErrorMessage = "Please Enter The Branch Name ..")]
        [display(Name = "Branch Name")]
        public string BranchName { get; set; }

        [required(ErrorMessage = "Please Enter The Branch Address ..")]
        [display(Name = "Branch Address")]
        public string BranchAddress { get; set; }

    }
}

控制器(用于删除功能):

 public async Task<IActionResult> DeleteBranch(Guid? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var branchModel = await _context.Branch
                .FirstOrDefaultAsync(m => m.BranchID == id);
            if (branchModel == null)
            {
                return NotFound();
            }

            return View(branchModel);
        }

        // POST: BranchModels/Delete/5
        [HttpPost,ActionName("DeleteBranch")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmedBranch(Guid id)
        {
            var branchModel = await _context.Branch.FindAsync(id);
            _context.Branch.Remove(branchModel);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Branch));
        }

解决方法

只有删除了1行后,您的触发器才会处理。您需要更改触发器代码以使其能够处理多个行删除。像...

CREATE TRIGGER Branch_Delete
ON Branch
AFTER DELETE
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO AuditLog
        (
            TableName,ModifiedBy,AuditDateTime,ID,AuditAction
        )
    SELECT
           'Branch',SUSER_SNAME(),GETDATE(),BranchID,'Delete'
    FROM    Deleted;
END;

还要确保表[AuditLog]中[ID]列的数据类型与[Branch]表中[BranchID]的数据类型相匹配。