无法理解Trigger语句

时间:2009-09-30 16:40:13

标签: sql triggers

任何人都可以解释下面的触发代码吗?请注意上面的代码是由我的一个同伴写的,我无法理解它。

我无法理解。

如果还有其他方法可以完成同样的任务,请告诉我。

CREATE trigger [dbo].[trg_InsertInBookIssuedDetails]
on [dbo].[BOOKISSUEDDETAILS]
for insert
as 
begin

  begin tran

  update nur 
  set nur.NumberOfBooksIssued = nur.NumberOfBooksIssued+1 
  FROM NEWMEMBER nur
  INNER JOIN INSERTED i
  ON i.IssuedTo = nur.MEMBERName

  if exists(
    select 1 
    from LIBRARYBOOKDETAILS lbd
    INNER JOIN INSERTED i
    ON i.BookID = lbd.BookID
    WHERE lbd.Inventory<=1
  )
  begin
    raiserror('Books UnAvailable Or Cannot Issue More Than 3 Books',16,-1)
    rollback tran   
  end

  else
  begin
    update lbd 
    set lbd.Inventory = lbd.Inventory - 1 
    FROM LIBRARYBOOKDETAILS lbd
    INNER JOIN INSERTED i
    ON lbd.BookID= i.BookID

    commit tran
  end

end

请帮助我理解上面的触发器声明。

提前致谢!

4 个答案:

答案 0 :(得分:0)

当有人在BookIssuedDetails表中插入一行时,它是一个触发器。它没有提到'对于每一行'或类似的东西,所以我认为它在插入发生了很多行之后执行一次(可能只包括一行。讨论{{1因为语句没有为/插入行。

更新NewMember表以记录发行的书籍; 'INSERTED'关键字是一个别名,大约相当于'插入BookIssuedDetails表中的记录'。

它还对LibraryBookDetails进行了一些检查,产生了误导性的错误消息(传统的IT) - 它不会检查发给这个库成员的书籍数量。如果LibraryBookDetails指出有可用的书籍,它会更新表格以减少可用书籍的数量。

所有受过良好教育的猜测。

答案 1 :(得分:0)

这是一个快速分解

在您的数据库中,[dbo]拥有一个名为[BOOKISSUEDDETAILS]的表

这个表上有一个触发器,它被[dbo]拥有,名为[trg_InsertInBookIssuedDetails]。只要在表中插入行,就会触发此触发器。

它启动一个事务(简单地说,一个事务是能够以一个单元执行多行 - 全部或全部)

插入行时,表示发布了书籍,因此此触发器会更新NEWMEMBER表中的行。

如果LIBRARYBOOKDETAILS中不存在本书的条目,则回滚事务意味着NEWMEMBER表保持不变。

如果图书存在,则会在图书馆详细信息中将库存盘点减1;

看起来你只粘贴了部分代码。这个opint应该有一个END和一个COMMIT语句。

说了这么多,我必须说SQL很容易阅读和理解 - 如果这是作业,你必须经常做这种类型的东西,你应该通过T-SQL引物来加快速度

答案 2 :(得分:0)

首先是错误的。

INSERTED表是一个包含所有行的伪表(进入BOOKISSUEDETAILS

它启动一个事务,因为它会做两件事:增加发给成员的书籍数量(我认为当INSERTED包含多行时这是错误的,因为它会多次更新 - 不确定这是否可靠并减少书的库存。它首先检查架子上是否有一本书有2个或更多副本(我认为这是一个错误),因为如果库存中有1本或更少的书籍会引发错误。

无论如何,对于图书馆系统来说,这不是一个真实的实现,因为每本书都是独一无二的,你的库存总是1或0,即使你有一本书的多个副本,你需要知道谁有一本书

答案 3 :(得分:0)

触发器用于维护数据完整性。是的,同样的事情可以在存储过程中完成,甚至可以通过(颤抖)动态sql完成。但是,通过将代码放在触发器中,无论数据如何进入数据库,都可以确保遵循规则。由于在这种情况下您会影响可用于检出的书籍库存,因此触发器是最佳位置。

在我看来,触发器是将在此实例中向此人发放的图书数量添加到另一个表格中的正在运行的总计中。

然后检查书籍是否在库存中,以及它们是否不回滚整个交易。 (我个人先做检查)。如果它们在库存中,则将库存减少一,因为该书已经签出。

您将看到的一件事是触发器引用了一个名为INSERTED的表,您在数据库结构中看不到该表。这个(以及一个名为DELETED的simliar表)是一个仅在触发器中可用的数据表。它包含刚刚插入的数据。

每插入一个批次(或根据触发器更新或删除)触发一次触发。这意味着如果插入1个rrecord,插入的表将有一个记录,如果批量插入10,000个记录,则插入的表将有10,000个记录。在设计触发器时要牢记这一点很重要。

你的设计似乎有些缺陷。您永远不应该使用成员名称加入,因为人们没有唯一的名称。您不希望第一个John Smith的记录与第二个John Smith的记录混合在一起。名称应始终具有用于确保唯一性的代理ID。