【问题标题】:SQL Differences between stored procedure and triggersSQL 存储过程和触发器的区别
【发布时间】:2013-05-18 20:07:05
【问题描述】:

我无法理解存储过程和 sql 中的触发器之间的区别。 如果有人能好心地向我解释一下,那就太好了。

提前致谢

【问题讨论】:

标签: sql stored-procedures triggers


【解决方案1】:

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

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

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

【讨论】:

  • 假设我们必须在未返回产品时通知用户,您会使用触发器还是存储过程?
  • 没有。未返回的数据不是“事件”。此外,在存储过程中很难在数据库之外执行诸如通知用户之类的事情。您应该为此使用应用程序代码。
  • WHY 您会建议不惜一切代价避免存储过程吗?在我看来,存储过程确实有有效且非常合法的用例!
  • @marc_s 阅读链接的答案以了解原因。好的,我会调低一点。
  • 如果可能的话,我宁愿避免 触发器,因为它们 (a) 不能很好地扩展,(b) 你无法控制是否以及何时以及他们多久触发一次,(c) 他们的功能经常被开发人员和支持者“隐藏”和遗忘,使他们成为无穷无尽的麻烦和令人讨厌的惊喜的来源......
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    关于 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;
    

    两者的区别

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

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

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

    【讨论】:

      【解决方案4】:

      触发器和过程的一些区别:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 那么你能从触发器中调用存储过程吗?
        【解决方案6】:

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

        【讨论】:

        • “Transact SQL”的相关性是什么?你认为 SQL Server 是世界上唯一的数据库吗?
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            可以从另一个存储过程调用存储过程,但不能从触发器调用。 存储过程可以在用户需要时执行,但不是触发器。触发器仅在事件发生时触发。 存储过程可以有打印语句、多个参数和返回值,但不能有触发器。 存储过程可以从前端调用,但不能从触发器调用。

            【讨论】:

              【解决方案10】:
                                  ***TRIGGERS*** 
              
              1. 在特定时间采取行动。

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

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

              【讨论】:

              • 考虑改进此答案的格式和内容。这是一个触发器 - 很棒。什么是存储过程?还学习如何使用降价来创建一个漂亮的列表。
              【解决方案11】:

              如果您熟悉 JavaScript,triggeraddEventListenerStored Procedurecallback

              【讨论】:

                【解决方案12】:

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

                区别在于:

                1) Triggers 自动触发,但他们需要事件。 (例如:create,alter,drop,insert,delete,update)。

                2) 必须显式调用过程然后执行。 他们不需要create,alter,drop,insert,delete,update。 我们还可以使用 sp_proc 选项自动执行过程。

                3)我们不能在triggers中传递参数,

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

                示例:如果我们想显示一条消息“错误”

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

                【讨论】:

                  【解决方案13】:

                  存储过程和触发器的区别

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

                      Triggers are fired implicitly while stored procedures are fired explicitly.
                  

                  【讨论】:

                    猜你喜欢
                    • 2019-03-25
                    • 2013-12-30
                    • 1970-01-01
                    • 2023-04-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-05-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多