2009-09-30 71 views
-1

任何人都可以向我解释触发器的下面的代码吗?请注意,上面的代码是由我的一个类队友编写的,我无法理解其中的任何内容。无法理解触发语句

我无法理解它。

此外,如果有任何其他方式来完成相同的任务,请让我知道。

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 

请帮我理解上面的触发语句。

在此先感谢!

+0

您是否试图了解触发器通常会执行什么操作,或者该触发器中的SQL是做什么的? – David 2009-09-30 16:47:33

+0

双间隔SQL是你的问题。 – Welbog 2009-09-30 16:47:56

+0

这个触发器中的SQL是干什么的? – Sheetal 2009-09-30 16:50:03

回答

0

这里是一个快速击穿

在数据库中存在一个名为[BOOKISSUEDDETAILS]由[DBO]

该表拥有的表具有触发器上叫[trg_InsertInBookIssuedDetails]归[DBO]。只要将一行插入表中,该触发器就会触发。

它启动一个事务(简单地说,事务是执行多行作为一个单位的能力 - 全或无)

当行插入它意味着一个书发出后,所以这触发更新NEWMEMBER表中的一行。

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

如果这本书存在,那么它通过1在图书馆的书细节

它看起来像你只粘贴部分代码递减库存盘点。在这个opint中应该有一个END和一个COMMIT语句。尽管如此,我必须说SQL很容易阅读和理解 - 如果这是家庭作业,并且你必须经常做这种类型的东西,那么应该通过T-SQL引擎来达到速度。

0

这是在有人向BookIssuedDetails表中插入一行时激活的触发器。它没有提及'for each row'或任何类似的东西,所以我认为它在一些行插入后执行一次(可能只包括1行)。讨论INSERT INTO BookIssuedDetails SELECT * FROM Somewhere WHERE 1 = 0会发生什么是很有趣的,因为没有行由语句插入/

它更新NewMember表来记录发出的书籍;在“”插入关键字是一个别名大约相当于“插入BookIssuedDetails表中的结果”

它还对LibraryBookDetails进行一些检查,生成一个误导性的错误消息(在IT中是传统的) - 它不检查发给这个图书馆成员的书的数量如果LibraryBookDetails指出有书可用,它会更新表减少吨他可用的特定书籍的编号。

所有受过教育的猜测。

0

开始的时候是很有问题的。

inserted表被插入(进入BOOKISSUEDETAILS)所有行的伪表

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

在任何情况下,对于图书馆系统来说都不是一个现实的实现方式,因为每本书都是独一无二的,即使您有多本书的副本,您的广告资源总是1或0,您需要知道每个人一。

0

触发器用于维护数据完整性。是的,同样的事情可以在存储过程中完成,甚至可以通过(不寒而栗)的动态sql来完成。但是,通过将代码放入触发器中,无论数据如何进入数据库,都要确保遵循规则。因为在这种情况下,您影响可用于检出的图书库存是触发器的最佳选择。

在我看来,它的触发是增加的另一个表在这种情况下发出来的人到正在运行的总书的数量。

然后检查,看看是否书籍是库存,如果他们不回滚整个事务。 (我个人会先做检查)。如果他们在库存中,则将库存减少一个,因为该书已被检出。

一件事,你会看到的是,在触发引用一个名为inserted表,你不要在你的数据库结构看。这个(和一个名为DELETED的simliar表)是一个仅在触发器中可用的数据表。它包含刚插入的数据。

对于插入的每个批次(或根据触发器更新或删除),触发器触发一次。这意味着如果插入1个rrecord,插入的表将会有一条记录,如果在批处理中插入10,000条记录,那么插入的表将包含10,000条记录。在设计触发器时牢记这一点很重要。

您的设计似乎有点不妥。你不应该使用成员名称加入,因为人们没有唯一的名字。你不希望第一个约翰史密斯的记录与第二个约翰史密斯的记录混杂在一起。名称应始终具有用于确保唯一性的代理ID。