SQL中的触发器——它会触发什么?
一种与数据库交互的直观方式
SQL已经变得非常流行,是一种普遍接受的数据库语言,用于与关系数据库通信。每个企业都有数据,并需要组织方法或数据管理流程来维护数据。所以重要的是学习和理解SQL以及数据结构如何用于在组织中存储信息。SQL是用来将您的需求传达给数据库的语言。您可以学习这一种语言,只需稍加调整,就可以将其应用于各种数据库平台、应用程序和产品。您可以从数据库中请求特定的信息用SQL编写查询。一个触发是在数据库表的结构发生更改时执行的查询。
SQL中的触发器是什么?
触发器是由DBMS存储和管理的事件驱动的专用过程。触发器是一种特殊形式的存储SQL过程,它在发生插入、删除或更新等事件时启动一个操作,或者触发一个操作。触发器还可以在其内部包含插入、更新和删除逻辑,因此,当触发器因数据修改而触发时,它还可能导致另一个数据修改,从而触发另一个触发器。内部包含数据修改逻辑的触发器称为嵌套触发器。
触发器是存储过程吗?
触发器在许多方面与存储过程相似,因为它们都使用存储在数据库级别的过程逻辑。触发器通常被称为“特殊类型的存储过程”。但与触发器不同,存储过程不是事件驱动的,也不附加到特定的表。每个触发器都附加到数据库中单个指定的表上,只有在发生插入、更新或删除事件时才会触发。触发器不能被调用或执行,但是DBMS在关联表中的数据修改后自动触发触发器。在创建触发器时,您必须指定将触发触发器的修改操作。
以下是允许的触发事件:
INSERT:当有新的行插入到表中时,触发器就会被激活;例如,通过INSERT、LOAD数据和REPLACE语句。
更新:当一行被修改时,触发器被激活;例如,通过UPDATE语句。
•DELETE:当从表中删除一行时,触发器被激活;例如,通过DELETE和REPLACE语句。
触发器主要用于开发人员执行业务规则和执行任务,比如将数据插入任何审计日志。它用于执行插入、更新或删除事件的结果的特定操作。
创建触发器并使用触发器
以下是创建和修改触发器所需的基本步骤:
- 单击并展开要向其中添加触发器的表的节点。
- 现在右键点击' Trigger '节点并选择' New Trigger '。
- 一个新的查询窗口将打开,并在这里输入新触发器的查询。
- 执行“创建触发器。”
- 新创建的触发器现在将出现在与该表关联的触发器的lsit下。
基本语法
触发器的语法是:
CREATE TRIGGER Trigger_Name On Table_Name For [INSERT], [UPDATE], [DELETE] AS ......触发器代码
展开触发器语句格式
下面的语句创建一个新的触发器。触发器与名为tbl_name的表相关联,该表必须是一个永久表。
CREATE [DEFINER = {user}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body
语法解释:
trigger_time:{在|之前在|之后}
trigger_event: {INSERT | UPDATE | DELETE}
一个模式中的所有触发器必须具有唯一的名称,但是不同模式中的触发器可以具有相同的名称。
DEFINER子句确定激活触发器时用户的检查访问权限。
trigger_time是触发器动作时间。“之前”或“之后”可用于指示触发器在要修改的每一行之前或之后激活。
trigger_event表示激活触发器的操作类型。
触发器语句的示例
示例1
下面给出的触发器示例检查用户试图删除的产品是否已停止。如果产品停止运行,则删除过程将停止,并出现错误消息。
在dbo上创建触发器Deleterec。SELECT @ disconnected = stopped FROM deleted If @ disconnected = 0 BEGIN ROLLBACK TRAN RAISERROR (' Active product cannot be deleted ', 16,10)结束
示例2
当用户更新Products表中的数据时,将数据插入审计日志:
在dbo上创建触发器InsertProductAudit。SELECT @ProductID = ProductID, @Productname = Productname from INSERT into ProductsAudit VALUES (@ producttid, @Productname)
示例3
CREATE TABLE Source (Source_ID int IDENTITY, Source_Desc varchar(10)) go TRIGGER Source_INSERT ON Source FOR INSERT AS PRINT GETDATE() go INSERT Source (Source_Desc) VALUES ('Test 1')
上述触发器代码的输出:
——2001年4月28日上午9:56——
为什么有些程序员避免使用触发器?
许多数据库开发人员或程序员完全避免触发。触发器最大的缺点是,触发器隐藏在数据库中,当它们作为节点出现在与它们关联的表下面时,很难调试和排除故障。触发器也会减慢数据库操作。它们还会带来不便,因为它们通常会锁定数据很长一段时间。这就是为什么大多数开发人员选择使用存储过程函数而不是触发器。
结论
要了解更多关于存储过程函数的信息,并更好地理解其他SQL查询和代码,请浏览以下内容SQL查询101。等课程SQL Server要领:你应该知道的!和从初学者到中级的实际SQL技能还将帮助你学习关键的SQL技能,以促进你的职业生涯。