Udostępnij za pośrednictwem


Troubleshooting Metadata Visibility of Distributed Partitioned Views

Jeśli najniższych uprawnień próba do wstawiania, aktualizacji lub usuwania danych przy użyciu rozproszonej widokiem podzielonym na partycje SQL Server generuje następujący komunikat o błędzie:

Błąd 4436 "wyświetlić UNION ALL" %. * ls nie jest aktualizowalny, ponieważ nie można odnaleźć kolumna partycjonowania. „

Ten problem nie wpływa na widoki lokalnie podzielonym na partycje, na przykład jeśli istnieją wszystkich tabel, w tym samym wystąpieniu SQL Server.

Tło

W przypadku kwerend rozproszonych SQL Server musi być w stanie odczytać definicji SQL ograniczeń CHECK dla tabel (połączone) serwera zdalnego. Oznacza to, że wywołujący kwerenda rozproszona, trzeba mieć uprawnienia kontroli, ALTER, własność UWZGLĘDNAIJĄ lub definicja VIEW w tabela zdalnej.Jeśli wywołujący kwerenda rozproszona nie ma jednego z uprawnień, kończy się niepowodzeniem z powodu błędu 4436.

Uwaga

Jeśli użytkownik nie ma jednego z tych uprawnień, wartość definicja kolumnasys.check_constraints jest równa zerowa, gdy użytkownik wykonuje kwerendę w katalogu.

Aby rozwiązać błąd 4436

Aby wyświetlić definicję ograniczenia CHECK do obiektu wywołującego, udzielić wywołującego definicja VIEW w każdej tabela miejsce docelowe źródłową rozproszony widok partycjonowany.

Na przykład załóżmy, że Server1 i Server2 stowarzyszoną serwerów i zostały zdefiniowane jako serwery połączone ze sobą. Załóżmy, że master.dbo.t1 jest to tabela partycjonowana, które mogą być udostępniane przez wszystkich członków dpv_users Rola bazy danych. Załóżmy, że dpv_users zawiera wszystkich użytkowników, którzy mają SELECT, INSERT, UPDATE i DELETE dostęp za pomocą rozproszonego widoku podzielonym na partycje.

Wykonać następujący kod dla każdego serwer połączony.

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