SQL存储过程和触发器之间的差异

时间:2013-05-18 20:07:06

标签: sql stored-procedures triggers

我无法理解sql中存储过程和触发器之间的区别。 如果有人能够善意地向我解释这将是伟大的。

提前致谢

13 个答案:

答案 0 :(得分:31)

存储过程是用本地版本的PL / SQL编写的用户定义代码段,它可以返回一个值(使其成为函数),通过显式调用它来调用它。

触发器是在各种事件发生时自动运行的存储过程(例如,更新,插入,删除)。

恕我直言存储过程为to be avoided unless absolutely required

答案 1 :(得分:29)

将存储过程想象成面向对象编程语言中的方法。你传递了一些参数,它确实有效,它可以返回一些东西。

触发器更像是面向对象编程语言中的事件处理程序。在某种情况下,它可以(a)处理事件本身,或者(b)进行一些处理并允许事件继续冒泡。

答案 2 :(得分:7)

关于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代码存储过程。

  • 我们可以在存储过程中执行大量编程工作并一次又一次地执行。
  • 我们可以创建采用输入过程并提供输出的过程
  • 我们可以通过try catch
  • 处理错误
  • 存储过程可以嵌套并使用嵌套调用
  • 一次又一次地调用
  • 更安全

我们可以像这样创建一个存储过程:

CREATE PROCEDURE dbo.Sample_Procedure 
    @param1 int = 0,
    @param2 int  
AS
    SELECT @param1,@param2 
    RETURN 0;

两者的差异

  • 无法手动调用触发器,可以手动调用存储过程。

  • 触发器在事件发生时自动执行,可用于报告和数据保护,不会从数据库中删除或删除表和数据。我们可以防止触发。另一方面,存储过程必须由某人调用。

  • 可以从前端(客户端应用程序)调用存储过程,但无法从客户端应用程序调用触发器。

答案 3 :(得分:6)

触发器和程序之间存在一些差异:

  1. 我们可以在exec命令的帮助下随时执行存储过程,但只有在定义了触发器的表上触发事件(插入,删除和更新)时才能执行触发器。
  2. 存储过程可以接受输入参数,但我们不能将参数作为输入传递给触发器。
  3. 存储过程可以返回值,但触发器不能返回值。
  4. 我们可以在存储过程中使用事务语句,如开始事务,提交事务和回滚,但我们不能在触发器中使用事务语句
  5. 我们可以从前端调用存储过程(.asp文件,.aspx文件,.ascx文件等)但我们无法从这些文件中调用触发器。

答案 4 :(得分:4)

插入,更新或删除后触发触发器。存储过程是在您调用它时运行的服务器端程序。

答案 5 :(得分:1)

存储过程是一组一次编译的SQL语句,然后可以执行多次。触发器被命名为数据库对象,在发生触发事件时会隐式触发这些对象。触发动作可以在触发事件之前或之后运行。触发器与存储过程类似,但调用它们的方式不同。用户不直接调用触发器,而用户直接调用存储过程。

答案 6 :(得分:1)

存储过程是驻留在DBMS中并由DBMS执行的一段代码,可以由客户端或其他存储过程显式调用。它通常用SQL的过程扩展编写,例如Oracle下的PL / SQL或MS SQL Server下的T-SQL,但是一些DBMS也支持更多通用语言,如Java或.NET。

触发器是一种(某种)存储过程,无法显式调用,而是自动执行以响应插入,更新或删除等事件或表中的行。

答案 7 :(得分:1)

触发器是一种特殊的存储过程。它附加到表中,仅在发生插入,更新或删除时触发。存储过程是您可以在表中创建和重用的基本功能。

答案 8 :(得分:1)

存储过程可以从另一个存储过程调用,但不能从ab触发器调用。 只要用户需要而不是触发器,就可以执行存储过程。只有在事件发生时才会触发触发器。 存储过程可以具有print语句,多个参数和返回值,但不能具有触发器。 可以从前端调用存储过程但不能触发存储过程。

答案 9 :(得分:1)

                    ***TRIGGERS*** 
  1. 特定时间的行动。

  2. 触发器是一种特殊类型的存储过程,不会被用户直接调用。

  3. 创建触发器时,定义为在针对特定表或列进行特定类型的数据修改时触发

答案 10 :(得分:0)

两者都是包含可用于实现业务逻辑的代码块的数据库对象

区别在于:

1)Triggers自动触发,但他们需要事件。 (示例:createalterdropinsertdeleteupdate)。

2)必须明确调用程序然后执行。 它们不需要createalterdropinsertdeleteupdate。 我们也可以使用sp_procoption自动执行程序。

3)我们无法在triggers

中传递参数

但我们可以在存储过程中传递参数

示例:如果我们要显示消息“错误”

使用触发器:我们需要一些DDL/DML语句 使用程序:需要DDL/DML

答案 11 :(得分:0)

如果您熟悉JavaScript,则triggeraddEventListener,而Stored Procedurecallback

答案 12 :(得分:0)

存储过程和触发器之间的区别

我们可以像存储过程一样将触发器定义为数据库对象,或者可以说它是一种特殊的存储过程,当数据库中发生事件时将触发该触发器。我们可以执行一个SQL查询,当一个事件被触发时,它将在数据库中“做某事”。

    Triggers are fired implicitly while stored procedures are fired explicitly.