标签: trigger

如何创建 SQL 触发器以在表更新时执行存储过程

我需要一些帮助来创建触发器以在创建 qf.table 时运行 qf.stored_procedure。目前,我有一项工作是每 15 分钟运行一次存储过程,但不能进行更改。

这个想法是让触发器在表更新时运行存储过程,而不管它是单行还是全部。以及不确定是否在表下的触发器或数据库触发器中创建它?。我希望脚本检查触发器是否存在,如果不存在则创建它。

表名:qf.customer_working_hours 列:WHours_id,DayOFW

存储过程: qf.ServiveRefreshCustomer_WH

我是 SQL 脚本和 SQL 触发器的新手,任何帮助将不胜感激

trigger sql-server stored-procedures t-sql

4
推荐指数
1
解决办法
7万
查看次数

在 SQL Server Mgmt Studio 中,为什么在表重命名时触发器不会自动更新?

上周我遇到了一个问题,我们在 SQL Server 中重命名了一堆表,但它破坏了一堆触发器。我本来希望 SQL Server Mgmt Studio 足够聪明来更新这些触发器,但显然不是。是我期待太多了吗?有没有办法检测触发器引用不再存在的表(或列)的这些问题?

trigger sql-server

4
推荐指数
1
解决办法
160
查看次数

触发并忘记 SQL 触发器?

我有一个使用 SQL Server 作为后端的 3rd 方应用程序。具体来说,我们在 SQL Server 2000、SQL Server 2008 和 SQL Server 2008R2 上都有它。任何解决方案都必须可供所有人使用,但只有一部分人的解决方案仍然值得关注。

该应用程序是定制的,不受支持,供应商不再存在。我想要做的是当它写入插入时有一个触发器来读取该插入并开始一个复杂的过程。但是,应用程序在 SQL 插入完成之前不会返回焦点,这意味着冗长的触发器将导致应用程序认为 SQL Server 没有响应并取消/回滚事务。

是否有任何类型的触发器会立即“释放”然后继续处理?或者也许我可以在 SQL Server 内部实现一些其他解决方案。

trigger sql-server sql-server-2000

4
推荐指数
1
解决办法
889
查看次数

Service Broker 是审计 SQL Server Express 上数据更改的最佳选择吗?

我的项目是在不延长事务的情况下审计我们系统中的 5 到 10 个现有表。无论使用什么方法,它都必须适用于 SQL Server Express 2005 到(最终)2016。

我已经完成了关于变更数据捕获 (CDC) 和变更跟踪的研究。更改跟踪不捕获特定更改,CDC 仅在企业版中可用。

然后我偶然发现了 Service Broker。我对 Service Broker 很感兴趣,所以我开始创建一个原型。Service Broker 工作正常,但在我的其他两个帖子中收到的答案让我相信这可能不是正确的方法。太复杂了,没什么。我仍处于分析阶段并尝试不同的事情作为我分析的一部分。

现在服务代理的结果并不令人信服……将 105000 个项目批量更新到价格表需要 38 秒,而队列(审计部分)的处理需要 17 秒……但 38 秒包括插入到 2#temp 表中的双重处理,然后用于插入到 TMPins 和 TMPdel。所以我想我可以把它减半......我现在质疑服务代理的使用......从逻辑上讲,触发器可能只需要将信息直接插入审计表中就需要相同的时间...... .

澄清一下,当我说批量插入时,它不是“批量插入”功能。我说的是一次性插入或更新的大量数据。在更新价格表中的 105000 件商品时,我想审核发生的更改。当我说发生的变化时,我决定在审计表中插入新值(如果它是插入或更新)或插入所有其他字段为空的主键(对于已删除的记录)......所以是的!它可以在数据加载后但我不想丢失任何审计(我不希望交易无序传递)

另外两篇文章将有助于了解我正在尝试做的事情和我尝试过的事情的背景:

我重视每一个想法。

trigger sql-server audit sql-server-express

4
推荐指数
1
解决办法
4067
查看次数

触发器附近信号语句中的 concat 语法错误

请帮助我了解 MySQL 5.6 的语法。

出于某种原因,我收到错误消息:

ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '('WRONG SOCIAL: ', new.social);
        end if;
        if not (new.photo is nul'
Run Code Online (Sandbox Code Playgroud)

尝试运行此 SQL 代码时:

create table table_social (
        sid varchar(250) primary key,
        auth char(32) not null,
        social integer,               -- to be checked by triggers
        female boolean,
        given varchar(250) not null,
        family varchar(250) null,
        photo varchar(1000) null,     -- …
Run Code Online (Sandbox Code Playgroud)

mysql trigger syntax mysql-5.6 concat

4
推荐指数
1
解决办法
7285
查看次数

事务中的触发器是否仅在事务提交时触发?

我是一名开发人员,但我转向 dba 社区询问以下问题。

我正在用 C# 编写集成测试。在这个测试中,我首先启动一个事务,并且总是回滚,因此无论测试成功还是失败,都不会向数据库提交任何内容。

开始事务后,我在表中插入了一些东西。这个表上有一个插入触发器,但我觉得这个触发器只有在我提交事务时才会触发。

这是真的?

有没有办法让我在交易中触发触发器?

所以在运行时发生的是:

  • 插入表A
    • 触发器被触发并插入表 B

我的测试中发生的事情是:

  • 开启交易
  • 插入表A
  • 检查表 B --> 插入尚未执行

trigger sql-server transaction

4
推荐指数
1
解决办法
1万
查看次数

当 Flag 值为 1 时触发以阻止更新

当下表中的 Flag 值为 1 时,我需要触发器帮助以防止更新列 Flag 之外的任何列(可以更新):

CREATE TABLE Tmp (Id INT, Type INT, TranDate DATE, Flag INT)
INSERT INTO Tmp VALUES (1, 2, '2017-04-24', 0)
INSERT INTO Tmp VALUES (2, 4, '2017-04-27', 1)
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下代码,但无法正常工作。

CREATE TRIGGER [dbo].[Prevent_Update_Trigger]
ON [dbo].[Tmp]
FOR UPDATE
AS
SET NOCOUNT ON
IF  EXISTS(SELECT NULL FROM dbo.Tmp t JOIN inserted i ON t.Id=i.Id AND t.Flag=1)
BEGIN
RAISERROR('You can not update when Flag value is 1', 16, 1)
ROLLBACK TRAN
SET NOCOUNT OFF
RETURN
END
SET NOCOUNT …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server sql-server-2014

4
推荐指数
1
解决办法
2万
查看次数

SQL 触发器 - 更新计数

所以我需要创建一个触发器,为每个案例创建一个新的证据编号。例如,案例 #1 可以有证据 # 的 1、2、3、4 等等。案例 #2 也可以有证据 # 的 1、2、3 等。

所以我有一个“Case”表(CaseID 为 PK)和一个“Evidence”表(EvidenceNum 为 PK,CaseID 为 FK 和相关属性)

因此,每次我搜索特定的 caseID 时,我都希望填充一个新的“EvidenceID”列。例如证据项目#1、#2 等。所以这些数字可以在每种情况下重复。因此,为什么这不是主键。EvidenceNum 是主键,但最终用户不会看到它。有什么帮助吗??

trigger sql-server sql-server-2014

4
推荐指数
1
解决办法
443
查看次数

如果行已更新,则更新列值的函数

我正在尝试创建一个函数,如果我更新数据库行的任何列,它将增加我的版本列值 (int)。例如,如果我有一个包含列(id、标题、版本)并且默认版本为 1 的 foo 表,我希望我的 vesrion 在我更新单个 foo 行的标题后增加。我编写了以下函数,但是一旦我测试它就会抛出错误:

create or replace function update_foo_version()
returns trigger as $body$
  begin
    update foo
    set version = version::int + 1
    where old.id=new.id;
    return new;
  end
$body$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

我对这个功能的触发器:

create trigger update_version 
after update on foo
for each row execute procedure update_foo_version();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

4
推荐指数
1
解决办法
3740
查看次数

包含自引用表的复杂删除级联

图表

上图是我的数据结构图。它代表一个层次结构,可以包含三种不同类型的“元素”:“A”、“B”和“C”。的关系表明删除级联行为我也喜欢用,如果它是可能的。

所有类型都有共同的属性,包括显示层次结构(父级和索引)中的位置和元素类型的列。这些公共列存储在ElementBase表中。

每种类型的元素还具有独特的属性,这些属性根据元素类型存储在相应的表中。

中的每一行ADataBDataCData引用 中的唯一主行ElementBase。“A”和“C”元素也各自引用“B”元素。“B”元素可以有0个或多个“S”。

我的问题是:如何维护引用完整性并支持级联删除之类的功能?

我希望能够从中删除一行ElementBase并在其中包含相应的行ADataBData或者CData也可以删除。例如,如果从 中删除了“B”类型的元素ElementBase,则首先BData应删除相应的行,然后需要在表ElementBaseCData表中删除所有引用它的“C”类型元素,并且所有“A” "-type 元素需要将它们的引用设置为NULLin AData

最重要的是:如果我删除的元素有任何类型的子元素,我希望相同的逻辑在层次结构中递归运行。

由于ElementBase是自引用,我无法使用该ON DELETE CASCADE表中的简单功能。我也不能使用它,AData或者CData因为它们都引用了BData这可能会导致“多个级联路径”,这在 SQL Server 中显然是邪恶的。

我发现的另一种选择是INSTEAD OF触发器。问题是这种行为必须是递归的,我无法弄清楚如何使它们能够递归并最终在最后进行原始删除。

trigger database-design sql-server referential-integrity cascade

4
推荐指数
1
解决办法
870
查看次数