Come funziona la condivisione di file sui record (ContentDocumentLink)
Il data model dietro Salesforce Files: ContentDocument, ContentVersion e ContentDocumentLink, e come ShareType e Visibility decidono chi vede un file.
Se ti sei mai chiesto perché un file compare dove compare in Salesforce — o se hai dovuto interrogare i file in Apex o in un report — ti serve il data model sottostante. I moderni Salesforce Files sono tre oggetti correlati, e due campi sul collegamento decidono chi vede cosa. Questo è il complemento per admin/sviluppatori di chi può vedere un file in Salesforce.
I tre oggetti
| Oggetto | Cos’è | Quanti |
|---|---|---|
| ContentDocument | Il file stesso | Uno per file |
| ContentVersion | Una versione specifica del contenuto del file | Una per caricamento/revisione |
| ContentDocumentLink | Un collegamento che lega il file a un record, un utente o un gruppo | Molti per file |
Quando carichi un file crei una ContentVersion, che Salesforce incapsula in un ContentDocument. Quando alleghi quel file a un record o lo condividi con qualcuno, crei un ContentDocumentLink.
Il file è il ContentDocument. Dove vive e chi può vederlo sta interamente nei suoi ContentDocumentLink.
ContentDocumentLink: il campo che conta di più
Una riga di ContentDocumentLink dice “questo file è collegato a quella cosa, con questo livello di accesso, per questo pubblico”. I suoi campi chiave:
LinkedEntityId — a cosa è allegato il file
L’ID di ciò a cui il file è collegato:
- Un record (Account, Opportunity, Case, oggetto personalizzato…) → il file è “allegato a” quel record.
- Un User o Group → il file è condiviso direttamente con quella persona o quel gruppo.
Un singolo file può avere molti collegamenti contemporaneamente — allegato a due record e condiviso con un utente nello stesso momento. Ogni collegamento è un percorso indipendente per vedere il file.
ShareType — il livello di accesso
| Valore | Livello | Può fare |
|---|---|---|
V | Viewer | Aprire e scaricare |
C | Collaborator | Visualizzare, modificare, caricare nuove versioni, cambiare la condivisione |
I | Inferred | Livello di accesso ereditato dall’accesso al record collegato |
Inferred (I) è quello importante per i file allegati ai record: l’accesso di un utente al file è derivato dal suo accesso al record a cui è collegato. È il meccanismo dietro a “chiunque possa vedere il record può vedere i suoi file”.
Visibility — quale pubblico
| Valore | Pubblico |
|---|---|
AllUsers | Utenti interni ed esterni (community) |
InternalUsers | Solo utenti interni |
SharedUsers | Solo gli utenti con cui il file è esplicitamente condiviso |
Questo è il campo che rompe silenziosamente l’accesso da Experience Cloud: un file allegato a un record con Visibility = InternalUsers non comparirà agli utenti della community anche se possono vedere il record. (Maggiori dettagli in file e utenti guest / Experience Cloud.)
Come si risolve davvero l’accesso
Mettendo tutto insieme, un utente può vedere un file se uno qualsiasi dei suoi ContentDocumentLink glielo concede:
- Un collegamento a un record a cui può accedere (ShareType
I) — accesso ereditato dalla condivisione del record. - Un collegamento diretto a lui o al suo gruppo (ShareType
V/C). - L’appartenenza a una library, o un link pubblico (meccanismi separati).
…e la Visibility del collegamento deve includere il suo pubblico. La maggior parte dei ticket “file non visibile” si riduce a un collegamento mancante o a una Visibility troppo restrittiva.
Interrogarlo
Poiché è tutto dati, puoi ispezionarlo direttamente — ad esempio trovare ogni punto in cui un file è condiviso:
SELECT ContentDocumentId, LinkedEntityId, ShareType, Visibility
FROM ContentDocumentLink
WHERE ContentDocumentId = '069...'
Ogni riga è un pubblico che può raggiungere il file. Per enumerare le persone, devi poi espandere l’intero pubblico di condivisione di ciascun record LinkedEntityId — ed è qui che la cosa cresce in fretta.
Dalle righe a una risposta in linguaggio semplice
Un file allegato a più record eredita l’intero pubblico di ciascun record — gerarchia dei ruoli, regole di condivisione, team e tutto il resto — moltiplicato per ogni ContentDocumentLink. Ricostruire tutto questo a mano dalle righe grezze è esattamente il lavoro in cui si nasconde l’esposizione accidentale. AgentForceAccess percorre i ContentDocumentLink e la condivisione del record dietro ciascuno di essi, e risponde a “chi può vedere questo file, e perché” in linguaggio semplice.
Domande frequenti
Qual è la differenza tra ContentDocument, ContentVersion e ContentDocumentLink?
ContentDocument è il file stesso (uno per file). ContentVersion è una versione specifica di quel file (una per ogni caricamento/revisione). ContentDocumentLink collega un ContentDocument a qualcos'altro — un record, un utente o un gruppo — e porta con sé il livello di accesso e la visibilità per quel collegamento.
A cosa punta LinkedEntityId?
È l'ID di ciò a cui il file è collegato. Per un file allegato a un record è l'ID del record (Account, Opportunity, Case, ecc.); per un file condiviso direttamente con una persona o un gruppo è un ID di User o Group. Un singolo file può avere molti ContentDocumentLink contemporaneamente.
Cosa sono i valori V, C e I di ShareType?
V = Viewer (apre e scarica), C = Collaborator (visualizza, modifica, carica versioni, cambia la condivisione), I = Inferred (il livello di accesso che un utente ottiene indirettamente dall'accesso al record collegato). Inferred è il modo in cui l'accesso al record si propaga a un file.
Cosa fa il campo Visibility?
Visibility imposta a chi è esposto il collegamento: AllUsers (utenti interni ed esterni/community), InternalUsers (solo interni) o SharedUsers (solo gli utenti con cui il file è esplicitamente condiviso). Gli utenti Community/Experience Cloud di solito hanno bisogno di AllUsers per vedere un file allegato a un record.
Provalo sulla tua org
AgentForceAccess spiega, in linguaggio chiaro, perché un utente può vedere un record o un file — attraverso ogni meccanismo di condivisione di Salesforce.
Richiedi accesso anticipato