假设我们有以下情况:
我们有一张桌子(比方说Table_A),它有一个触发器INSERT。触发器作业是table_B根据 中插入的值更新 中的某些行table_A。
现在,当我们简单地在表中插入一行时一切正常,但是我们通过事务插入数据的情况呢?触发器会等到所有事务语句成功运行,还是会在识别到插入时触发?。如果触发器在识别出第一个插入时立即触发,如果事务在最后一行失败会发生什么?这种情况有什么机制吗?
我的 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 into the config table. ', 16, 1)
END
END
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但不允许第一行进入。
还有比这更有效/更自我解释的方法可以将可以插入表中的行数限制为 1 吗?我是否缺少任何内置的 SQL Server 功能?
我有一个系统,我无法控制某些表的设计(通过 Slony-I 复制),所以我有一系列我们称之为“影子表”的东西,我从复制的表中提取一些信息,并将其存储在我需要的处理形式中,同时剥离我想忽略的记录。
现在,在设置新副本后,我运行更新并将值设置回自身(例如,UPDATE tablename SET field=field)以强制运行触发器,但有些表有数百万条记录,并且还在增长,可能需要 30 分钟. (然后还有真空)。
有没有更好的方法来触发它,或者有什么方法可以编写一个函数,使其可以处理传入的输入或NEW取决于调用上下文?我不愿意保留两个不同的功能,因为我已经看到太多次更新一个而不是另一个。
我想知道是否可以更新 MySQL 中的触发器定义。例如,我有一个触发器 T,我想向它添加一些新功能。
我的假设是我需要删除并重新创建它。
对于此类场景,数据库管理的最佳实践是什么?
我们正在对 CPU 利用率高的服务器进行故障排除。在发现查询并没有真正导致它之后,我们开始研究编译。
性能监视器显示少于 50 次编译/秒和少于 15 次重新编译/秒。
在运行 XE 会话寻找编译后,我们每秒看到数千次编译。
该系统使用触发器来审计更改。大多数编译是由于触发器。触发器参考 sys.dm_tran_active_transactions。
我们的第一个想法是可能在触发器中引用 DMV 会导致它每次编译,或者可能只是这个特定的 DMV 会导致它。所以我开始测试这个理论。它每次都会编译,但我没有检查触发器是否在每次触发时编译,当它不引用 DMV 而是硬编码一个值时。每次触发时它仍在编译。删除触发器会停止编译。
复制脚本:
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 events
INSERT INTO t2 VALUES ('row1', 'value1');
INSERT INTO …Run Code Online (Sandbox Code Playgroud) 我的restrictionsPostgreSQL 数据库中有一个小(约 10 行)表,其中每天删除和插入值。
我想要一个名为 的表restrictions_deleted,从中删除的每一行都restrictions将自动存储。由于restrictions具有序列号,因此不会有重复项。
如何在 PostgreSQL 中编写这样的触发器?
这是你应该拥有的相当普遍的知识
SET NOCOUNT ON
Run Code Online (Sandbox Code Playgroud)
默认在创建新存储过程时。
Microsoft 已在 2012 年更改了默认模板以包含此内容。我认为这对于触发器应该是相同的,但它并未包含在模板中。
这是故意的还是只是疏忽?
我有 10 个存储过程,每个存储过程都将 INSERT 插入到一个 tableX 中。
是否可以在 tableX 的触发器主体中获取导致 tableX 修改的对象(存储的 proc1 或 sp2 或....)?
谢谢你。
我有敏感的价格列,我只想通过存储过程进行更新。如果不使用旨在更新它的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都失败。
我正在考虑使用触发器和令牌表来实现这一点。我正在考虑的想法是有一个令牌表。存储过程必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查更新行的令牌表中是否存在该令牌。如果找到,它将继续。如果未找到令牌,则会抛出异常并使更新事务失败。
有没有好的/更好的方法来实现这个限制?
我有一个包含 104 个触发器的数据库,有没有办法使用单个命令从名为“system_db_audits”的单个数据库中删除所有触发器?
trigger ×10
sql-server ×6
plpgsql ×2
postgresql ×2
t-sql ×2
delete ×1
insert ×1
limits ×1
mysql ×1
performance ×1
row ×1
transaction ×1
update ×1