【问题标题】:Firing a trigger when stored procedure execute存储过程执行时触发触发器
【发布时间】:2013-09-17 08:18:17
【问题描述】:

我使用的是 SQL Server 2008。我有存储过程,它(在某些情况下)在我的表中插入数据,每次打开窗口时都会从应用程序调用这个存储过程。 SQL Profiler 如下所示

exec TEST.dbo.spInsertRecords @parameter

现在我想要的是每当调用这个存储过程来执行时触发一个触发器。 是否可以?如果是,请分享语法示例。

【问题讨论】:

  • 如果触发条件发生,则触发器将触发 - 与触发器关联的表上的 INSERTUPDATEDELETE。您不能手动“触发”触发器。 ...如果您在该表上有一个INSERT 触发器,并且您的存储过程实际上插入了一行(或多行),那么该触发器将触发。
  • 谢谢marc_s,如果存储过程会执行但不会在表中插入记录怎么办?我也可以选择传递给这个存储过程的参数吗?
  • INSERT 触发器在存在INSERT 时触发。

标签: sql-server-2008 stored-procedures triggers


【解决方案1】:

触发器设置在表上,如果您确实需要在调用过程时触发某些东西(老实说,我不明白为什么,因为您应该能够修改过程以执行您想要的任何行为),添加一些虚拟表(a记录表?),在该表上创建触发器(例如在插入时),并在您的过程中“触发”触发器(插入一行)。

【讨论】:

  • 好的,让我再解释一下。我正在自定义 Microsoft Dynamics GP 窗口,这个存储过程不是我的,但它是 GP 存储过程,它有时会在表中插入数据,有时不会。在 GP 中,我们没有源代码,所以我们通常使用触发器,包括数据库触发器和应用程序触发器。这个存储过程有我想在这个存储过程调用时选择的参数。所以我不能在存储过程上设置触发器?如果我使用插入触发器,它会起作用吗,请记住插入并不总是发生?
  • 你不能把它包起来吗?重命名它并使用相同名称(包装器)创建另一个调用原始名称的名称,并在包装​​器中添加任何代码?
  • :( 遗憾的是在这种情况下没有。
【解决方案2】:

如果期望触发器执行某些代码,例如将记录写入日志。

  1. 将代码直接写入过程中。

  2. 如果要在所有过程之前或之后执行通用代码,请将代码写在过程执行的地方。

以 PHP 为例:

odbc_exec("执行 my_trigger_before '$procedure_name' @parameters;
执行 $procedure_name @parameters;
执行 my_trigger_after '$procedure_name' @parameters;")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2019-03-25
    • 2018-01-18
    相关资源
    最近更新 更多