SQL Server 表触发器每秒可以处理多少事务?如果我有一个每秒插入 1,000 次的高度事务性表,该表上的插入触发器是否可靠地每次触发?
尝试从 SQL Server Management Studio v18.5 更新某些行时出现此错误:
消息 50000,级别 16,状态 1,过程 UPDATElimit,第 7 行 [批处理起始行 0] 要同时处理许多行。减少并重试。Msg 3609, Level 16, State 1, Line 1 事务在触发器中结束。该批次已中止。
我怎样才能绕过这个限制?
触发代码:
ALTER TRIGGER [dbo].[UPDATElimit]
on [dbo].[table]
FOR UPDATE
AS
BEGIN
IF (select count(*) from inserted) > 1000
BEGIN
RAISERROR('To many rows being processed at one. Reduce and try again.', 16, 1)
ROLLBACK
END
END
Run Code Online (Sandbox Code Playgroud) updatedAt如果在 PG 9.6 中插入/更新了新数据,我将使用 SQL 触发器来更新列。
这是触发器将调用的函数
CREATE FUNCTION sp_updatedatstamp() RETURNS trigger AS $updatedat_stamp$
BEGIN
NEW."updatedAt" := now();
RETURN NEW;
END;
$updatedat_stamp$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
这是触发脚本
create trigger tg_de_installment_cdcupdatedat before
insert or update
on
public.table for each row execute procedure sp_updatedatstamp()
Run Code Online (Sandbox Code Playgroud)
这是表定义
CREATE TABLE table (
id serial NOT NULL,
"type" text NULL,
"transactionDate" timestamptz NULL,
remark text NULL,
"createdAt" timestamptz NULL,
"updatedAt" timestamptz NULL,
"deletedAt" timestamptz NULL,
CONSTRAINT table_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
此代码适用于小数据,直到应用程序执行需要 30 分钟的批量更新查询(将更新 100K+ …
假设我有两张表,一张名为ParentTable,另一张名为ChildTable,具有一对多关系,其中一个父项可能有多个子项。
我正在创建一个AFTER DELETE触发器ChildTable。在该触发器中,我正在检查一个值ParentTable(如果存在),如下所示:
-- ...
FROM deleted d
JOIN ParentTable pt ON d.FK_Parent = pt.ID
WHERE pt.Foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
如果我先从 删除ChildTable,然后从 删除ParentTable,AFTER DELETE触发器是在删除行之前还是之后ParentTable触发?
A。这两个DELETE语句通常位于显式事务中,因为我使用的是实体框架。
如果我将外键设置为ChildTable,CASCADE DELETE然后从ParentTableonly 中删除,当触发器触发时,中的行ParentTable仍然可以访问吗AFTER DELETE?
我正在尝试使用触发器捕获登录时间EVENTDATA()。但它只为所有类型的事件提供 Null 值。有人可以帮我解决这个问题吗?这是我的触发器
CREATE TRIGGER trgBlockIP
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @clientip NVARCHAR(15);
SET @clientip = (
SELECT
EVENTDATA().value(
'(/EVENT_INSTANCE/Clienthost)[1]',
'NVARCHAR(15)'
)
);
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @clientip
)
BEGIN
PRINT 'Your IP Address is blocked';
ROLLBACK;
END;
ELSE
BEGIN
DECLARE @Range VARCHAR(15);
SELECT
@Range = SUBSTRING(
@clientip,
1,
LEN(@clientip)
- CHARINDEX('.', REVERSE(@clientip))
) + '.*';
IF EXISTS (
SELECT ip
FROM master.dbo.BLockedIPAddresses
WHERE ip = @Range
)
BEGIN …Run Code Online (Sandbox Code Playgroud) 标题说明(询问)这一切。是否可以在 SQL Server(2005 或更高版本)中的表同义词上创建触发器?