Inspiré par diverses questions liées au schéma que j'ai vu ...SQL Server: comment autoriser les schémas?
Ownership chaining me permet d'accorder Executer sur une procédure stockée sans autorisations explicites sur les tables que j'utilise, si les deux procédures stockées et les tables sont dans le même schéma.
Si nous utilisons des schémas séparés, je devrais explicitement attribuer GRANT XXX sur les tables du schéma différent. L'exemple de chaînage de propriété le démontre. Cela signifie que l'utilisateur proc en cours d'enregistrement peut lire/écrire vos tables directement. Cela équivaudrait à avoir un accès direct à vos variables d'instance dans une classe, en contournant getter/setters, en rompant l'encapsulation.
Nous utilisons également la sécurité de niveau ligne pour restreindre ce que quelqu'un voit et nous l'appliquons dans les procédures stockées. Alors, comment pouvons-nous maintenir la séparation du schéma et empêcher l'accès direct à la table?
Bien sûr, la question ne s'applique pas si vous utilisez un ORM ou n'utilisez pas de procs stockés. Mais je ne suis pas demander si je devrais utiliser un ORM ou quelqu'un proc dans le cas où stocké ressent le besoin de me éclairer ...
Modifier, par exemple
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
Edit 2:
-
nous
- ne pas utiliser « la propriété de chaînage de base de données croisée »
- sécurité au niveau de la ligne est un hareng saur et hors de propos: nous ne l'utilisez pas partout
Serait-il possible de fournir un exemple codé du scénario de schéma séparé que vous décrivez pour plus de clarté? Dans votre scénario, les deux schémas séparés ont-ils le même propriétaire? –
Pourquoi voter ferme pour serverfault? C'est pour les singes de code, pas les administrateurs système ... – gbn
@John Sansom: oui je le ferai. – gbn