Hoe bestandsdeling op records werkt (ContentDocumentLink)
Het datamodel achter Salesforce Files: ContentDocument, ContentVersion en ContentDocumentLink — en hoe ShareType en Visibility bepalen wie een bestand ziet.
Als je je ooit hebt afgevraagd waarom een bestand opduikt waar het opduikt in Salesforce — of bestanden moest opvragen in Apex of een rapport — dan heb je het onderliggende datamodel nodig. Moderne Salesforce Files bestaan uit drie gerelateerde objecten, en twee velden op de koppeling bepalen wie wat ziet. Dit is het stuk voor beheerders/developers dat hoort bij wie een bestand in Salesforce kan zien.
De drie objecten
| Object | Wat het is | Hoeveel |
|---|---|---|
| ContentDocument | Het bestand zelf | Eén per bestand |
| ContentVersion | Een specifieke versie van de inhoud van het bestand | Eén per upload/revisie |
| ContentDocumentLink | Een koppeling die het bestand verbindt met een record, gebruiker of groep | Veel per bestand |
Wanneer je een bestand uploadt, maak je een ContentVersion aan, die Salesforce verpakt in een ContentDocument. Wanneer je dat bestand aan een record koppelt of met iemand deelt, maak je een ContentDocumentLink aan.
Het bestand is het ContentDocument. Waar het leeft en wie het kan zien zit volledig in zijn ContentDocumentLinks.
ContentDocumentLink: het veld dat er het meest toe doet
Een rij in ContentDocumentLink zegt: “dit bestand is gekoppeld aan dat ding, op dit toegangsniveau, voor dit publiek.” De belangrijkste velden:
LinkedEntityId — waaraan het bestand is gekoppeld
Het ID van datgene waaraan het bestand is gekoppeld:
- Een record (Account, Opportunity, Case, custom object…) → het bestand is “gekoppeld aan” dat record.
- Een User of Group → het bestand wordt rechtstreeks met die persoon of groep gedeeld.
Eén bestand kan tegelijk veel koppelingen hebben — gekoppeld aan twee records én gedeeld met één gebruiker, allemaal tegelijk. Elke koppeling is een onafhankelijke route om het bestand te zien.
ShareType — het toegangsniveau
| Waarde | Niveau | Kan |
|---|---|---|
V | Viewer | Openen en downloaden |
C | Collaborator | Bekijken, bewerken, nieuwe versies uploaden, deling wijzigen |
I | Inferred | Toegangsniveau overgeërfd van de toegang tot het gekoppelde record |
Inferred (I) is de belangrijke voor aan records gekoppelde bestanden: de toegang van een gebruiker tot het bestand wordt afgeleid van zijn toegang tot het record waaraan het is gekoppeld. Dat is het mechanisme achter “iedereen die het record kan zien, kan ook de bijbehorende bestanden zien.”
Visibility — welk publiek
| Waarde | Publiek |
|---|---|
AllUsers | Interne en externe (community-)gebruikers |
InternalUsers | Alleen interne gebruikers |
SharedUsers | Alleen gebruikers met wie het bestand expliciet is gedeeld |
Dit veld breekt stiekem de toegang in Experience Cloud: een aan een record gekoppeld bestand met Visibility = InternalUsers wordt niet aan community-gebruikers getoond, ook al kunnen ze het record zien. (Meer daarover in bestanden en guest-/Experience Cloud-gebruikers.)
Hoe toegang daadwerkelijk wordt bepaald
Als je het samenbrengt: een gebruiker kan een bestand zien als een van zijn ContentDocumentLinks dat toestaat:
- Een koppeling naar een record waartoe hij toegang heeft (ShareType
I) — toegang overgeërfd van de deling van het record. - Een koppeling rechtstreeks naar hem of zijn groep (ShareType
V/C). - Een lidmaatschap van een library, of een publieke link (aparte mechanismen).
…en de Visibility van de koppeling moet zijn publiek omvatten. De meeste “bestand niet zichtbaar”-tickets komen neer op een ontbrekende koppeling of een te smalle Visibility.
Het opvragen
Omdat het allemaal data is, kun je het rechtstreeks inspecteren — bijvoorbeeld om elke plek te vinden waar een bestand wordt gedeeld:
SELECT ContentDocumentId, LinkedEntityId, ShareType, Visibility
FROM ContentDocumentLink
WHERE ContentDocumentId = '069...'
Elke rij is één publiek dat het bestand kan bereiken. Om de personen op te sommen, breid je vervolgens het volledige delingspubliek van elk LinkedEntityId-record uit — en daar wordt het snel groot.
Van rijen naar een antwoord in gewone taal
Een bestand dat aan meerdere records is gekoppeld, erft het volledige publiek van elk record — rolhiërarchie, sharing rules, teams en al — vermenigvuldigd over elke ContentDocumentLink. Dat met de hand reconstrueren uit ruwe rijen is precies het werk waarin onbedoelde blootstelling zich verschuilt. AgentForceAccess loopt de ContentDocumentLinks na, samen met de recorddeling achter elke koppeling, en beantwoordt “wie kan dit bestand zien, en waarom” in gewone taal.
Veelgestelde vragen
Wat is het verschil tussen ContentDocument, ContentVersion en ContentDocumentLink?
ContentDocument is het bestand zelf (één per bestand). ContentVersion is een specifieke versie van dat bestand (één per upload/revisie). ContentDocumentLink verbindt een ContentDocument met iets anders — een record, gebruiker of groep — en draagt het toegangsniveau en de zichtbaarheid voor die koppeling.
Waar verwijst LinkedEntityId naar?
Het is het ID van datgene waaraan het bestand is gekoppeld. Voor een bestand dat aan een record hangt, is het de record-ID (Account, Opportunity, Case enzovoort); voor een bestand dat rechtstreeks met een persoon of groep wordt gedeeld, is het een User- of Group-ID. Eén bestand kan tegelijk veel ContentDocumentLinks hebben.
Wat betekenen de ShareType-waarden V, C en I?
V = Viewer (openen en downloaden), C = Collaborator (bekijken, bewerken, versies uploaden, deling wijzigen), I = Inferred (het toegangsniveau dat een gebruiker indirect krijgt via toegang tot het gekoppelde record). Inferred is de manier waarop recordtoegang doorwerkt naar een bestand.
Wat doet het Visibility-veld?
Visibility bepaalt aan wie de koppeling wordt getoond: AllUsers (interne én externe/community-gebruikers), InternalUsers (alleen intern) of SharedUsers (alleen gebruikers met wie het bestand expliciet is gedeeld). Community-/Experience Cloud-gebruikers hebben doorgaans AllUsers nodig om een aan een record gekoppeld bestand te zien.
Bekijk het op je eigen org
AgentForceAccess legt in normale taal uit waarom een gebruiker een record of bestand kan zien — over elk Salesforce share-mechanisme heen.
Vraag vroege toegang aan