Drobna uwaga na temat tego, co się stanie jeśli właścicielem bazy danych jest sa i dodatkowo masz włączoną opcję serwera cross db ownership chaining
Zaczynamy od założenia 2 baz danych:
CREATE DATABASE DBPUB GO USE DBPUB GO EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false
CREATE DATABASE DBPRIV GO USE DBPRIV GO EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false
Teraz w bazach danych zakładamy obiekty: tabelę w bazie DBPRIV, a w bazie DBPUB widok korzystający z tabeli z bazy DBPRIV
USE DBPRIV GO CREATE TABLE tblPriv (id int) USE DBPUB GO CREATE VIEW vwPub AS SELECT id FROM DBPRIV.dbo.tblPriv GO
Czy taka konstrukcja zadziała? Tak, w końcu w tej chwili jesteś w roli sysadmin, która ma db_owner w każdej bazie danych:
SELECT * FROM vwPub GO
Ale czy zadziała to również dla innych użytkowników? Zakładamy login PubLogin, który w bazie DBPUB ma uprawnienia db_owner, ale w bazie DBPRIV jest tylko w roli public, bez żadnych dodatkowych uprawnień, więc nie może np. wykonywać select do tabeli:
USE [master] GO CREATE LOGIN [PubLogin] WITH PASSWORD=N'Pa$$w0rd' GO USE DBPRIV GO CREATE USER [PubLogin] FOR LOGIN [PubLogin]
USE DBPUB GO CREATE USER [PubLogin] FOR LOGIN [PubLogin] ALTER ROLE [db_owner] ADD MEMBER [PubLogin] GO
Jeśli zalogujesz się na PubLogin i wykonasz w bazie DBPUB select do widoku vwPub to otrzymasz błąd (o ile nie grzebałeś wcześniej przy opcji cross db ownershp chaining):
Msg 229, Level 14, State 5, Line 4
The SELECT permission was denied on the object 'tblPriv’, database 'DBPRIV’, schema 'dbo’.
W sumie sensowne. PubLogin ma uprawnienia w DBPUB ale w bazie DPPRIV jest bardzo nisko uprzywilejowany. Zmieńmy teraz opcję cross db ownership chaining:
exec sp_configure 'cross db ownership chaining', 1 RECONFIGURE
Teraz zapytanie do widoku wykonane przez PubLogin zakonczy się sukcesem (nawet bez przelogowywania). Oznacza to, że użytkownik, który jest db_owner w bazie DBPUB może tworzyć sobie widoki/procedury, które będą sięgać do obiektów innych baz, nawet jeśli nie ma do nich nadanych bezpośrednio uprawnień!
To właśnie dlatego cross db ownership chaining jest domyślnie wyłączona. Jeśli tego rodzaju mechanizmy chesz włączyć to lepiej robić to za pomocą ustawiania opcji wybranych baz danych. Działaniu opcji nie podlegają bazy systemowe, które zawsze pozwalają na ownership chaining, nawet przy wyłączonej opcji.