【问题标题】:Delete Trigger for Audit Table SQL Server Database删除审计表 SQL Server 数据库的触发器
【发布时间】:2020-08-12 14:20:35
【问题描述】:

我将 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));
        }

【问题讨论】:

  • 您能否确认“var branchModel = await _context.Branch .FirstOrDefaultAsync(m => m.BranchID == id);”正在返回一个 BranchModel 类型?
  • 不确定您的 Branch 对象/表是如何定义的,但我猜它被定义为一个 int。由于 GUID 是一个 16 字节的数值,而 int 只有 4,这些不兼容(自动)转换。

标签: c# sql-server asp.net-core triggers ssms


【解决方案1】:

仅当仅删除 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] 的数据类型匹配。

【讨论】:

  • AuditLog.ID 也可以是 UNIQUEIDENTIFIER 和任何其他键类型具有隐式转换的某种类型,例如 nvarchar(100)
猜你喜欢
  • 2016-11-06
  • 2015-09-30
  • 2016-09-18
  • 1970-01-01
  • 2017-04-12
  • 2020-11-07
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多