2017-06-28 42 views
0

我目前正在使用数据库类,并且需要在数据库中包含一些触发器。 我的团队正在制作库数据库,并且需要在属性DaysOut的值为“90”​​时进行触发。称为费用的另一个属性将增加到“10”。这是一个可能的触发器吗? 我写了一些语法,并将其发送给我的教授,但给了我很少的建议。下面是语法:创建触发器以更新特定值的表

CREATE TRIGGER Late_Fee 
AFTER UPDATE OF DaysOut ON BOOKS 
WHEN DaysOut = 90 UPDATE CUSTOMERS 
SET Fees = Fees + 10 
WHERE Cust_ID = Cust_ID; 

任何帮助,将不胜感激!

+0

您正在使用什么数据库管理系统?我讨厌大学数据库课程如何脱离ANSI-SQL标准而不考虑实际的DBMS,因为在这种情况下没有实际的答案。这个问题的真正答案应该依赖于正在使用的DBMS,尽管有很多可能支持触发器创建的类似语法。 –

+0

我们确实还没有建立实际的DBMS。本书在不同章节引用了Oracle,然后引用了SQL-99。我假设它是Oracle,但这是我的第一个数据库课程,我不完全确定。尽管谢谢你的回应! –

+0

这很可能是ANSI-SQL 99.本书可能提到Oracle,因为它历来是一种流行的DBMS。然而,根据我的经验,这些类型的书很少展示来自实际DBMS系统的例子(同样,这也是我彻底讨厌我在大学里学习的数据库课程的原因)。 –

回答

0

正如我在我的评论中所述,有用的答案取决于使用的DBMS。由于这似乎是针对大学课程的,因此您可能没有使用DBMS,答案可能基于ANSI-SQL标准,而不是实际的SQL实现。这就是为什么我讨厌大多数大学数据库课程的原因,因为教授通常会写出近20年前写的书,而不是实际经验(我经常发现很多教此类课程的教授没有任何实际的真实数据库经验)。我会问你的教授,答案是什么DBMS的目的。如果教授不知道,说脱离您书中的例子,或者说要使用ANSI-SQL标准,那么这是一个假设性问题,我认为没有一个技术上合适的答案(因为即使有是一个正确的答案,你必须改变它以适应你正在使用的DBMS)。以下是在真实DBMS系统中如何实现这种触发器的几个例子。

我的SQL

DELIMITER $$ 

CREATE 
TRIGGER tr_Late_Fee AFTER UPDATE 
ON BOOKS 
FOR EACH ROW BEGIN 

    IF NEW.DaysOut = 90 THEN 
     UPDATE CUSTOMERS 
     SET Fees = Fees + 10 
     WHERE Cust_ID = NEW.Cust_ID; 
    END IF; 

END$$ 

DELIMITER ; 

资源:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

https://www.sitepoint.com/how-to-create-mysql-triggers/

+0

MySQL的版本看起来很像书中的例子,我要给我的教授发电子邮件,看看这是否可以接受。非常感谢! –

+0

如果'inserted'中有多行? – hatchet

+0

@hatchet你对这种情况是正确的,我为SQL-Server快速编写的示例代码并不能处理这种特定情况。在这种情况下,提供的代码将无法正常运行(您实际上会得到一个SQL异常)。处理这种情况的一种方法是创建一个游标,我相信这远远超出了OP的要求。有很多关于如何在SQL Server中编写触发器的示例。目前我没有太多时间来完善和优化,所以如果它困扰人们,我可能会排除SQL Server示例。 –

相关问题