问题标签 [triggers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2549 浏览

sql - 使用触发器强制约束

我正在尝试以一种我认为约束无法实现的方式在表上强制执行完整性...

我要应用的约束是,对于相同的“fk_item_id”,不应有任何具有重叠日期的条目。

笔记:

invalid_from 是有效期之后的瞬间。
这意味着以下两个时期都很好......

  • '2008 Jan 01 00:00' -> '2008 Feb 01 00:00' (整个 1 月)
  • '2008 年 2 月 1 日 00:00' -> '2008 年 3 月 1 日 00:00'(整个 2 月)

我可以在触发器中检查该规则。但是,当触发器确实发现非法插入/更新时,防止“非法”插入/更新发生的最佳方法是什么?

(如果insert包含两条有效记录和两条无效记录,我可以只停止两条无效记录吗?)

干杯,
德姆斯。

编辑:

在我上面的情况下,使用函数的约束效果很好。但我从来没有弄清楚为什么 RAISERROR 在触发器版本中不起作用。

我认为这是因为触发器是 AFTER 触发器,我需要一个 BEFORE 触发器,但这似乎不是一个选项......

0 投票
1 回答
13908 浏览

sql - 防止触发器的相互递归执行?

假设您有表格PresentationsEvents. 保存演示文稿并包含基本事件信息(例如位置和日期)时,将使用触发器自动创建事件。(恐怕由于技术原因,不可能简单地将数据保存在一个地方并使用视图。)此外,稍后在演示文稿中更改此信息时,触发器也会将更新复制到事件中,像这样:

现在,客户想要这样,如果用户更改了事件中的信息,它也应该返回到演示文稿。由于显而易见的原因,我不能反过来:

毕竟,这会导致每个触发器一个接一个地触发。我可以做的是last_edit_by在两个表中添加一个包含用户 ID 的列。如果触发器使用特殊的无效 ID 填充(例如,通过使实际人员的所有用户 ID 为正,但脚本的用户 ID 为负),我可以将其用作退出条件:

这可能可行,但我想做的是向 SQL 服务器指示,在事务中,触发器应该只触发一次。有没有办法检查这个?或者也许是为了检查一个表是否已经受到触发器的影响?


感谢史蒂夫·罗宾斯(Steve Robbins)的回答:

只需将潜在的嵌套UPDATE语句包装在 IF 条件检查中即可trigger_nestlevel()。例如:

请注意,这trigger_nestlevel()似乎是基于 1 的,而不是基于 0 的。如果您希望两个触发器中的每一个都执行一次,但不是更频繁,只需检查trigger_nestlevel() < 3两个触发器。

0 投票
1 回答
4729 浏览

sql - sql 检测更新触发器(sql server 2005)中修改的字段?

在 sql server 2005 中,在更新触发器中,有一种方法可以找到由原始更新查询修改的字段\列的列表。

我有一个包含 150 列的表,并且在触发器内部需要知道是否只更新了一个特定字段(并且没有修改其他字段)

我可以写一个很长的 sql 来比较 150 列,但它很容易出错并且看起来很愚蠢!

解决这个问题的任何体面的方法。我希望一些 sql2005 api 能来救我。

0 投票
2 回答
19491 浏览

asp.net - 如何将触发器添加到更新面板,其中触发器的事件位于中继器内的用户控件内?

我有一个名为 CustomerFinder 的 UserControl 用于搜索客户。中继器内部有“添加”按钮。我为Repeater_ItemCommand 创建了一个事件处理程序。因为我要在其他页面上使用它。

在另一页上,我使用了这个不在 UpdatePanel 中的用户控件。选定客户有一个更新面板(当他们点击添加时,客户被选中)

当他们单击用户控件中的添加按钮时,我希望更新面板自行刷新。

替代文字
(来源:barbarosalp.com

正如您在上面看到的那样,Intellisense 可以获得事件名称“ OnrptCustomersCommand

替代文字
(来源:barbarosalp.com

而这就是触发...

我收到一个错误“找不到事件‘OnrptCustomersComman’”

我怎样才能完成它?提前致谢

0 投票
7 回答
17352 浏览

postgresql - 在视图上执行触发器?

我对数据库触发器和/或视图不太熟悉。我目前正在使用 PostgreSQL 和 HSQL;虽然数据库不是太重要。我只是想知道是否有任何数据库提供这样的东西:

我有一个像这样的(示例)表:

我创建了一个这样的视图:

我插入了几个实体:

所以当我打电话时,当然 DUMMY_VIEW 只包含 VALUES(1,10)

所以现在我要做的是向 DUMMY_VIEW 添加一个触发器,只要插入一个 NUMBER > 5 的实体就会调用该触发器。

我尝试将触发器直接添加到 HSQL 和 PostgreSQL 中的 DUMMY_VIEW;但他们说触发器不能添加到视图中。

这(或功能相似的解决方案)可能吗?

0 投票
2 回答
1198 浏览

sql - 如何获取标识值列 - SQL

我有一个将记录从一个表插入到另一个表的过程。目标表有一个名为 LeadId 的标识列

然后我编写了一个插入触发器,它将从插入的表中获取 LeadId 并将其插入到另一个具有其他值的表中 -

问题是我得到的是第一个生成的 LeadiD,而不是所有的 LeadId。Temp_ProductsTop 表中的 LeadiD 列仅针对记录数重复此值

0 投票
3 回答
3054 浏览

sql-server - Maintaining audit log for entities split across multiple tables

We have an entity split across 5 different tables. Records in 3 of those tables are mandatory. Records in the other two tables are optional (based on sub-type of entity).

One of the tables is designated the entity master. Records in the other four tables are keyed by the unique id from master.

After update/delete trigger is present on each table and a change of a record saves off history (from deleted table inside trigger) into a related history table. Each history table contains related entity fields + a timestamp.

So, live records are always in the live tables and history/changes are in history tables. Historical records can be ordered based on the timestamp column. Obviously, timestamp columns are not related across history tables.

Now, for the more difficult part.

  1. Records are initially inserted in a single transaction. Either 3 or 5 records will be written in a single transaction.
  2. Individual updates can happen to any or all of the 5 tables.
  3. All records are updated as part of a single transaction. Again, either 3 or 5 records will be updated in a single transaction.
  4. Number 2 can be repeated multiple times.
  5. Number 3 can be repeated multiple times.

The application is supposed to display a list of point in time history entries based on records written as single transactions only (points 1,3 and 5 only)

I'm currently having problems with an algorithm that will retrieve historical records based on timestamp data alone.

Adding a HISTORYMASTER table to hold the extra information about transactions seems to partially address the problem. A new record is added into HISTORYMASTER before every transaction. New HISTORYMASTER.ID is saved into each entity table during a transaction. Point in time history can be retrieved by selecting the first record for a particular HISTORYMASTER.ID (ordered by timestamp)

Is there any more optimal way to manage audit tables based on AFTER (UPDATE, DELETE) TRIGGERs for entities spanning multiple tables?

0 投票
20 回答
64429 浏览

sql - 数据库触发器是邪恶的吗?

数据库触发器是个坏主意吗?

根据我的经验,它们是邪恶的,因为它们会导致令人惊讶的副作用,并且难以调试(尤其是当一个触发器触发另一个触发器时)。通常,开发人员甚至不会考虑查看是否有触发器。

另一方面,如果您有逻辑必须在每次FOO在数据库中创建新的时发生,那么放置它的最简单的地方就是 FOO 表上的插入触发器。

我们唯一一次使用触发器是为了非常简单的事情,比如设置ModifiedDate.

0 投票
2 回答
1757 浏览

sql-server - SQL Server 将字段值与其默认值进行比较

我需要遍历表上的字段并在其值不等于其默认值时执行某些操作。

我在触发器中,所以我知道表名。然后我使用这个循环遍历每个字段:

然后我可以通过循环在每次迭代中获取字段名称:

我可以获得该列的默认值:

我有我需要的一切,但我看不到如何比较 2。因为我没有将字段名称作为常量,只有在变量中,我看不到如何从 ' 中获取值插入的表(记住我在触发器中),以查看它是否与默认值相同(现在作为 varchar 保存在 @ColDefault 中)。

0 投票
2 回答
2005 浏览

sql-server - 删除行会导致更新触发器触发吗?

在 SQL Server 2000 中,默认情况下,DELETE 查询是否会导致执行表的 UPDATE 触发器?

我知道我可以定义一个将在 DELETE 和 UPDATE 上执行的触发器,但我想我会验证这实际上是首先需要的。