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