Azure 在截断表之后,如何在逻辑应用程序中重置SQL On Create触发器?

Azure 在截断表之后,如何在逻辑应用程序中重置SQL On Create触发器?,azure,azure-sql-database,azure-logic-apps,Azure,Azure Sql Database,Azure Logic Apps,在截断表之后,如何在逻辑应用程序中重置SQL On Create触发器 我有一个基本逻辑应用程序,上面写着“创建项目时” 插入测试记录,效果良好 然后在测试表上运行TRUNCATE TABLE 此后,逻辑应用程序SQL触发器在新记录的IDENTITY中的值高于上次成功运行SQL触发器之前不会工作 如何“重置系统”,以便logic app触发器在截断表后将所有记录视为新记录 就我的理解而言,logic应用程序触发器实际上是如何“隐藏”工作的。。。我认为它可能是SQL表上的一个触发器,但检查了db,

截断表之后,如何在逻辑应用程序中重置SQL On Create触发器

我有一个基本逻辑应用程序,上面写着“创建项目时”

插入测试记录,效果良好

然后在测试表上运行
TRUNCATE TABLE

此后,逻辑应用程序SQL触发器在新记录的
IDENTITY
中的值高于上次成功运行SQL触发器之前不会工作

如何“重置系统”,以便logic app触发器在截断表后将所有记录视为新记录


就我的理解而言,logic应用程序触发器实际上是如何“隐藏”工作的。。。我认为它可能是SQL表上的一个触发器,但检查了db,看不到任何触发器

您需要依赖时间戳/rowversion列,而不是标识列。不支持不具有此数据类型列的表的OnUpdate触发器


SQL连接器在逻辑应用程序上设置“item is created”触发器时查询更改。它不会在Azure SQL数据库上创建触发器。SQL连接器使用轮询机制,使用时间戳/rowversion列查询表中的更改。此数据类型是专门为SQL中的此类处理而设计的。轮询查询本质上选择rowversion大于上次轮询值的所有行

该触发器实际上是一个轮询作业,用于检查ID大于上次运行中遇到的最大ID的项目。丢失记录是使用标识值进行轮询的固有问题。事实上,你会发现有人在问为什么在那篇博客文章中使用这种投票技术

重新播种标识

使用标识时的唯一解决方案是:

其中10000是大于截断前使用的最大标识值的数字

一个更健壮的解决方案是更改轮询实现以检测和使用SQL Server的。不管出于什么原因,这都没有实现

使用序列而不是标识

另一种解决方案是使用身份而不是身份来生成新的ID。序列是独立的数据库对象,因此截断表不会影响序列。事实上,对于多个表,可以使用与默认值相同的序列

例如,您可以定义以下序列:

CREATE SEQUENCE MySequence
    START WITH 1  
    INCREMENT BY 1 ;
并将其用作主键:

CREATE TABLE MyTable 
(
   ID bigint PRIMARY KEY 
)

ALTER TABLE MyTable  
ADD   
    DEFAULT NEXT VALUE FOR MySequence 
    FOR ID;  

这个问题写得很混乱。您必须非常清楚,您并不是指数据库触发器<代码>截断表
不影响数据库触发器的工作方式根据您的描述,我怀疑是“触发器”实际上并不是一个触发器,而是尝试通过存储最后一个可见的标识值来周期性地检测变化,并查询具有较高ID的行。考虑使用<代码>删除>代码>而不是<代码>截断表< /代码>。OP的问题是,如果表被截断并且身份重置,则轮询实现失败。添加行版本不会改变这一点。这是使用max-ID检测插入的固有问题。更好的实现方法是在表上使用更改跟踪,并响应
I
(insert)记录,该记录的触发机制设计为在没有时间戳列的情况下使用。如果他添加时间戳,他将有不同的行为。rowversion仅用于检测单行修改。它是用来检测插入的身份。添加行版本不会更改任何内容-行已被删除,因此没有要检查的
rowversion
值。这在文档和博客文章中都有解释。坦白说,这不是一个很好的技术。SQL Server的更改跟踪可以轻松处理这两种情况。它是一个真正用于分布式应用的无服务器触发器。它当然不是我们所知道的常见SQL Server触发器。我没有说它是。它也与无服务器无关。这是轮询,轮询的最佳选择是使用SQL Server,自2005年以来所有版本和版本都提供了SQL Server。事实上,有人在博客文章的最后一条评论中问道:为什么他们不使用变更跟踪?
CREATE TABLE MyTable 
(
   ID bigint PRIMARY KEY 
)

ALTER TABLE MyTable  
ADD   
    DEFAULT NEXT VALUE FOR MySequence 
    FOR ID;