Ausgangslage:
-
In einer Datenbank mydb1 befindet sich eine Tabelle myschema1.mytable
-
In einer zweiten Datenbank mydb2 befindet sich eine View
myschema2.myview
-
View myschema2.myview selektiert Tabelle myschema1.mytable
Anforderung:
Es soll ein Server-Zugang mylogin geschaffen werden, der Daten über View
myschema2.myview selektieren darf, aber nicht direkt aus Tabelle
myschema1.mytable.
Lösung:
-
Login mylogin erzeugen mit dem User-Mapping: mydb1 -> myuser1
und mydb2 -> myuser2.
-
User myuser1 erhält keine speziellen Rechte.
-
User myuser2 erhält Leserecht auf View myschema2.myview.
-
Den Schemata myschema1 und myschema2 den gleichen Owner geben
(und damit den enthaltenen Objekten mytable und myview).
-
Für die Datenbanken mydb1 und mydb2 "cross-database ownership
chaining" aktivieren.
SQL:
CREATE LOGIN mylogin WITH PASSWORD = 'mypassword';
CREATE DATABASE mydb1;
ALTER DATABASE mydb1 SET DB_CHAINING ON;
CREATE DATABASE mydb2;
ALTER DATABASE mydb2 SET DB_CHAINING ON;
USE mydb1;
CREATE SCHEMA myschema1;
CREATE TABLE myschema1.mytable (id INT PRIMARY KEY);
CREATE USER myuser1 FOR LOGIN mylogin;
USE mydb2;
CREATE SCHEMA myschema2;
CREATE USER myuser2 FOR LOGIN mylogin;
CREATE VIEW myschema2.myview AS SELECT * FROM mydb1.myschema1.mytable;
GRANT SELECT ON myschema2.myview TO myuser2;
Über mylogin ausgeführt:
-- erfolgreich
SELECT * FROM mydb2.myschema2.myview;
-- schlägt fehl: The SELECT permission was denied on the object 'mytable',
-- database 'mydb1', schema 'myschema1'
SELECT * FROM mydb1.myschema1.mytable;