Tengo una tabla estructurada así (Simplificado)
Name, EMail, LastLoggedInAt
Tengo un usuario en SQL Server (RemoteUser) que solo debería poder ver los datos (a través de una consulta de selección) donde el campo LastLoggdInAt no es nulo.
Parece que puedo hacer esto? ¿Es posible?
Respuestas:
El modelo de seguridad de SQL Server le permite otorgar acceso a una vista sin otorgar acceso a las tablas subyacentes.
Dado que el código de ejemplo es una excelente manera de mostrar un concepto, considere lo siguiente, con una
LoginDetails
tabla y la vista correspondiente:Crearemos un inicio de sesión y un usuario, luego le asignaremos a ese usuario los derechos para seleccionar filas de la vista, sin tener ningún derecho para ver la tabla en sí.
Ahora, insertaremos dos filas de prueba:
Esto prueba el modelo de seguridad. La primera
SELECT
instrucción tiene éxito, ya que está seleccionando desde la vista, mientras que la segundaSELECT
falla porque el usuario no tiene acceso directo a la tabla.Tenga en cuenta que los resultados de la vista excluyen la fila donde está el
LastLoggedInAt
valorNULL
, como se requiere en su pregunta.La segunda
SELECT
declaración contra la tabla subyacente devuelve un error:Limpiar:
Alternativamente, si tiene SQL Server 2016 o más reciente, puede usar un predicado de seguridad de nivel de fila para evitar que ciertos usuarios vean filas con un
LastLoggedInAt
valor NULL .Primero, creamos la tabla, un inicio de sesión, un usuario para ese inicio de sesión y otorgamos acceso a la tabla:
A continuación, insertamos un par de filas de muestra. Una fila con un valor nulo
LastLoggedInAt
y otra con un valor no nulo para esa columna.Aquí, estamos creando una función de tabla con valores de esquema que devuelve una fila con 0 o 1 dependiendo del valor de las variables
@LastLoggedInAt
y@username
que se pasan a la función. Esta función será utilizada por un predicado de filtro para eliminar las filas que queremos ocultar a ciertos usuarios.Este es el filtro de seguridad que elimina las filas de las
SELECT
declaraciones ejecutadas en ladbo.LoginDetails
tabla:El filtro anterior usa la
dbo.fn_LoginDetailsRemoteUserPredicate
función al pasar el nombre del usuario actual, junto con los valores de cada fila para laLastLoggedInAt
columna de ladbo.LoginDetails
tabla.Si consultamos la tabla como un usuario normal:
vemos todas las filas:
Sin embargo, si probamos como
RemoteUser
:solo vemos filas "válidas":
Y, limpiamos:
Tenga en cuenta que el enlace de esquema de una función a la tabla de esta manera hace que sea imposible modificar la definición de la tabla sin eliminar primero el predicado del filtro y la
dbo.fn_LoginDetailsRemoteUserPredicate
función.fuente
LastLoggedInAt
columna.