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
LoginDetailstabla 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
SELECTinstrucción tiene éxito, ya que está seleccionando desde la vista, mientras que la segundaSELECTfalla 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
LastLoggedInAtvalorNULL, como se requiere en su pregunta.La segunda
SELECTdeclaració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
LastLoggedInAtvalor 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
LastLoggedInAty 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
@LastLoggedInAty@usernameque 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
SELECTdeclaraciones ejecutadas en ladbo.LoginDetailstabla:El filtro anterior usa la
dbo.fn_LoginDetailsRemoteUserPredicatefunción al pasar el nombre del usuario actual, junto con los valores de cada fila para laLastLoggedInAtcolumna de ladbo.LoginDetailstabla.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_LoginDetailsRemoteUserPredicatefunción.fuente
LastLoggedInAtcolumna.