Problembehandlung bei der Metadatensichtbarkeit von verteilten partitionierten Sichten
Wenn ein Benutzer mit geringen Privilegien versucht, Daten über eine verteilte partitionierte Sicht einzufügen, zu aktualisieren oder zu löschen, generiert SQL Server den folgenden Fehler:
Fehler 4436 "Die UNION ALL-Sicht '%1!s!' kann nicht aktualisiert werden, da eine Partitionierungsspalte nicht gefunden wurde."
Dieser Fehler hat keine Auswirkung auf lokal partitionierte Sichten, etwa, wenn alle zugrunde liegenden Tabellen auf derselben Instanz von SQL Server vorhanden sind.
Hintergrund
Für verteilte Abfragen muss SQL Server in der Lage sein, die SQL-Definition von CHECK-Einschränkungen für die Tabellen des Remote- (verknüpften) Servers zu lesen. Dies bedeutet, dass der Aufrufer einer verteilten Abfrage eine CONTROL-, ALTER-, TAKE OWNERSHIP- oder VIEW DEFINITION-Berechtigung für die Remotetabelle besitzen muss. Wenn der Aufrufer der verteilten Abfrage keine der Berechtigungen besitzt, schlägt die Abfrage mit Fehler 4436 fehl.
Hinweis |
---|
Wenn ein Benutzer nicht über eine dieser Berechtigungen verfügt, ist der Wert der definition-Spalte in sys.check_constraints NULL, wenn der Benutzer den Katalog abfragt. |
So beheben Sie Fehler 4436
Erteilen Sie dem Aufrufer eine VIEW DEFINITION-Berechtigung für jede der verteilten partitionierten Sicht zugrunde liegende Zieltabelle, um die Definition der CHECK-Einschränkung für den Aufrufer sichtbar zu machen.
Angenommen, Server1 und Server2 sind vereinte Server und wurden zueinander als verknüpfte Server definiert. Angenommen, master.dbo.t1 ist die partitionierte Tabelle, auf die von allen Mitgliedern der Datenbankrolle dpv_users zugegriffen werden kann. Angenommen, dpv_users enthält alle Benutzer, die über SELECT-, INSERT-, UPDATE- und DELETE-Zugriff über die verteilte partitionierte Sicht verfügen.
Führen Sie den folgenden Code auf jedem verknüpften Server aus.
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