MS PowerApps:如何使用复合主键 "Patch" a SQL Table

MS PowerApps: How to "Patch" a SQL Table with Composite Primary Key

我对 MS PowerApps 比较陌生

我在带有 PowerApps 网关的现场服务器上安装了 SQL Server Express

我的SQL服务器table有一个复合主键,定义为:

CREATE TABLE [GFX_Information].[BusinessParnterAccess]
(
    [BpAccesID] [int] IDENTITY(1,1) NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [UpdatedDate] [datetime] NOT NULL,
    [LastOperatorID] [int] NOT NULL,
    [CreateByID] [int] NOT NULL,
    [BPID] [int] NOT NULL,
    [AllowedOperatorID] [int] NOT NULL,
    [AccessFlag] [varchar](10) NULL,

    PRIMARY KEY CLUSTERED ([AllowedOperatorID] ASC, [BPID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [GFX_Information].[BusinessParnterAccess] 
    ADD DEFAULT (GETDATE()) FOR [CreatedDate]
GO

ALTER TABLE [GFX_Information].[BusinessParnterAccess] 
    ADD DEFAULT (GETDATE()) FOR [UpdatedDate]
GO

我正在研究如何“修补”新记录。

目前,我使用 OnVisible 事件创建了一个变量来保存最后一个 BpAccesID,就像这样

UpdateContext ({varLastAccessID:First(SortByColumns('[GFX_Information].[BusinessParnterAccess]',"BpAccesID",Descending)).BpAccesID});

出于测试目的,我正在为 Patch 命令使用一组手动值。 Patch命令是

Patch('[GFX_Information].[BusinessParnterAccess]',Defaults('[GFX_Information].[BusinessParnterAccess]')
    ,{BpAccesID:varLastAccessID+1
    ,CreatedDate: Now()
     ,UpdatedDate:Now()
     ,LastOperatorID:4
    ,CreateByID:4
        ,BPID:342
  ,AllowedOperatorID:4
  ,AccessFlag:"RW" });

但是,这不会引发我可以检测到的错误,也不会看到我缺少的内容

谁能提供点想法吗?

我正在阅读这篇文章,这是基于我对 SQL 服务器的了解以及对 Patch 的快速阅读而提出的建议。它可能对您有帮助,也可能不会(对不起)。并且只是确认:我猜问题是“这不会创建新行,我不明白为什么?”

我猜你的问题是 BPAccessId。您已将其设置为身份:[BpAccesID] [int] IDENTITY(1,1) NOT NULL,

但是,您明确地向其中插入了一个值

Patch('[GFX_Information].[BusinessParnterAccess]',Defaults('[GFX_Information].[BusinessParnterAccess]')
    ,{BpAccesID:varLastAccessID+1

当然,您通常无法插入 SQL 服务器中的 IDENTITY 列 - 您需要将 IDENTIY_INSERT 设置为开(然后在完成后再次关闭)。此外,顺便说一句,使用 IDENTITY PK 列的原因之一是始终创建具有有效 PK 的新行。上述方法如何用于并发,例如,两个用户试图同时创建一个新行?

总之,我想到了一些可能的解决方案。再一次,这是基于我对 SQL 服务器的了解。

  • 更改 MS Powerapps 语句以使用 IDENTITY(我将由您决定)- 是否等同于 SET IDENTITY_INSERT table ON; 或其他
  • BPAccessID 中删除 IDENTITY 属性(例如,将其保留为纯整数)
  • 使主键成为所有三列的组合,例如 AllowedOperatorID, BPID, BPAccessID
  • 使 BPAccessID 成为主键,但 non-clustered,并为 AllowedOperatorID, BPID
  • 创建唯一的聚簇索引

对于后两个,由于 BPAccessID 仍然是一个 IDENTITY,您需要让 SQL 服务器处理计算新值。

如果你不使用外键table,那么下面两个会有类似的效果。

但是,如果有外键,那么底部的(non-clustered PK 和其他两个上的聚簇唯一索引)可能最接近您当前的设置(实际上是我通常想要的在像您这样的 table 结构中进行操作,而不管 PowerApps 或其他处理)。