Il problema in quel caso non riguarda esattamente l'ordine di autorizzazione, ma l'ordine di esecuzione.
In ripresa, per PostgreSQL:
1- Le viste che accedono a tabelle avranno la precedenza sull'autorizzazione delle tabelle
2- Le funzioni di visualizzazione delle viste dovranno valutare tutte le funzioni, prima di essere verificate, quindi le funzioni devono essere eseguite prima di accedere alla vista, anche se la vista non ha autorizzazioni di selezione ...
Come possiamo provarlo?
In postgresql, le viste sono in grado di darti le autorizzazioni per effettuare una selezione in una tabella, anche se l'utente non dispone di tali autorizzazioni.
Per esempio:
create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1;
Accedi come utente 1:
select * from table1 (permission denied)
select * from view2 (sucess - the query executes)
Nel caso, l'utente sarà in grado di selezionare view2 anche senza avere il permesso di selezionare la tabella.
Ma cosa succede se facciamo la stessa cosa con una funzione ? Il comportamento NON è lo stesso. Consente di creare una funzione che attende 5 secondi prima di restituire 1 (quindi possiamo eseguire il debug se postgresql esegue la funzione ogni volta che chiamiamo la vista)
CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds
create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1;
Accedi come utente 1:
select * from something(); (permission denied for something)
select * from view1 (permission denied for something )
L'autorizzazione a fare la selezione sulla vista non sovrascrive l'autorizzazione della funzione, e ancora peggio se revochiamo le autorizzazioni da view1, il messaggio mostra ancora che postgresql ha interrotto la nostra query a causa della funzione, indipendentemente dall'autorizzazione della vista. (questo è esattamente ciò che sta accadendo nella domanda)
Ma la funzione viene davvero verificata per prima? Se diamo le autorizzazioni 'all' alla funzione, ma revochiamo l'autorizzazione di visualizzazione ...
grant all on function something to user1;
revoke all on view1 from user1;
select * from view1;
Delayed 5 seconds... (the function executed!)
Permission denied for select on view1
Come vedi postgresql ASPETTATO 5 SECONDI prima di dire che non abbiamo il permesso di emettere la vista , mostrando che la funzione "qualcosa ()" è eseguita. Pertanto, il ritorno dei dati della funzione deve esistere prima del controllo della vista.
Quindi ora con questo test, ora sappiamo che PostgreSQL aveva bisogno di valutare tutte le funzioni prima di continuare la nostra query, è come se la query non esistesse fino a quando tutte le funzioni coinvolte non saranno completamente completate, quindi la vista non può essere risolta per postgresql sapere se abbiamo o meno il permesso di selezionarlo.
Penso che questo risponda alla tua domanda nei termini di "ordine di autorizzazione", ma perché postgresql deve valutare tutte le funzioni prima di continuare, questa è un'altra domanda ...