Dataverse Security Role 權限整理:尤其是 Append / Append To 到底是什麼?

| PowerPlatform | 2 Reads

在 Dataverse 的 Security Role 中,針對每張資料表通常會看到這幾個權限:

Create
Read
Write
Delete
Append
Append To
Assign
Share

前四個比較直觀,真正容易搞混的是:

Append
Append To
Assign
Share

其中最難理解的通常又是 Append / Append To。


1. Create / Read / Write / Delete

這四個基本上就是傳統資料庫的 CRUD。

權限 意義 類似資料庫操作
Create 新增資料 INSERT
Read 查看資料 SELECT
Write 修改資料 UPDATE
Delete 刪除資料 DELETE

例如有一張「案件」表:

Create
→ 可以新增案件

Read
→ 可以查看案件

Write
→ 可以修改案件

Delete
→ 可以刪除案件

需要注意:

Create ≠ Write

可以存在:

Create = 有
Write = 無

也就是可以新增資料,但不能修改既有資料。

反過來也可以設定成:

Create = 無
Write = 有

只能修改既有資料,不能新增。


2. Append / Append To 的本質

一開始很容易把 Append 理解成「把某張表的欄位追加進另一張表」。

其實完全不是。

Append / Append To 控制的是:

兩筆 Dataverse Record 能不能建立或變更關聯。

而在 Power Apps / Dataverse 中,最常見的表現方式就是:

Lookup

所以最簡單的理解方式就是:

Append / Append To
≈ Lookup 關聯權限

但更準確地說,是:

控制能不能建立或修改 Relationship,而不是控制 Lookup 控件本身是否存在。


3. Lookup 可以類比成 Foreign Key

例如有兩張表:

案件
----------------
案件ID
案件名
顧客 ← Lookup

以及:

顧客
----------------
顧客ID
顧客名
電話
地址

案件 A:

案件ID = A001
案件名 = 系統開發
顧客 = ABC株式会社

這裡的:

案件.顧客

就是一個 Lookup。

從傳統 SQL 資料庫的角度理解,可以近似看成:

案件
--------------------------------
案件ID | 案件名   | 顧客ID
A001   | 系統開發 | C001
                   │
                   │ Foreign Key
                   ▼
顧客
--------------------------------
顧客ID | 顧客名
C001   | ABC株式会社

因此:

Dataverse Lookup 可以近似理解成 Foreign Key。

真正保存的不是把整個顧客資料複製進案件,而是:

這個案件關聯到了顧客 C001

4. 不會把另一張表的欄位複製進來

例如顧客資料:

C001
ABC株式会社
03-1111-1111
東京都...

案件表裡並不是變成:

案件
----------------
案件ID
案件名
顧客名
顧客電話
顧客地址

而是:

案件
----------------
案件ID
案件名
顧客 Lookup ─────→ 顧客 C001
                     ├─ 顧客名
                     ├─ 電話
                     └─ 地址

也就是:

案件只是保存「我指向哪一筆顧客」。

如果 Power Apps 顯示:

ThisItem.顧客.顧客名

本質上是沿著 Lookup 關聯,到顧客表讀取對方的欄位。

不是把顧客名複製到了案件表。


5. Append 到底是什麼?

假設:

案件.顧客 → 顧客

現在要做:

案件 A
顧客 = ABC株式会社

也就是建立:

案件 A ─────────→ ABC株式会社

在這個關係中,可以簡化理解成:

案件
Append
   │
   │ Lookup Relationship
   ▼
顧客
Append To

所以:

Append

可以理解成:

這筆 Record 能不能關聯出去。

Append To

可以理解成:

這筆 Record 能不能成為別的 Record 的關聯對象。

因此以前常見的記法:

Append
= 我掛到別人

Append To
= 別人掛到我

雖然方便記,但「掛」這個字本身太抽象。

更清楚的記法是:

Append
= 我能不能建立指向其他 Record 的關聯

Append To
= 我能不能被其他 Record 關聯

6. 最簡單:看到 Append 就想到 Lookup

日常做 Power Apps 時,可以直接先這樣理解:

Append + Append To
→ 能不能設定 / 改變 Lookup 關聯

例如:

案件.顧客 = ABC株式会社

這是在建立:

案件 A ──Lookup──> ABC株式会社

通常就會涉及:

案件 → Append

顧客 → Append To

因此如果發生這種情況:

明明有 Create
明明有 Read
明明有 Write

但是 Lookup 設定或儲存時出現權限錯誤

就應該檢查:

Append
Append To

7. Read 和 Append / Append To 不一樣

還有一個很重要的區別:

Read

和:

Append / Append To

不是同一件事。

可以簡化成:

Read
→ 能不能讀取資料

Append + Append To
→ 能不能建立或改變資料之間的關聯

例如案件本來就已經:

案件 A → ABC株式会社

你只是要讀取這個 Lookup 指向的顧客資料,核心仍然是相應資料表的 Read 權限。

但如果你要把:

案件 A → ABC株式会社

改成:

案件 A → XYZ株式会社

這就是在改變 Lookup 關聯,因此會涉及 Append / Append To。


8. 改 Lookup,不代表修改對方資料

這也是很容易混淆的一點。

例如:

案件 A
顧客 = ABC株式会社

改成:

案件 A
顧客 = XYZ株式会社

這是在修改:

案件的 Lookup

也就是:

CustomerId

C001
↓
C002

並沒有修改:

ABC株式会社

或:

XYZ株式会社

本身的資料。


9. 修改 Lookup 對象本身又是另一回事

假設:

案件
└─ 顧客 → ABC株式会社

畫面上同時顯示:

顧客名:ABC株式会社
電話:03-1111-1111

如果把電話改成:

03-2222-2222

而 Power Apps 實際修改的是顧客表:

顧客
ABC株式会社
電話 = 03-2222-2222

那這時需要的是:

顧客表的 Write

而不是單靠 Append。

所以一定要區分:

案件.顧客 = XYZ株式会社

這是:

修改 Relationship / Lookup

而:

XYZ株式会社.電話 = "03-xxxx"

這是:

修改對方 Record 本身

兩者完全不同。


10. Assign

Assign 是:

改變 Record 的 Owner。

例如:

案件001
Owner = 張さん

改成:

案件001
Owner = 田中さん

這就是 Assign。

因此:

Write

並不等於:

Assign

Write 是修改一般欄位,而 Assign 是:

Owner
張 → 田中

也就是所有權轉移。

這個權限主要對 User / Team-owned Table 有意義。


11. Share

Share 是:

Owner 不變,但是把某筆 Record 的存取權額外分享給其他 User 或 Team。

例如:

案件001
Owner = 張さん

把它 Share 給田中:

案件001
Owner = 張さん

Share
└─ 田中さん
   ├─ Read
   └─ Write

此時:

Owner 仍然是張さん

所以:

Assign
→ Owner 換人

Share
→ Owner 不換,只額外給別人權限

12. 最終記憶表

權限 最簡單理解
Create 新增 Record
Read 查看 Record
Write 修改 Record
Delete 刪除 Record
Append 允許這筆 Record 關聯出去
Append To 允許這筆 Record 被其他 Record 關聯
Assign 改變 Owner
Share Owner 不變,額外分享權限

如果只想記最重要的一句:

Append / Append To
≈ Lookup Relationship 權限

再進一步記成:

Read
→ 能不能看到資料

Write
→ 能不能修改資料內容

Append / Append To
→ 能不能建立或修改 Lookup 關聯

Assign
→ 能不能換 Owner

Share
→ 能不能把這筆資料分享給其他人

總結

Dataverse 的 Security Role 不只是控制:

能不能新增
能不能看
能不能改
能不能刪

它還控制:

Record 之間能不能建立關聯
Owner 能不能轉移
Record 能不能分享

其中 Append / Append To 最容易讓人誤解。

最值得記住的是:

Lookup
≈ Foreign Key 的 Dataverse 表現形式

Append / Append To
≈ 建立或變更 Lookup Relationship 的權限

而它並不是:

把另一張表的欄位複製進本表

也不代表:

修改 Lookup 時會直接修改另一張表的欄位

Lookup 保存的是:

「我指向哪一筆 Record」

而 Append / Append To 控制的,就是這條 Record 之間的關聯能不能被建立或改變。

This article was last edited at