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 或其他处理)。
我对 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 或其他处理)。