Du har inte berättat för oss hur du vet om en användare har rättigheter till ett givet id. Det är en nödvändig information. Jag ska lägga in lite kod nedan som förutsätter att du lägger till en kolumn i din fråga som heter hasRights och att denna kolumn kommer att ha ett nollvärde om användaren inte har rättigheter och ett värde på ett om de har det. Du kan behöva justera detta, eftersom jag inte har några data att testa med men förhoppningsvis kommer det dig nära.
I grund och botten ändras frågan till att bara lägga till 1 till nivån om användaren har rättigheter. Det läggs också bara till i sorteringsvägen om användaren har rättigheter, annars läggs en tom sträng till. Så, om id 8 och 9 är de enda objekten som användaren har tillgång till, bör du se nivåerna 1 och 2 och sortera sökvägar som liknar '5/8/9' snarare än '5/6/8/9'. Om du fortfarande inte kan få det att fungera skulle det hjälpa oss enormt om du postade ett exempelschema på SqlFiddle.
WITH Tree
AS (
SELECT
id,
parent,
0 AS Level,
id AS Root,
hasRights AS HasRights,
CAST(id AS VARCHAR(MAX)) AS Sort,
user_id
FROM SourceTable
WHERE parent IS NULL
UNION ALL
SELECT
st.id,
st.parent,
Level + st.hasRights AS Level,
st.parent AS Root,
st.hasRights AS HasRights,
uh.sort + CASE st.hasRights WHEN 0 THEN '' ELSE '/' + CAST(st.id AS VARCHAR(20)) END AS Sort,
st.user_id
FROM SourceTable AS st
JOIN Tree uh ON uh.id = st.parent
)
SELECT * FROM Tree AS t
JOIN UserTable AS ut ON ut.id = t.user_id AND ut.user_id = '141F-4BC6-8934'
ORDER BY Sort