在TRUNCATE TABLE之后如何在Logic App中重置SQL On Create触发器?

时间:2019-05-08 13:15:36

标签: azure azure-sql-database azure-logic-apps

TRUNCATE TABLE之后如何在Logic App中重置SQL On Create触发器?

我有一个带有“创建项目时” trigger against a SQL table的基本逻辑应用程序。

插入测试记录,效果很好。

然后在测试表上运行TRUNCATE TABLE

此后,逻辑应用程序SQL触发器不起作用直到,新记录的值IDENTITY中高于SQL触发器的上一次成功运行。

如何“重置系统” ,以便逻辑应用程序触发器在TRUNCATE TABLE之后将所有记录视为新记录?

据我所知,逻辑应用程序触发器实际上是如何“在幕后”工作的? ...我以为这可能是SQL表上的触发器,但是检查了数据库并且看不到任何触发器

2 个答案:

答案 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大于上一个轮询值的所有行。