SQL Server Row Level Security
En SQL Server 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.
Create database TestRowLevel
go
go
Create table dbo.Ordenes
(
Codigo_Cliente int,
Nombre_Producto varchar(100),
Fecha datetime,
Cantidad int,
ProcesadoPor varchar(10)
)
go
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
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
Create security Policy fn_seguridad
add Filter Predicate
dbo.fn_SeguridadOrdenes(ProcesadoPor)
on dbo.Ordenes
go
Create user VICTOR without login;
Create user HUGO without login;
Create user CLAUDIA without login;
Create user SOFIA without login;
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;
Execute (‘SELECT * FROM DBO.ORDENES’) as user=‘VICTOR’;
go
go
go