Condividi tramite


Risoluzione dei problemi relativi alla visibilità dei metadati delle viste partizionate distribuite

Se un utente con privilegi di basso livello tenta di inserire, aggiornare o eliminare dati tramite una vista partizionata distribuita, SQL Server genera l'errore seguente:

Errore 4436 "La vista UNION ALL '%1!s!' non è aggiornabile perché non è stata trovata alcuna colonna di partizionamento."

Questo problema non riguarda le viste partizionate a livello locale, ad esempio nel caso in cui tutte le tabelle sottostanti si trovino sulla stessa istanza di SQL Server.

Informazioni di supporto

Per le query distribuite, SQL Server deve essere in grado di leggere la definizione SQL del vincolo CHECK sulle tabelle del server remoto (collegato). Il chiamante di una query distribuita deve pertanto disporre dell'autorizzazione CONTROL, ALTER, TAKE OWNERSHIP o VIEW DEFINITION sulla tabella remota. In caso contrario, la query ha esito negativo e viene generato l'errore 4436.

[!NOTA]

Se l'utente non dispone di una delle autorizzazioni specificate, il valore della colonna definition in sys.check_constraints sarà NULL quando l'utente eseguirà una query sul catalogo.

Per risolvere l'errore 4436

Per rendere visibile al chiamante la definizione del vincolo CHECK, concedere al chiamante l'autorizzazione VIEW DEFINITION su tutte le tabelle di destinazione sottostanti la vista partizionata distribuita.

Ad esempio, si supponga che Server1 e Server2 costituiscano una federazione di server e siano stati definiti come server collegati tra loro. Si supponga inoltre che master.dbo.t1 sia la tabella partizionata accessibile a tutti i membri del ruolo del database dpv_users. Infine, si supponga che dpv_users contenga tutti gli utenti che dispongono delle autorizzazioni di accesso SELECT, INSERT, UPDATE e DELETE tramite la vista partizionata distribuita.

Eseguire il codice seguente su ogni server collegato.

CREATE TABLE t1(c INT PRIMARY KEY CHECK (...)) ; -- CHECK is different on each server.
GO

GRANT SELECT, INSERT, UPDATE, DELETE, VIEW DEFINITION ON t1 TO dpv_users ;
GO

CREATE VIEW the_dpv AS
    SELECT * FROM Server1.master.dbo.t1
    UNION ALL
    SELECT * FROM Server2.master.dbo.t1 
GO