FilesContentDocumentSalesforce-beheerder

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.

AgentForceAccess 3 min leestijd
Een schemadiagram van een centraal bestandsknooppunt gekoppeld aan record-, gebruikers- en groepsentiteiten

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

ObjectWat het isHoeveel
ContentDocumentHet bestand zelfEén per bestand
ContentVersionEen specifieke versie van de inhoud van het bestandEén per upload/revisie
ContentDocumentLinkEen koppeling die het bestand verbindt met een record, gebruiker of groepVeel 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.

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

WaardeNiveauKan
VViewerOpenen en downloaden
CCollaboratorBekijken, bewerken, nieuwe versies uploaden, deling wijzigen
IInferredToegangsniveau 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

WaardePubliek
AllUsersInterne en externe (community-)gebruikers
InternalUsersAlleen interne gebruikers
SharedUsersAlleen 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:

  1. Een koppeling naar een record waartoe hij toegang heeft (ShareType I) — toegang overgeërfd van de deling van het record.
  2. Een koppeling rechtstreeks naar hem of zijn groep (ShareType V/C).
  3. 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