Inspirado por diversas cuestiones relacionadas con el esquema que he visto ...Servidor SQL: ¿cómo permisos de esquemas?
Ownership chaining me permite el privilegio GRANT EXECUTE en un procedimiento almacenado sin permisos explícitos en las mesas que uso, tanto si el procedimiento almacenado y las tablas están en el mismo esquema.
Si utilizamos esquemas separados, entonces tendría que CONCEDER explícitamente XXX en las tablas de diferentes esquemas. El ejemplo de encadenamiento de propiedad demuestra eso. Esto significa que el usuario que ejecuta el proceso almacenado puede leer/escribir sus tablas directamente.
Esto sería como tener acceso directo a las variables de su instancia en una clase, evitando getter/setters, rompiendo la encapsulación.
También utilizamos seguridad a nivel de fila para restringir lo que alguien ve y aplicamos esto en los procedimientos almacenados.
Entonces, ¿cómo podemos mantener la separación del esquema y evitar el acceso directo a la tabla?
Por supuesto, la pregunta no se aplicará si usa un ORM o no utiliza procs almacenados. Pero no estoy preguntando si debería utilizar un ORM o procedimiento almacenado en caso de que alguien se siente la necesidad de que me ilumine ...
Editar, ejemplo
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
Edición 2:
- no utilizamos "encadenamiento de propiedad entre bases de datos" seguridad a nivel de
- Fila es una pista falsa e irrelevante: no usamos todas partes
¿Sería posible proporcionar un ejemplo codificado del escenario de esquema separado que está describiendo para mayor claridad, por favor? En su escenario, ¿los dos esquemas separados tienen el mismo propietario? –
¿Por qué votar cerrar para serverfault? Es para los monos de código, no para los administradores de sistemas ... – gbn
@John Sansom: sí, lo haré. – gbn