【问题标题】:MS PowerApps: How to "Patch" a SQL Table with Composite Primary KeyMS PowerApps:如何使用复合主键“修补”SQL 表
【发布时间】:2021-02-02 18:01:10
【问题描述】:

我对 MS PowerApps 比较陌生

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

我的 SQL Server 表有一个复合主键,它定义为:

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('[GFX_Information].[BusinessParnterAccess]',Defaults('[GFX_Information].[BusinessParnterAccess]')
    ,{BpAccesID:varLastAccessID+1
    ,CreatedDate: Now()
     ,UpdatedDate:Now()
     ,LastOperatorID:4
    ,CreateByID:4
        ,BPID:342
  ,AllowedOperatorID:4
  ,AccessFlag:"RW" });

但是,这不会引发我无法检测到的错误,也不会引发我丢失的内容

谁能给点意见?

【问题讨论】:

  • 我不知道“PowerApps”是什么,但由于BpAccesID 列定义为IDENTITY,因此您不应为新行提供值。服务器会自动为其分配一个新值。我会尝试从您的代码中删除此文本:BpAccesID:varLastAccessID+1 ,

标签: sql-server powerapps composite-primary-key powerapps-canvas


【解决方案1】:

我正在阅读这篇文章,这是基于我对 SQL Server 的了解和对 Patch 的快速阅读提出的建议。它可能会帮助你,也可能不会(对不起)。而且只是确认:我猜问题是“这不会创建新行,我看不出为什么?”

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

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

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

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

无论如何,我想不出一些潜在的解决方案。再一次,这仅基于我对 SQL Server 的了解。

  • 更改 MS Powerapps 语句以使用 IDENTITY(这由您决定) - 是否相当于 SET IDENTITY_INSERT table ON; 或其他
  • BPAccessID 中删除 IDENTITY 属性(例如,将其保留为纯 int)
  • 将主键设为所有三列的组合,例如,AllowedOperatorID, BPID, BPAccessID
  • 将 BPAccessID 设为主键但非聚集,并为AllowedOperatorID, BPID 创建唯一聚集索引

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

如果你没有对这个表使用外键,那么下面两个会有类似的效果。

但是,如果有外键,那么底部的一个(非聚集 PK 和另外两个上的聚集唯一索引)可能最接近您当前的设置(实际上是我通常在表中所做的与您的结构类似,无论 PowerApps 或其他处理如何)。

【讨论】:

  • 您好,谢谢。 ..有趣的是我今天下午一直在工作。我将 ed 切换到底部选项(非集群 pk)。但是,如果时间不紧迫,我将测试包含身份列的第二个选项
  • 您拥有其他字段的组合(与表格相反的顺序)这一事实向我表明,您知道您在谈论 PK 和索引。目前,您的结构在AllowedOperatorID, BPID 上强制执行唯一性(例如,这些的每个组合只能出现一次),当您将所有三个作为 PK 时,这将丢失。如果您去那里,您可能还想对两个原始字段设置唯一约束(由您决定)。
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
相关资源
最近更新 更多