【发布时间】:2013-05-18 20:07:05
【问题描述】:
我无法理解存储过程和 sql 中的触发器之间的区别。 如果有人能好心地向我解释一下,那就太好了。
提前致谢
【问题讨论】:
标签: sql stored-procedures triggers
我无法理解存储过程和 sql 中的触发器之间的区别。 如果有人能好心地向我解释一下,那就太好了。
提前致谢
【问题讨论】:
标签: sql stored-procedures triggers
存储过程是用本地版本的 PL/SQL 编写的用户定义的一段代码,它可以返回一个值(使其成为一个函数),该值通过显式调用来调用。
触发器是一个存储过程,当各种事件发生(例如更新、插入、删除)时自动运行。
恕我直言,存储过程是to be avoided unless absolutely required。
【讨论】:
将存储过程想象成面向对象编程语言中的方法。你传入一些参数,它确实工作,它可以返回一些东西。
触发器更像是面向对象编程语言中的事件处理程序。在特定条件下,它可以 (a) 处理事件本身,或 (b) 进行一些处理并允许事件继续冒泡。
【讨论】:
关于 SQL Server 中的触发器:触发器是一段特殊的代码,当数据库服务器中发生事件时会自动执行。
当用户尝试通过数据操作语言 (DML) 事件修改数据时,将执行 DML 触发器。 DML 事件是表或视图上的 INSERT、UPDATE 或 DELETE 语句。这些触发器在任何有效事件被触发时触发,无论是否有任何表行受到影响
我们可以这样创建触发器:
CREATE TRIGGER TriggerName
ON [dbo].[TableName]
FOR DELETE, INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
END
存储过程只不过是您保存的准备好的 SQL 代码,因此您可以一遍又一遍地重复使用这些代码。因此,如果您考虑一遍又一遍地编写查询,而不是每次都必须编写该查询,您将其保存为存储过程,然后只需调用存储过程来执行您保存为一部分的 SQL 代码存储过程。
我们可以这样创建一个存储过程:
CREATE PROCEDURE dbo.Sample_Procedure
@param1 int = 0,
@param2 int
AS
SELECT @param1,@param2
RETURN 0;
两者的区别
无法手动调用触发器,而可以手动调用存储过程。
触发器在事件发生时自动执行,可用于报告和数据保护,防止从数据库中删除或删除表和数据。我们可以防止触发。另一方面,存储过程必须由某人调用。
可以从前端(客户端应用程序)调用存储过程,但不能从客户端应用程序调用触发器。
【讨论】:
触发器和过程的一些区别:
【讨论】:
在插入、更新或删除之后触发触发器。存储过程是在您调用它时运行的服务器端程序。
【讨论】:
存储过程是一组 SQL 语句,编译一次,然后可以执行多次。触发器是在触发事件发生时隐式触发的命名数据库对象。触发动作可以在触发事件之前或之后运行。触发器类似于存储过程,但调用方式不同。触发器不是由用户直接调用的,而存储过程是由用户直接调用的。
【讨论】:
存储过程是驻留在 DBMS 中并由 DBMS 执行的一段代码,可以由客户端或其他存储过程显式调用。它通常使用 SQL 的过程扩展编写,例如 Oracle 下的 PL/SQL 或 MS SQL Server 下的 T-SQL,但一些 DBMS 也支持更通用的语言,例如 Java 或 .NET。
触发器是一种(某种)存储过程,不能显式调用,而是自动执行以响应插入、更新或删除等事件或表中的行。
【讨论】:
触发器是一种特殊的存储过程。它附加到表中,并且仅在发生插入、更新或删除时触发。存储过程是您可以在表中创建和重用的基本函数。
【讨论】:
可以从另一个存储过程调用存储过程,但不能从触发器调用。 存储过程可以在用户需要时执行,但不是触发器。触发器仅在事件发生时触发。 存储过程可以有打印语句、多个参数和返回值,但不能有触发器。 存储过程可以从前端调用,但不能从触发器调用。
【讨论】:
***TRIGGERS***
在特定时间采取行动。
触发器是一种特殊类型的存储过程,用户不直接调用。
【讨论】:
如果您熟悉 JavaScript,trigger 是 addEventListener,Stored Procedure 是 callback。
【讨论】:
两者都是包含可用于实现业务逻辑的代码块的数据库对象
区别在于:
1) Triggers 自动触发,但他们需要事件。
(例如:create,alter,drop,insert,delete,update)。
2) 必须显式调用过程然后执行。
他们不需要create,alter,drop,insert,delete,update。
我们还可以使用 sp_proc 选项自动执行过程。
3)我们不能在triggers中传递参数,
示例:如果我们想显示一条消息“错误”
使用触发器:我们需要一些DDL/DML 语句
使用过程:不需要DDL/DML
【讨论】:
存储过程和触发器的区别
我们可以像存储过程一样将触发器定义为数据库对象,或者我们可以说它是一种特殊类型的存储过程,当数据库中发生事件时触发。我们可以执行一个 SQL 查询,当一个事件被触发时,它会在数据库中“做一些事情”。
Triggers are fired implicitly while stored procedures are fired explicitly.
【讨论】: