Dateifreigabe auf Datensätzen erklärt (ContentDocumentLink)
Das Datenmodell hinter Salesforce Files: ContentDocument, ContentVersion und ContentDocumentLink — und wie ShareType und Visibility festlegen, wer eine Datei sieht.
Wenn Sie sich je gefragt haben, warum eine Datei in Salesforce genau dort auftaucht, wo sie auftaucht — oder Dateien in Apex oder einem Bericht abfragen mussten — brauchen Sie das zugrunde liegende Datenmodell. Moderne Salesforce Files bestehen aus drei verwandten Objekten, und zwei Felder am Link entscheiden, wer was sieht. Dies ist das Admin-/Entwickler-Pendant zu wer eine Datei in Salesforce sehen kann.
Die drei Objekte
| Objekt | Was es ist | Wie viele |
|---|---|---|
| ContentDocument | Die Datei selbst | Eines pro Datei |
| ContentVersion | Eine bestimmte Version des Dateiinhalts | Eine pro Upload/Überarbeitung |
| ContentDocumentLink | Eine Verbindung, die die Datei mit einem Datensatz, Benutzer oder einer Gruppe verknüpft | Viele pro Datei |
Wenn Sie eine Datei hochladen, erstellen Sie eine ContentVersion, die Salesforce in ein ContentDocument einbettet. Wenn Sie diese Datei an einen Datensatz anhängen oder mit jemandem teilen, erstellen Sie einen ContentDocumentLink.
Die Datei ist das ContentDocument. Wo sie liegt und wer sie sehen kann steckt vollständig in ihren ContentDocumentLinks.
ContentDocumentLink: das wichtigste Feld
Eine ContentDocumentLink-Zeile besagt: „Diese Datei ist mit jenem Objekt verknüpft, auf dieser Zugriffsstufe, für diese Zielgruppe.” Ihre wichtigsten Felder:
LinkedEntityId — woran die Datei angehängt ist
Die ID dessen, womit die Datei verknüpft ist:
- Ein Datensatz (Account, Opportunity, Case, benutzerdefiniertes Objekt …) → die Datei ist an diesen Datensatz „angehängt”.
- Ein Benutzer oder eine Gruppe → die Datei wird direkt mit dieser Person oder Gruppe geteilt.
Eine einzelne Datei kann gleichzeitig viele Links haben — etwa an zwei Datensätze angehängt und mit einem Benutzer geteilt. Jeder Link ist ein eigenständiger Weg, die Datei zu sehen.
ShareType — die Zugriffsstufe
| Wert | Stufe | Möglich ist |
|---|---|---|
V | Viewer | Öffnen und herunterladen |
C | Collaborator | Anzeigen, bearbeiten, neue Versionen hochladen, Freigabe ändern |
I | Inferred | Zugriffsstufe abgeleitet aus dem Zugriff auf den verknüpften Datensatz |
Inferred (I) ist bei an Datensätze angehängten Dateien der entscheidende Fall: Der Zugriff eines Benutzers auf die Datei wird aus seinem Zugriff auf den verknüpften Datensatz abgeleitet. Das ist der Mechanismus hinter „Wer den Datensatz sehen kann, sieht auch dessen Dateien.”
Visibility — welche Zielgruppe
| Wert | Zielgruppe |
|---|---|
AllUsers | Interne und externe (Community-)Benutzer |
InternalUsers | Nur interne Benutzer |
SharedUsers | Nur Benutzer, mit denen die Datei ausdrücklich geteilt wurde |
Dieses Feld bricht still und leise den Experience-Cloud-Zugriff: Eine an einen Datensatz angehängte Datei mit Visibility = InternalUsers wird Community-Benutzern nicht angezeigt, selbst wenn sie den Datensatz sehen können. (Mehr dazu unter Dateien und Gast-/Experience-Cloud-Benutzer.)
Wie sich der Zugriff tatsächlich auflöst
Zusammengefasst: Ein Benutzer kann eine Datei sehen, wenn einer ihrer ContentDocumentLinks ihm das gewährt:
- Ein Link zu einem Datensatz, auf den er zugreifen kann (ShareType
I) — Zugriff geerbt aus der Datensatzfreigabe. - Ein Link direkt zu ihm oder seiner Gruppe (ShareType
V/C). - Eine Bibliotheksmitgliedschaft oder ein öffentlicher Link (eigene Mechanismen).
… und die Visibility des Links muss seine Zielgruppe einschließen. Die meisten „Datei nicht sichtbar”-Tickets laufen auf einen fehlenden Link oder eine zu eng gefasste Visibility hinaus.
So fragen Sie es ab
Da alles Daten sind, können Sie es direkt untersuchen — etwa jede Stelle finden, an der eine Datei freigegeben ist:
SELECT ContentDocumentId, LinkedEntityId, ShareType, Visibility
FROM ContentDocumentLink
WHERE ContentDocumentId = '069...'
Jede Zeile ist eine Zielgruppe, die die Datei erreichen kann. Um die Personen aufzuzählen, erweitern Sie anschließend jeden LinkedEntityId-Datensatz um seine vollständige Freigabe-Zielgruppe — und genau hier wird es schnell unübersichtlich.
Von Zeilen zu einer verständlichen Antwort
Eine an mehrere Datensätze angehängte Datei erbt die gesamte Zielgruppe jedes Datensatzes — Rollenhierarchie, Freigaberegeln, Teams und alles andere — multipliziert über jeden ContentDocumentLink hinweg. Das von Hand aus rohen Zeilen zu rekonstruieren, ist genau die Arbeit, in der sich versehentliche Offenlegung versteckt. AgentForceAccess durchläuft die ContentDocumentLinks und die dahinterliegende Datensatzfreigabe und beantwortet in verständlichem Deutsch „Wer kann diese Datei sehen, und warum”.
Häufig gestellte Fragen
Was ist der Unterschied zwischen ContentDocument, ContentVersion und ContentDocumentLink?
ContentDocument ist die Datei selbst (eine pro Datei). ContentVersion ist eine bestimmte Version dieser Datei (eine pro Upload/Überarbeitung). ContentDocumentLink verknüpft ein ContentDocument mit etwas anderem — einem Datensatz, Benutzer oder einer Gruppe — und trägt die Zugriffsstufe und Sichtbarkeit für diesen Link.
Worauf verweist LinkedEntityId?
Es ist die ID dessen, womit die Datei verknüpft ist. Bei einer an einen Datensatz angehängten Datei ist es die Datensatz-ID (Account, Opportunity, Case usw.); bei einer Datei, die direkt mit einer Person oder Gruppe geteilt wird, ist es eine User- oder Group-ID. Eine einzelne Datei kann gleichzeitig viele ContentDocumentLinks haben.
Was bedeuten die ShareType-Werte V, C und I?
V = Viewer (öffnen und herunterladen), C = Collaborator (anzeigen, bearbeiten, Versionen hochladen, Freigabe ändern), I = Inferred (die Zugriffsstufe, die ein Benutzer indirekt aus dem Zugriff auf den verknüpften Datensatz erhält). Über Inferred überträgt sich der Datensatzzugriff auf eine Datei.
Was bewirkt das Feld Visibility?
Visibility legt fest, wem der Link zugänglich ist: AllUsers (interne und externe/Community-Benutzer), InternalUsers (nur intern) oder SharedUsers (nur Benutzer, mit denen die Datei ausdrücklich geteilt wurde). Community-/Experience-Cloud-Benutzer benötigen für eine an einen Datensatz angehängte Datei in der Regel AllUsers.
Sieh es dir in deiner eigenen Org an
AgentForceAccess erklärt in klarer Sprache, warum jeder Nutzer jeden Datensatz oder jede Datei sehen kann — über jeden Salesforce-Sharing-Mechanismus hinweg.
Frühen Zugang anfragen