【问题标题】:Trigger Not Running Check Whether it is correct or not? [closed]Trigger Not Running 检查是否正确? [关闭]
【发布时间】:2021-07-02 22:47:50
【问题描述】:

这是我的触发器,它在 stackoverflow.com 的帮助下完美运行。由于阻塞,我编辑了我的问题。

USE [Online Medical Store]
GO
/****** Object:  Trigger [dbo].[tr_issueBook]    Script Date: 4/7/2021 11:33:13 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Trigger [dbo].[tr_issueBook] 
on [dbo].[IssueBooks] 
for insert  
AS 
Begin 
    Declare @IsbnNumber varchar 

    Select  @IsbnNumber = ISBN_Number from inserted
 
    update searchBooks set
        tbl_numberOfCopies =tbl_numberOfCopies - 1
    where tbl_IsbnBooks = @IsbnNumber
End

【问题讨论】:

  • 你怎么知道它没有运行?您犯了经典的触发器 101 错误:假设 Inserted 伪表只有一行,而实际上它可以有 0-N 并且必须相应地处理。
  • Declare @IsbnNumber varchar - 例如,您没有声明 varchar 的大小应该是 varchar(10)
  • @DaleK 我没明白你的意思吗?
  • @Squirrel 我声明尺寸的地方
  • 触发触发器时,可能会插入 1 或 10 行。所以inserted 可能包含多于 1 行。您的触发器查询没有处理这个问题。

标签: sql sql-server tsql triggers


【解决方案1】:

您的触发器查询存在两个问题

问题 1. 你没有声明变量的大小

Declare @IsbnNumber varchar 

不声明大小,默认为1。所以分配给它的任何值都将被截断

问题 2。您假设 inserted 仅包含 1 行。根据插入语句,哪个事实可能包含0N

所以你的声明没有处理这个

Select  @IsbnNumber = ISBN_Number from inserted

你的触发器应该很简单

update b 
set    tbl_numberOfCopies = tbl_numberOfCopies - 1
from   inserted i
       inner join searchBooks b on b.tbl_IsbnBooks = i.ISBN_Number 

您根本不需要在触发器查询中 declare 变量。


要回答您关于varchar 大小的问题,您应该将其定义为

Declare @IsbnNumber varchar(10)

假设ISBNNumber的大小为10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2016-08-26
    • 2018-04-21
    相关资源
    最近更新 更多