SQL Server: Berechtigungsschemata

Inspiriert von verschiedenen schemabezogenen Fragen, die ich gesehen habe ...

Eigentumsverkettung Ermöglicht es mir, EXECUTE für eine gespeicherte Prozedur ohne explizite Berechtigungen für von mir verwendete Tabellen zu gewähren, wenn sich sowohl gespeicherte Prozeduren als auch Tabellen im selben Schema befinden.

Wenn wir separate Schemata verwenden, müsste ich XXX explizit für die Tabellen mit unterschiedlichen Schemata gewähren. Das Beispiel der Eigentumsverkettung zeigt dies. Dies bedeutet, dass der gespeicherte proz-ausführende Benutzer Ihre Tabellen direkt lesen / schreiben kann.

Dies wäre wie ein direkter Zugriff auf Ihre Instanzvariablen in einer Klasse, umgeht Getter / Setter und unterbricht die Kapselung.

Wir verwenden auch Sicherheit auf Zeilenebene, um die Anzeige einzuschränken, und wenden dies in den gespeicherten Prozeduren an.

Wie können wir also die Schematrennung aufrechterhalten und den direkten Tabellenzugriff verhindern?

Natürlich trifft die Frage nicht zu, wenn Sie einen ORM verwenden oder keine gespeicherten Prozesse verwenden. Aber ich binnicht frage, ob ich ein ORM oder einen gespeicherten Proc verwenden soll, falls jemand das Bedürfnis hat, mich aufzuklären ...

Bearbeiten, Beispiel

CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO

CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO

CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO

CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC AS USER = 'OwnsMultiSchema'
GO
--gives error on OtherSchema
EXEC MultiSchema1.P1
GO
REVERT
GO

CREATE PROC OtherSchema.PA
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
GRANT EXEC ON OtherSchema.PA TO OwnsMultiSchema
GO
EXEC AS USER = 'OwnsMultiSchema'
GO
--works
EXEC OtherSchema.PA
GO
REVERT
GO

Bearbeiten 2:

Wir verwenden keine datenbankübergreifende Besitzverkettung.Sicherheit auf Zeilenebene ist ein roter Hering und irrelevant: Wir verwenden sie nicht überall

Antworten auf die Frage(3)

Ihre Antwort auf die Frage