Questions tagged «trigger»

响应数据库事件自动执行过程代码。

1
结合交易触发
假设我们有以下情况: 我们有一张桌子(假设Table_A),其中有一个触发器INSERT。触发工作是table_B根据中的插入值更新其中的某些行table_A。 现在,当我们在表中简单地插入一行时,一切正常,但是在通过事务插入数据的情况下呢?触发器将等待所有事务语句成功运行,还是在识别到插入后立即触发?如果触发器在识别出第一个插入后立即触发,那么如果事务在最后一行失败,会发生什么?有什么机制可以解决这种情况吗?

2
触发器每次都编译吗?
我们正在对CPU利用率高的服务器进行故障排除。在发现查询并非真正引起查询之后,我们开始研究编译。 性能监视器显示少于50次编译/秒和少于15次重新编译/秒。 在运行XE会话以查找编译之后,我们每秒看到数千个编译。 该系统正在使用触发器来审核更改。大多数编译是由于触发器引起的。触发器参考sys.dm_tran_active_transactions。 我们的第一个想法是,在触发器中引用DMV会使它每次都编译,或者仅此特定DMV会导致它编译。因此,我开始测试该理论。它确实每次都编译,但是当它不引用DMV而是硬编码一个值时,我没有检查触发器是否在每次触发时都编译。每次触发时它仍在编译。放下触发器将停止编译。 我们在XE会话中使用sqlserver.query_pre_execution_showplan来跟踪编译。为什么与PerfMon计数器之间存在差异? 每次触发运行时,您都会收到一个编译事件是否正常? 复制脚本: CREATE TABLE t1 (transaction_id int, Column2 varchar(100)); CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100)); GO CREATE TRIGGER t2_ins ON t2 AFTER INSERT AS INSERT INTO t1 SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2 FROM inserted; GO --Both of these show compilation …

1
有没有一种好的方法可以为postgres表中的每个记录运行触发器?
我有一个无法控制某些表设计的系统(通过Slony-I复制),所以我有一系列我们称为“影子表”的系统,在其中我从复制表中提取了一些信息,并将其存储在所需的已处理表单中,同时去除要忽略的记录。 现在,设置新副本后,我运行更新并将其值设置回自身(例如UPDATE tablename SET field=field),以强制触发器运行,但是其中一些表是数百万条记录,并且在增长,并且可能需要30分钟。(然后还有真空)。 有没有更好的方法来触发它,或者有某种方式编写一个函数以使其能够与传入的输入或NEW依赖于调用上下文一起工作?我不愿意保留两个不同的功能,因为我已经看到太多次更新了一个功能,而另一个没有更新。

4
如何将表中的最大行数限制为仅1
我的SQL Server数据库中有一个配置表,该表只能有一行。为了帮助将来的开发人员理解这一点,我想防止添加多行数据。我选择为此使用触发器,如下所示... ALTER TRIGGER OnlyOneConfigRow ON [dbo].[Configuration] INSTEAD OF INSERT AS BEGIN DECLARE @HasZeroRows BIT; SELECT @HasZeroRows = CASE WHEN COUNT (Id) = 0 THEN 1 ELSE 0 END FROM [dbo].[Configuration]; IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0 BEGIN RAISERROR ('You should not add more than one row …


1
清除数据的最快方法是什么?
场景: 我们在订阅服务器上有两个表Tbl1&Tbl2。在Tbl1正在从出版商复制的Server A,它有两个触发器-插入和更新。触发器正在将数据插入并更新到中Tbl2。 现在,我们必须清除(大约9亿条记录)Tbl2中的总数超过1000+百万条记录。以下是一个月到一分钟的数据分布。 一个月-14986826行 一天-483446行 一小时-20143行 一分钟-335行 我在寻找什么 清除该数据的最快方法,不会产生任何生产问题,数据一致性,也可能不会造成停机。因此,我正在考虑按照以下步骤操作,但遇到了:( 脚步: BCP从现有表Tbl2中输出所需的数据(大约1亿条记录,大约需要30分钟)。 假设我从1Fab2018 10:00 PM开始进行活动,并在1Fab2018 10:30 PM结束了活动。到活动完成时,表Tbl2将获得变为增量的新记录。 在名称为Tbl3的数据库中创建一个新表 BCP将导出的数据导入到新创建的表Tbl3中(大约1亿条记录,可能需要大约30分钟) 停止复制作业 完成BCP输入后,请使用tsql脚本插入新的增量数据。 挑战是-如何处理增量“更新”语句? 开始复制 附加问题: 处理场景的最佳方法是什么?

2
触发器:将已删除的行移至存档表
我的restrictionsPostgreSQL数据库中有一个小表(约10行),每天都会删除和插入值。 我想要一个名为的表restrictions_deleted,将从中删除的每一行都restrictions将被自动存储。由于restrictions具有序列号,因此不会重复。 如何在PostgreSQL中编写这样的触发器?


3
限制对某些列的更新。只允许存储过程更新这些列
我有一些敏感的价格列,希望仅通过存储过程进行更新。如果不使用用于更新价格的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都会失败。 我正在考虑使用触发器和令牌表来实现。我正在考虑的想法是有一个令牌表。存储过程将必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查令牌表中是否存在已更新行的令牌。如果找到,它将继续。如果找不到令牌,它将引发异常并使更新事务失败。 有没有一种更好/更好的方法来实施此限制?

4
从触发器调用存储过程
我已经使用以下语法在mysql中创建了一个存储过程。 DROP PROCEDURE IF EXISTS `sp-set_comment_count`; DELIMITER $$ CREATE PROCEDURE `sp_set-comment_count` (IN _id INT) BEGIN -- AC - AllCount DECLARE AC INT DEFAULT 0; SELECT COUNT(*) AS ac INTO AC FROM usergroups AS ug LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id` LEFT JOIN mediagallery AS dm ON ugm.mid …

3
启用触发器后,记录删除速度缓慢
以为通过以下链接可以解决此问题-解决方法可以正常工作-但补丁程序没有解决。与Microsoft支持人员一起解决。 http://support.microsoft.com/kb/2606883 好的,所以我有一个问题想扔给StackOverflow看看是否有人有想法。 请注意这是与SQL Server 2008 R2 问题:启用触发器后,从具有15000条记录的表中删除3000条记录需要3-4分钟,而禁用触发器则仅需要3-5秒。 表格设定 我们将两个表称为Main和Secondary。辅助数据库包含我要删除的项目的记录,因此在执行删除时,我会加入到辅助数据库表。进程在delete语句之前运行,以用要删除的记录填充辅助表。 删除声明: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); 该表有很多列和大约14个不同的NC索引。在确定引发问题的原因之前,我尝试了多种尝试。 打开页面锁定(默认情况下我们已关闭) 手动收集统计数据 禁用自动收集统计信息 验证索引的健康状况和碎片 从表中删除聚簇索引 检查执行计划(没有显示为丢失的索引,对于实际删除,成本为70%,对于记录的合并/合并,成本约为28% 扳机 该表具有3个触发器(每个触发器分别用于插入,更新和删除操作)。我修改了删除触发器的代码以使其返回,然后选择一个以查看触发了多少次。在整个操作过程中,它仅触发一次(如预期)。 ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN] AFTER DELETE AS SELECT 1 RETURN 回顾 启用触发器-语句需要3-4分钟才能完成 关闭触发器-语句需要3-5秒才能完成 …


3
SQL Server:如何仅针对当前会话禁用更新触发?
我正在使用SQL Server 2008 R2。 我有一个表好处,它有一个名为tiu_benefit的AFTER INSERT,UPDATE触发器。 我想为此表编写一个UPDATE语句以更新1行,但我不希望其触发器触发。我知道我可以在UPDATE之前禁用触发器,然后在UPDATE之后启用触发器: DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO 但是此禁用和启用触发器将影响当前登录的所有用户。因此,当我的脚本禁用触发器时,另一个用户可能会运行UPDATE / INSERT,这不好。这就是为什么我只想为当前会话禁用和启用触发器。可能吗?如果是,请告诉如何。 谢谢


2
在UPDATE之后触发UPDATE吗?
我想触发一个将任何更新时间记录为: CREATE TRIGGER col_update AFTER UPDATE ON col FOR EACH ROW BEGIN UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id END 问题在于,当此触发器尝试更新updated列时,它也是另一个运行触发器的更新事件。这将创建一个无限循环,该循环将不起作用。 如何将更新时间存储在相应的列中? 我希望使用触发器,因为表中有很多列。如果尝试手动设置更新时间,则需要修改许多查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.