【问题标题】:How do you reset the SQL On Create trigger in a Logic App after a TRUNCATE TABLE?如何在 TRUNCATE TABLE 之后重置逻辑应用程序中的 SQL On Create 触发器?
【发布时间】:2019-05-08 13:15:36
【问题描述】:

如何在TRUNCATE TABLE 之后重置逻辑应用中的 SQL On Create 触发器?

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

插入测试记录就可以了。

然后在测试台上运行TRUNCATE TABLE

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

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

据我了解,逻辑应用触发器实际上是如何“在幕后”工作的? ...我以为它可能是SQL表上的触发器,但检查了db并没有看到任何触发器

【问题讨论】:

  • 这个问题写得非常令人困惑。您必须明确说明您不是指的是数据库触发器。 TRUNCATE TABLE 不会影响数据库触发器的工作方式
  • 根据您的描述,我怀疑“触发器”实际上不是触发器,而是尝试通过存储最后一次看到的 IDENTITY 值并查询具有更高 ID 的行来定期检测更改。
  • 考虑使用DELETE 而不是TRUNCATE TABLE

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


【解决方案1】:

该触发器实际上是一个轮询作业,用于检查 ID 大于上次运行中遇到的 MAX(ID) 的项目。丢失记录是使用 IDENTITY 值进行轮询的固有问题。事实上,你会发现有人问为什么在 introduced the SQL connector 的博文中使用了这种轮询技术

重播 IDENTITY

使用 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;  

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • OP 的问题是如果表被截断并且身份重置,轮询实现会失败。添加 rowversion 不会改变这一点。这是使用最大 ID 检测插入的固有问题。更好的实现是在表上使用更改跟踪并响应I(插入)记录
    • 该触发机制不适合在没有时间戳列的情况下使用。如果他添加时间戳,他将有不同的行为。
    • rowversion 仅用于检测单行修改。它是用于检测插入的 IDENTITY。添加 rowversion 不会改变任何内容 - 行已被删除,因此没有要检查的 rowversion 值。这在文档和博客文章like this one 中有解释。坦率地说,这不是一个很好的技术。 SQL Server 的更改跟踪可以轻松处理这两种情况
    • 这是一个真正为分布式应用程序设计的无服务器触发器,它肯定不是我们所知道的常见 SQL Server 触发器。
    • 我没说是。它也与无服务器无关。它是轮询,轮询的最佳选择是使用 SQL Server 的 Change Tracking,它自 2005 年以来在所有版本和版本中都可用。事实上,有人在博客文章的最后一条评论中问introduced the SQL connector:为什么没有他们是否使用变更跟踪?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多