SQL Server 2016 Row Level Security

En SQL Server 2016 la seguridad a nivel de fila (Row Level Security) es una característica que permite un control más preciso al acceso a las filas de una tabla. Row Level Security controla fácilmente qué usuarios pueden acceder a los datos independientemente de la aplicación, restringiendo las filas en función de la identidad del usuario o contexto de seguridad.

En nuestro ejemplo contamos con la tabla Ordenes, de la cual necesitamos limitar el acceso a las filas y que cada usuario solo pueda ver las Ordenes que ingreso y no las de otros usuarios.

Create database TestRowLevel
go

Use TestRowLevel
go
–Creacion de tabla
Create table dbo.Ordenes
(
Codigo_Cliente int,
Nombre_Producto varchar(100),
Fecha datetime,
Cantidad int,
ProcesadoPor varchar(10)
)
go
 — ingreso de datos de ejemplo
Insert into dbo.Ordenes values(101,‘Monitores’,‘2016-08-11 00:34:51:090’,100,‘SOFIA’)

Insert into dbo.Ordenes values(102,‘Teclados CORP’,‘2016-01-08 19:44:51:090’,700,‘SOFIA’)
Insert into dbo.Ordenes values(103,‘Memoria RAM’,‘2015-08-19 19:44:51:090’,1500,‘SOFIA’)
Insert into dbo.Ordenes values(102,‘Disco Duro’,‘2014-08-19 19:44:51:090’,1099,‘CLAUDIA’)
Insert into dbo.Ordenes values(101,‘Web Cam’,‘2014-08-04 19:44:51:090’,5600,‘CLAUDIA’)
Insert into dbo.Ordenes values(103,‘Ratones’,‘2015-08-10 19:44:51:090’,498,‘HUGO’)
Insert into dbo.Ordenes values(102,‘Cable HDMI’,‘2015-04-17 19:44:51:090’,999,‘HUGO’)
Insert into dbo.Ordenes values(101,‘Cable VGA’,‘2015-08-21 19:44:51:090’,543,‘VICTOR’)
Insert into dbo.Ordenes values(103,‘Conectores RJ45’,‘2015-08-06 19:44:51:090’,876,‘VICTOR’)
Insert into dbo.Ordenes values(102,‘Memory Stick’,‘2015-08-26 19:44:51:090’,665,‘VICTOR’)
go

–Creación de la función de predicado
que filtra que Ordenes fueron realizadas por cada usuario, el Filtro será
aplicada durante la ejecución de la consulta

Create Function dbo.fn_SeguridadOrdenes (@ProcesadoPor sysname)
returns table with Schemabinding
as
return select 1 as [fn_SeguridadOrdenes_result]
from
dbo.Ordenes
where @ProcesadoPor = user_name()
go

–Creacion de la politica de seguridad al crearla aplicará la limitación de acceso a los usuarios

Create security Policy fn_seguridad
add Filter Predicate
dbo.fn_SeguridadOrdenes(ProcesadoPor)
on dbo.Ordenes
go

–creación de usuarios para prueba

Create user VICTOR without login;
Create user HUGO without login;
Create user CLAUDIA without login;
Create user SOFIA without login;

–asignación de permisos a los usuarios
de prueba

GRANT SELECT ON dbo.Ordenes to CLAUDIA;
GRANT SELECT ON dbo.Ordenes to SOFIA;
GRANT SELECT ON dbo.Ordenes to HUGO;
GRANT SELECT ON dbo.Ordenes to VICTOR;

–Ejecución de una consulta en nombre de los usuarios para probar que cada usuario puede ver solo sus ordenes

Execute (‘SELECT * FROM DBO.ORDENES’) as user=‘VICTOR’;
go

 

Execute (‘SELECT * FROM DBO.ORDENES’) as user=‘CLAUDIA’;
go

 

Execute (‘SELECT * FROM DBO.ORDENES’) as user=‘SOFIA’;
go

Leave a Reply

Your email address will not be published. Required fields are marked *