Questions tagged «trigger»

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

2
MySQL中触发器与存储过程的性能
关于DBA.StackExchange(触发器在记录上保留修订号的最佳实践是什么?)的一篇文章引发了一个关于MySQL性能的有趣的问题(至少对我来说很有趣)。 上下文是我们要在表中为每个更新的行插入一条记录。在更新该行之前,我们要存储一个先前的值,然后递增其中一列(“版本”列)。 如果我们在触发器中执行此操作,则效果很好。对于MySQL,触发器是逐行的,因此这是一个简单的解决方案。选择表中当前的数据,将其插入日志记录表,然后更新新数据中的“版本”列。 但是,可以将此逻辑移至存储过程。如果这样做,您将执行插入操作,然后增加表中的“版本”列。整个事情将基于设置。 因此,在执行此插入操作时,使用基于集合的存储过程方法或基于触发器的方法会更有效吗? 这个问题是针对MySQL的(因为它具有逐行触发器),尽管它可以应用于其他逐行触发器DBMS。

1
尽管没有任何行受到影响,但触发触发
这更像是一个普遍的问题,但是这个问题的动机是我在使用SQL Server时遇到的一个问题。 我将此触发器附加到表上的Insert事件中,该事件包含一些逻辑,作为副作用,如果没有插入行,它将引发错误。经过进一步调查,我发现尽管没有插入行,但触发器仍在触发。 在DML触发器上的Microsoft文档中使用的语言似乎与以下行为矛盾: DML触发器是一种特殊的存储过程,当发生DML事件而该事件会影响触发器中定义的表或视图时,它会自动生效。 这是DBMS的默认行为吗?没有行受到影响时,是否有特定的原因触发触发器?

1
使用跨数据库证书时触发器中的权限
我使用跨数据库证书(如Erland Sommarskog所述)来控制对环境(SQL Server 2008 R2)中某个数据库的访问。 我已经在数据库A中存储了更新数据库B中表的存储过程。到目前为止,这一直适用于db A中的各种存储过程以及db B中的表。我正在尝试更新数据库B中的表,但是该表上有一个触发器。此触发器正在将附加数据插入db B中的另一个表中。 消息916,级别14,状态1,过程table_trigger,第11行在当前安全性上下文下,服务器主体“ sql \ login”无法访问数据库“ B”。 我尝试授予与证书绑定的数据库B用户的插入权限,以将其插入到该其他表中,但是它无法解决该错误。除了更改触发器以便使用之外,我还有其他选择WITH EXECUTE AS OWNER吗? 这是DDL复制问题: CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF CREATE DATABASE A; CREATE DATABASE B; USE A; CREATE TABLE dbo.SPtoUpdate ( ID INT , ILoveFishing VARCHAR(255) ); INSERT INTO dbo.SPtoUpdate ( ID …

1
确保时态数据库设计中唯一条目的正确方法是什么?
我在设计时态数据库时遇到了麻烦。我需要知道如何确保商店的给定时间范围内只有一条活动记录。我已经读过这个答案,但是恐怕我无法围绕触发器的工作原理来解决。特别是,我将如何触发现有的触发器,以防止对记录进行更新,而是插入一条新记录。我的真正问题是,当完成日期为null时,我不知道如何防止商店拥有多个生效日期。(即防止2条活动记录的商店)。 这就是我所拥有的,但是它允许我为具有不同生效日期的商店插入新记录。 表定义: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …

1
如何创建触发器,以在修改行时更新日期字段和时间字段?
我testtable在数据库内部创建了一个testbase具有以下结构的表: product_no (int, not null) product_name (varchar(30), not null) price (money, null) expire_date (date, null) expire_time (time(7), null) 但是,我该如何编写触发器以使其将更新已修改(或用新信息更新)的特定行,并将修改日期记录到expire_date字段中,并将修改时间记录到expire_time字段中?(或者这是否可行?)


3
从插入触发器启动python脚本
我们有一段不错的python,它可以发送一些电子邮件并与云系统进行交互。工作良好。但是我们必须每隔几分钟触发一次以轮询数据库。出于业务目的,我们确实需要实时启动python脚本,因此没有轮询延迟。(这为与客户通电话的销售人员提供服务。) 我们真的不希望有1分钟的轮询循环。或30秒。我们希望该记录显示在数据库中,并让事情立即发生。 快速实现此目标的快速方法是在将特定记录类型插入表中时触发它。 我们可以从触发器中触发python脚本吗? 根据下面的Aaron注释,我们知道这是Very Bad Thing™,但是此表的使用很少(每天插入0-12次)。轮询表无法满足我们的业务需求(我们需要.py立即运行-它做的不仅仅是发送电子邮件)。 我们认为,满足业务需求的一种方法是在SQL Server上设置python的.net版本,然后让T-SQL以调用C#的方式调用python脚本... 但是我们不知道如何实际做到这一点!(请问这个问题)。 文档/详细信息? 我问了有关堆栈溢出的后续问题:如何在SQL Server中创建Python CLR过程? 问题下的问题:您有一块python。您希望它从SQL触发器中触发,但是您知道这是一件很糟糕的事情。那么,如何在不使用python代码的情况下真正实现相同的效果的SQL操作呢? 解决此需求的非触发,非轮询方法是什么? (相同的效果=“在表中发生插入/更新/删除,并且在db事件发生后2秒内触发了python脚本,而没有轮询表”)

3
如何在仅进行实际更改时触发T-SQL触发器?
我在UPDATE和INSERT上有一个表触发器,该触发器将行添加到另一个表中。如果更改了四列之一,则只需添加一行。我尝试使用IF UPDATE(col)来测试更改,但它有一个盲点。它仅测试是否引入了一些价值。我需要更深入地研究,我需要比较新旧价值,以查看是否发生了真正的变化。它必须同时使用INSERT和UPDATE。 在UPDATE的情况下很容易,因为插入和删除的表都具有我可以在触发器中比较的值。但是,对于INSERT,只有插入表具有值。因为我需要在同一触发器中完成所有操作,所以如何处理INSERT情况? 这是我要修改的触发器的脚本: ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive])) BEGIN INSERT INTO [mydb].[dbo].[AT_Person_To_Push] ( [Facility], [VendorID], [Person_code], [First_Name], [Last_Name], [JobCode], [Alink], [Inactive] ) SELECT [Facility], [VendorID], [Person_code], [First_Name], …
9 t-sql  trigger 

1
为什么对分区视图执行删除会导致聚集索引插入?
我有一个分区视图,具有下面的插入触发器(可怜的芒分区)。当我执行DELETE时,我得到以下查询计划: delete from factproductprice where pricedate = '20170725' 在视图上触发: ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice] INSTEAD OF DELETE AS BEGIN IF @@ROWCOUNT = 0 RETURN; DECLARE @PriceDate DATE SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED IF @PriceDate BETWEEN '20140101' AND '20141231' BEGIN DELETE FROM dbo.FactProductPrice2014 WHERE ProductId IN (SELECT ProductId …

4
我如何知道哪个存储过程或触发器正在使用SQL Server 2008 R2上的表?
就是这种情况,在我正在检查的数据库中,有一个保存用户历史记录的存档表,并且有一个触发器或存储过程,在一段时间后,从该表中删除行,以避免该表过大。同样,我没有设计数据库,我只是在维护使用该数据库的应用程序,所以我不知道这些存储过程或触发器的名称,我要做的是找到该存储过程或触发,请检查代码并对其进行修改,以使此“用户历史记录”在表上保留的时间更长。 有人告诉我检查“ sysobjects”表,在那里我实际上可以看到具有相同名称的表,但这是我唯一能够检索到的信息,有什么建议吗? 谢谢。

1
如何为SQL Server重写为Oracle编写的触发器?
如何为SQL Server重写最初为Oracle编写的触发器? 这是我的Oracle触发代码: CREATE OR REPLACE TRIGGER P000KUL_TEST BEFORE INSERT ON P000KUL REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN SELECT TO_CHAR(SYSDATE, 'dd/mm/RRRR') INTO :NEW.SYSTEM_DATE FROM DUAL; SELECT TO_CHAR(SYSDATE, 'hh:mi') INTO :NEW.SYSTEM_TIME FROM DUAL; END;

3
触发更改创建时的数据库排序规则
我正在尝试创建一个触发器,以更改数据库创建时的排序规则,但是如何捕获触发器中要使用的数据库名称? USE master GO CREATE TRIGGER trg_DDL_ChangeCOllationDatabase ON ALL SERVER FOR CREATE_DATABASE AS declare @databasename varchar(200) set @databasename =db_name() ALTER DATABASE @databasename COLLATE xxxxxxxxxxxxxxxxxxx GO 显然,这是行不通的。


1
如何使用内置函数解析数据库触发器的名称?
我有一个数据库触发器,用于防止我在用户数据库中创建某些过程。 它出现在中sys.triggers,带有object_id,但我无法使用该object_id功能来找到它。 SELECT OBJECT_ID(t.name, t.type) AS object_id, * FROM sys.triggers AS t; 同样,我可以在中找到它sys.dm_exec_trigger_stats。我object_name无法解决,但是可以解决object_definition。 SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name, OBJECT_DEFINITION(dets.object_id) AS object_definition, * FROM sys.dm_exec_trigger_stats AS dets; 是否有一个函数可以接受数据库级触发器的对象ID,并返回其名称?

2
pg_trigger_depth()是否可用于防止触发级联(递归)?
为什么pg_trigger_depth() = 0在防止触发级联(递归)时不好用(除调试外)? 有人可以提供代码来证明它为什么不好吗? 我正在猜测,因为如果多个触发器同时在同一数据上运行,则使用触发器停止的条件pg_trigger_depth() = 0将停止第二行执行的任何触发器。 我认为这将是解决这个问题的好方法,但有人告诉我: 在触发器内,是否有方法可以判断更新或插入是否来自触发器? 认为这将是一个很好的问题。 它在这里提供作为解决方案: 防止PostgreSQL中的递归触发器 Postgres 9.3文档: https://www.postgresql.org/docs/9.3/static/functions-info.html

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.