Das wird auch geprüft, allerdings nicht mit der SQL Abfrage hier.
Hierfür lasse ich mir einfach die Daten aus der Users_Sites und Users_Roles geben und mir dann rekursiv nach Oben aus der Sites Tabelle alle Oberpunkte. Ich bekomme dann ein hierarchisches Array raus, mit welchem ich dann z.B. das Menü zusammen bauen kann. Oder eben in einer "header" Datei, welche vor jedem Seitenaufruf eingebunden ist, überprüfen ob die Seite wirklich im Array vorhanden ist.
Damit nicht bei jedem Seiten/Funktionsaufruf die Daten aus der DB neu gezogen werden müssen, mache ich das einmal beim Einloggen und speichere dieses in eine Session-Variable. Sollte dann ein Nutzer eine Funktion während der aktiven Session bekommen, muss er sich eben einmal neu einloggen.