在TRUNCATE TABLE
之后如何在Logic App中重置SQL On Create触发器?
我有一个带有“创建项目时” trigger against a SQL table的基本逻辑应用程序。
插入测试记录,效果很好。
然后在测试表上运行TRUNCATE TABLE
。
此后,逻辑应用程序SQL触发器不起作用直到,新记录的值IDENTITY
中高于SQL触发器的上一次成功运行。
如何“重置系统” ,以便逻辑应用程序触发器在TRUNCATE TABLE
之后将所有记录视为新记录?
据我所知,逻辑应用程序触发器实际上是如何“在幕后”工作的? ...我以为这可能是SQL表上的触发器,但是检查了数据库并且看不到任何触发器
答案 0 :(得分:1)
该触发器实际上是一项轮询作业,用于检查ID大于上次运行中遇到的MAX(ID)的项目。丢失记录是使用IDENTITY值进行轮询的固有问题。实际上,您会发现有人问为什么introduced the SQL connector
的博客文章中使用了这种轮询技术重新获得身份
使用IDENTITY的唯一解决方案是使用reseed the IDENTITY value:
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10000);
其中10000是比截断前使用的最大IDENTITY值大的数字。
一个更强大的解决方案是更改轮询实现以检测和使用SQL Server的Change Tracking。检测无论出于什么原因,都没有实现。
使用序列代替IDENTITY
另一种解决方案是使用SEQUENCE代替IDENTITY来生成新ID。序列是独立的数据库对象,因此将表截断不会影响序列。实际上,您可以对多个表使用与默认表相同的SEQUENCE
例如,您可以定义以下顺序:
CREATE SEQUENCE MySequence
START WITH 1
INCREMENT BY 1 ;
并将其用作the default constraint作为主键:
CREATE TABLE MyTable
(
ID bigint PRIMARY KEY
)
ALTER TABLE MyTable
ADD
DEFAULT NEXT VALUE FOR MySequence
FOR ID;
答案 1 :(得分:0)
您需要依靠时间戳记/行版本列而不是标识列。不支持不具有此数据类型列的表的OnUpdate触发器。
当在Logic App上设置“创建项目”触发器时,SQL Connector查询更改。它不会在Azure SQL数据库上创建触发器。 SQL连接器使用轮询机制使用时间戳/行版本列查询表中的更改。该数据类型是专门为SQL中的这种处理而设计的。轮询查询从本质上选择rowversion大于上一个轮询值的所有行。