Jak działa udostępnianie plików na rekordach (ContentDocumentLink)
Model danych Salesforce Files: ContentDocument, ContentVersion i ContentDocumentLink — oraz jak ShareType i Visibility decydują, kto zobaczy plik.
Jeśli kiedykolwiek zastanawiałeś się, dlaczego plik pojawia się akurat w tym miejscu w Salesforce — albo musiałeś odpytać pliki w Apex lub raporcie — potrzebujesz znać model danych, który leży u podstaw. Nowoczesne Salesforce Files to trzy powiązane obiekty, a dwa pola na powiązaniu decydują, kto co widzi. To jest administratorsko-deweloperski towarzysz artykułu kto może zobaczyć plik w Salesforce.
Trzy obiekty
| Obiekt | Czym jest | Ile |
|---|---|---|
| ContentDocument | Sam plik | Jeden na plik |
| ContentVersion | Konkretna wersja zawartości pliku | Jedna na przesłanie/poprawkę |
| ContentDocumentLink | Powiązanie łączące plik z rekordem, użytkownikiem lub grupą | Wiele na plik |
Gdy przesyłasz plik, tworzysz ContentVersion, który Salesforce opakowuje w ContentDocument. Gdy dołączasz ten plik do rekordu lub udostępniasz go komuś, tworzysz ContentDocumentLink.
Plik to ContentDocument. To, gdzie się znajduje i kto może go zobaczyć, zawiera się w całości w jego rekordach ContentDocumentLink.
ContentDocumentLink: pole, które liczy się najbardziej
Wiersz ContentDocumentLink mówi „ten plik jest powiązany z tamtą rzeczą, na tym poziomie dostępu, dla tej grupy odbiorców”. Jego kluczowe pola:
LinkedEntityId — do czego plik jest dołączony
Identyfikator tego, z czym plik jest powiązany:
- Rekord (Account, Opportunity, Case, obiekt niestandardowy…) → plik jest „dołączony” do tego rekordu.
- User lub Group → plik jest udostępniony bezpośrednio tej osobie lub grupie.
Jeden plik może mieć jednocześnie wiele powiązań — być dołączony do dwóch rekordów i udostępniony jednemu użytkownikowi naraz. Każde powiązanie to niezależna ścieżka dostępu do pliku.
ShareType — poziom dostępu
| Wartość | Poziom | Co umożliwia |
|---|---|---|
V | Viewer | Otwieranie i pobieranie |
C | Collaborator | Przeglądanie, edycja, przesyłanie nowych wersji, zmiana udostępniania |
I | Inferred | Poziom dostępu dziedziczony z dostępu do powiązanego rekordu |
Inferred (I) to wartość najważniejsza dla plików dołączonych do rekordów: dostęp użytkownika do pliku jest wyprowadzany z jego dostępu do rekordu, z którym plik jest powiązany. To właśnie mechanizm stojący za zasadą „każdy, kto widzi rekord, widzi jego pliki”.
Visibility — która grupa odbiorców
| Wartość | Grupa odbiorców |
|---|---|
AllUsers | Użytkownicy wewnętrzni i zewnętrzni (społecznościowi) |
InternalUsers | Tylko użytkownicy wewnętrzni |
SharedUsers | Tylko użytkownicy, którym plik został wprost udostępniony |
To właśnie to pole po cichu psuje dostęp w Experience Cloud: plik dołączony do rekordu z Visibility = InternalUsers nie pokaże się użytkownikom społecznościowym, mimo że widzą oni rekord. (Więcej na ten temat w pliki a użytkownicy gościnni / Experience Cloud.)
Jak dostęp jest faktycznie rozstrzygany
Składając to w całość, użytkownik może zobaczyć plik, jeśli którekolwiek z jego rekordów ContentDocumentLink mu na to pozwala:
- Powiązanie z rekordem, do którego ma dostęp (ShareType
I) — dostęp dziedziczony z udostępniania rekordu. - Powiązanie bezpośrednio z nim lub jego grupą (ShareType
V/C). - Członkostwo w bibliotece lub link publiczny (osobne mechanizmy).
…a pole Visibility powiązania musi obejmować jego grupę odbiorców. Większość zgłoszeń typu „plik niewidoczny” sprowadza się do brakującego powiązania lub zbyt wąsko ustawionej wartości Visibility.
Odpytywanie
Ponieważ wszystko to są dane, możesz je sprawdzić bezpośrednio — np. znaleźć każde miejsce, w którym plik jest udostępniony:
SELECT ContentDocumentId, LinkedEntityId, ShareType, Visibility
FROM ContentDocumentLink
WHERE ContentDocumentId = '069...'
Każdy wiersz to jedna grupa odbiorców, która może dotrzeć do pliku. Aby wyliczyć konkretne osoby, musisz następnie rozwinąć pełną grupę odbiorców dla każdego rekordu z LinkedEntityId — i tu robi się szybko bardzo obszernie.
Od wierszy do odpowiedzi po ludzku
Plik dołączony do kilku rekordów dziedziczy całą grupę odbiorców każdego z nich — hierarchię ról, reguły udostępniania, zespoły i wszystko inne — pomnożoną przez każdy rekord ContentDocumentLink. Odtworzenie tego ręcznie z surowych wierszy to dokładnie ta praca, w której kryje się przypadkowa ekspozycja danych. AgentForceAccess przechodzi przez rekordy ContentDocumentLink oraz udostępnianie rekordów stojące za każdym z nich i odpowiada po ludzku na pytanie „kto może zobaczyć ten plik i dlaczego”.
Najczęściej zadawane pytania
Jaka jest różnica między ContentDocument, ContentVersion i ContentDocumentLink?
ContentDocument to sam plik (jeden na plik). ContentVersion to konkretna wersja tego pliku (jedna na każde przesłanie lub poprawkę). ContentDocumentLink łączy ContentDocument z czymś innym — rekordem, użytkownikiem lub grupą — i przenosi poziom dostępu oraz widoczność dla tego powiązania.
Na co wskazuje LinkedEntityId?
To identyfikator tego, do czego plik jest powiązany. W przypadku pliku dołączonego do rekordu jest to ID rekordu (Account, Opportunity, Case itd.); w przypadku pliku udostępnionego bezpośrednio osobie lub grupie jest to ID typu User lub Group. Jeden plik może mieć jednocześnie wiele rekordów ContentDocumentLink.
Co oznaczają wartości V, C i I w polu ShareType?
V = Viewer (otwieranie i pobieranie), C = Collaborator (przeglądanie, edycja, przesyłanie wersji, zmiana udostępniania), I = Inferred (poziom dostępu, który użytkownik otrzymuje pośrednio z dostępu do powiązanego rekordu). Inferred to mechanizm, dzięki któremu dostęp do rekordu propaguje się na plik.
Do czego służy pole Visibility?
Visibility określa, komu powiązanie udostępnia plik: AllUsers (użytkownicy wewnętrzni i zewnętrzni/społecznościowi), InternalUsers (tylko wewnętrzni) lub SharedUsers (tylko użytkownicy, którym plik został wprost udostępniony). Użytkownicy Community/Experience Cloud zwykle potrzebują wartości AllUsers, aby zobaczyć plik dołączony do rekordu.
Zobacz to na swojej organizacji
AgentForceAccess wyjaśnia prostym językiem, dlaczego dowolny użytkownik widzi dowolny rekord lub plik — w każdym mechanizmie współdzielenia Salesforce.
Poproś o wczesny dostęp