miércoles, 25 de noviembre de 2020

SQL Server Propiedades de Base de Datos – General

Introducción

La principal razón de ser de Microsoft SQL Server es la de administrar las bases de datos de los usuarios, ya sea individuos o empresas, que requieren almacenar y manejar sus datos, la cual, se convertirá en la información esencial para los efectos requeridos.
Ya se ha indicado y expuesto las propiedades y configuración de los servicios de servidor de Microsoft SQL Server, en este post iniciaré con las propiedades de las bases de datos, un aspecto importante, que se manejará en estas entregas, es que la visión será la que se observe con el uso de SQL Server Management Studio, existirá una diferencia con la que se obtenga con otras herramientas, o con las características que se presentan en Azure.
Debe tenerse en cuenta que la ventana de Propiedades de Base de Datos presentara las siguientes páginas, las cuales se pueden ver en la parte izquierda de la ventana:
  • General – Presenta las propiedades generales de la base de datos
  • Archivos – Presenta las propiedades de los archivos conteniendo la base de datos
  • Grupo de Archivos – Presenta las propiedades de los grupos de archivos que se han definido para los archivos que contienen la base de datos
  • Opciones – Presenta los valores establecidos para distintas opciones de configuración de operación de la base de datos
  • Seguimiento de Cambios – Presenta los valores establecidos para llevar a cabo el seguimiento de los cambios realizados en la base de datos.
  • Permisos – Presenta los permisos otorgados a para la base de datos
  • Propiedades Extendidas – Presenta las propiedades establecidas por los usuarios para la base de datos
  • Reflejo – Presenta los valores establecidos para llevar a cabo las actividades de reflejo de las bases de datos
  • Envío de registro – Presenta los valores establecidos para llevar a cabo las actividades de envío de registro de la base de datos
  • Almacén de consultas – Presenta el comportamiento de las consultas llevadas a cabo en la base de datos.
Las últimas tres páginas de la lista anterior no están presentes en todas las bases de datos, las bases de datos de sistema no cuentan con ellas, dado que no puede establecerse una arquitectura de reflejo o de envío de registros. El uso de un almacén de consultas es una propiedad que fue aparece en Microsoft SQL Server 2016, por lo que esta propiedad no se encontrara en versiones previas.

Página General 

En esta ocasión, se presenta la pagina correspondiente a los aspectos generales de la base de datos, en esta página no es posible modificar los valores. Únicamente se presentarán los valores generales, como se observa a continuación:


Se puede apreciar que las propiedades mostradas están divididas en tres grupos, cabe mencionar que ningún valor de esta página puede ser modificado en ella, lo cual indica que los valores son de solo lectura. A continuación se explicarán cada una de las propiedades que se muestran en esta página.

Copias de seguridad

En esta sección se incluyen dos propiedades relacionadas a la base de datos, debe recordarse que una copia de seguridad es parte integral de la base de datos:

Propiedad
Descripción
Última copia de seguridad de la base de datos
En este espacio se muestra la fecha de la última copia de seguridad de la base de datos, obviamente una base de datos de reciente creación no mostrará algún dato en este espacio. Es importante indicar que es independiente del modelo de recuperación que se haya establecido a la base de datos.
Última copia de seguridad del registro de la base de datos
En este espacio se muestra la fecha en la que se realizó la última copia de seguridad del registro de transacciones de la base de datos. En este espacio se mostrará una fecha siempre que el modelo de recuperación sea completo o registro masivo, ya que el modelo de recuperación simple no permite realizar este tipo de copia de seguridad de registro de transacciones.

Base de Datos

Se refiere a propiedades directamente relacionadas a la base de datos:

Propiedad
Descripción
Nombre
En este espacio de muestra el nombre de la base de datos, este debe ser un nombre único dentro del servidor de Microsoft SQL Server. En muchas ocasiones se genera o define una base de datos se le asigna un nombre único, posteriormente se lleva a cabo una copia de seguridad y se restaura con un nombre diferente, de esta forma se tendrán dos bases de datos estructuralmente iguales con nombre diferente.
Estado
En este espacio se muestra el estado de la base de datos, es decir, el estado operacional de la base de datos, por defecto el estado es normal indicando que la base de datos está en linea, sin embargo, es posible obtener un estado diferente, dependiendo de las circunstancias operativas. Se indicarán los diferentes estados de la base de datos en la página Opciones. 
Propietario
Muestra el nombre del propietario de la base de datos.  El propietario se puede cambiar en la página Archivos.
Fecha de Creación
Muestra la fecha y hora en que se creó la base de datos, en el servidor. Cabe mencionar que muchas veces una base de datos es creada en un servidor diferente y al realizar la restauración desde una copia de seguridad, la fecha de la restauración se convierte en la fecha de creación de la base de datos.
Tamaño
Muestra el tamaño actual de la base de datos en megabytes.
Espacio Disponible
Muestra la cantidad de espacio disponible en la base de datos en megabytes.
Número de Usuarios
Muestra el número de usuarios configurados para la base de datos.

En la imagen se pueden apreciar dos propiedades adicionales, que están relacionadas con el uso de objetos optimizados en memoria, estableciendo los valores corrrespondientes a la cantidad de memoria asignada para esos objetos y la cantidad de memoria usada por esos objetos. Cabe mencionar que a partir de la version de Microsoft SQL Server 2014 se puede hacer uso de objetos optimizados en memoria.

Mantenimiento

Relacionado con el servicio de la base de datos. 

Propiedad
Descripción
Intercalación
Muestra la intercalación utilizada por la base de datos.  El tipo de intercalación se puede cambiar en la página Opciones de esta misma ventana.

Conclusión

Esta página inicial de las propiedades de la base de datos brinda información general de la base de datos, en caso de que se requiera más información de la base de datos, se deben acceder a las páginas correspondientes. Una forma alternativa de obtener la información de esta página a través del uso de T-SQL es utilizando el siguiente script para obtener los datos referidos en la página General:

/*******************************************************************************
-- Script : Get Database Properties General
-- Author : Julio J Bueyes
-- julio.bueyes@outlook.com
--
-- Description : This script helps to get a summarized view of the database properties – General page.
--
-- DISCLAIMER. This Code is provided for the purpose of illustration only and is not intended to be used in a production environment. 
--
-- THIS CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
-- INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************************/
-- Set the Database Name required
USE [Model];
GO

-- Declare a table variable to temporary store values 
DECLARE @DBSize TABLE
(
DBName sysname,
dbSize nvarchar(20),
dbUnaloc nvarchar(20),
reserved nvarchar(20),
datasize nvarchar(20),
idxSize nvarchar(20),
unused nvarchar(20)
)

-- Get the Space Used for database into table variable
INSERT INTO @DBSize
exec sp_spaceused   @oneresultset=1;

-- Generate Common Table expressions to generate query 
WITH LastFullBackup (database_name, LastBackupDate)
AS (
SELECT database_name, Max(backup_start_date) 
FROM msdb..backupset
WHERE type = 'D'
GROUP BY database_name
)
,
LastLogBackup (database_name, LastLogDate)
AS
(
SELECT database_name, Max(backup_start_date)
FROM msdb..backupset
WHERE type = 'L'
GROUP BY database_name
)
,
TotUsers (database_name, totUsers)
AS
(
SELECT DB_NAME(), COUNT(1) 
FROM sys.database_principals
WHERE type in ('S','U')
)
SELECT b.LastBackupDate AS [Last Database Backup], 
l.LastLogDate AS [Last Database Log Backup], 
d.name, state_desc as [Status], sl.name AS [Owner], 
d.create_date AS [Date Created], ds.dbSize AS [Size], 
ds.dbUnaloc AS [Space Available], 
t.totUsers as [Number of Users], d.collation_name AS [Collation]
FROM sys.databases d
INNER JOIN sys.syslogins sl ON d.owner_sid = sl.sid
INNER JOIN @DBSize ds ON d.name = ds.DBName COLLATE DATABASE_DEFAULT
LEFT OUTER JOIN LastFullBackup b ON d.name = b.database_name
LEFT OUTER JOIN LastLogBackup l ON d.name = l.database_name
INNER JOIN TotUsers t ON d.name = t.database_name
WHERE d.name = DB_Name() COLLATE DATABASE_DEFAULT;

Como puede observarse es mas fácil obtener los datos directamente de la ventana de propiedades de la base de datos, en la página General, sin embargo, el script funciona para obtener los mismos valores proporcionados, solo que en esta ocasión en un solo renglón.

viernes, 30 de octubre de 2020

SQL Server Dynamic Data Masking

 Introducción

Recientemente me invitaron a ofrecer una plática sobre lo que es el Enmascaramiento Dinámico de Datos (Dynamic Data Masking) en Microsoft SQL Server. Este es un documento que trata sobre el tema. Sin embargo, debe indicarse que esta característica esta disponible a partir de la versión de Microsoft SQL Server 2016.
La pregunta inicial en este punto es, ¿qué es mejor Encriptación de Datos o Enmascaramiento de Datos? Antes de contestar, debe indicarse que, cuando se habla de encriptación se establece que el dato original es codificado (dato encriptado intermedio), mostrándose la codificación en lugar del dato original y desde este dato codificado, el dato original puede ser obtenido. Por otro lado, en el caso del enmascaramiento, el dato original es enmascarado/obscurecido, mostrándose la mascara en lugar del dato original y no debe haber ninguna disposición para recuperar los datos originales de los datos oscurecidos o enmascarados.

Dato Encriptado

Un ejemplo de dato encriptado se puede observar en la siguiente imagen:


Se observa que la columna PasswordHash de la imagen, muestra información de forma ininteligible, este dato esta codificado, se requiere de una llave que permita obtener el valor original. Esta condición aplica para todos los usuarios que desean obtener el valor original.

Dato Enmascarado

Un ejemplo de dato enmascarado puede apreciarse en la siguiente imagen:


Se observa que la columna SSN se muestra con un patrón de letras X y guiones, (XXX-XXX-XXX), sin embargo, en este caso el dato original no fue afectado, únicamente se presenta con mascara. Esta condición aplica sólo a los usuarios que no tienen permisos administrativos dentro de la base de datos.

Diferencias

La principal diferencia es que, en el cifrado los datos originales se transforman en datos codificados y los datos originales se pueden recuperar a partir de ellos, por otro lado, en el enmascaramiento no se requiere ninguna transformación, solo se protegen los datos originales.
La propiedad más importante del enmascaramiento es que la metodología de enmascaramiento no es reversible, esto significa que los datos originales no pueden ser recuperados. 
La fuerza de la metodología de enmascaramiento radica en el hecho de que el enmascaramiento debe realizarse de tal manera que no debería haber ninguna forma de recuperar datos originales de datos enmascarados.

Encriptación en Microsoft SQL Server 

Se puede mencionar que el cifrado o encriptado es el proceso de ocultar datos mediante el uso de una clave o contraseña. Sin embargo, este proceso puede hacer que los datos queden inútiles si no se cuenta con la clave o contraseña para poder llevar a cabo el proceso de descifrado o desencriptado. Se sabe que este método mejora la seguridad de los datos limitando la perdida de estos, incluso cuando se omitan los controles de acceso. 
Dentro de SQL Server se puede utilizar el cifrado para las conexiones, los datos y los procedimientos almacenados. Se incluyen los siguientes tópicos:
  • Microsoft SQL Server y Llaves de Encriptación de Bases de Datos - Las claves de cifrado incluyen una combinación de claves públicas, privadas y simétricas que se utilizan para proteger datos confidenciales. 
  • Encriptación Transparente de Datos (TDE) – Llevando a cabo operaciones para llevar a generar el cifrado de forma transparente.
  • Siempre Encriptado (Motor de Base de Datos) – Ayuda a garantizar que los administradores y operadores de bases de datos y otros usuarios con privilegios, no autorizados, no puedan acceder a los datos cifrados.

¿Cómo trabaja el Enmascaramiento Dinámico de Datos?

Se pueden establecer las políticas de enmascaramiento dentro de una institución estableciendo los datos que pueden ser vistos por aquellos usuarios que requieren verlos, así como las restricciones para quienes no tiene acceso a la visibilidad deseos datos.
En términos generales los administradores de las bases de datos tendrán permiso de observar los datos, sin embargo, los datos, establecidos previamente, que no puedan ser vistos por usuarios sin permiso, únicamente verán los datos de forma enmascarada. Según se aprecia en la imagen.

¿Por qué utilizar Enmascaramiento de Datos?

Una de las características de este proceso es que ayuda a prevenir el acceso no autorizado a datos confidenciales.
Este método permite especificar cuántos datos confidenciales se pueden revelar con un impacto mínimo
Finalmente, este proceso es fácil de usar con aplicaciones existentes, ya que las reglas de enmascaramiento se aplican en los resultados de la consulta.

¿Cómo las aplicaciones pueden usar la mascara?

Una política de enmascaramiento de datos central actúa directamente sobre los campos sensibles de la base de datos.
Deben designarse usuarios o roles privilegiados que tengan acceso a los datos confidenciales.
Las instrucciones DDM de SQL presentan funciones para lograr un enmascaramiento total y parcial, y una máscara aleatoria para datos numéricos.
Finalmente, los comandos simples de Transact-SQL definen y administran las máscaras.

Limitaciones y restricciones

El enmascaramiento no puede ser usado en columnas cifradas (Always Encrypted), en las columnas de tipo FILESTREAM y en columnas COLUMN_SET o en una columna dispersa que forma parte de un conjunto de columnas. 
Es importante indicar que el enmascaramiento no puede ser definido en columnas calculadas, no obstante, si la columna calculada tiene una dependencia de alguna columna enmascarada, la columna enmascarada devolverá los datos enmascarados.
Finalmente, una columna con enmascaramiento no puede ser usada en una clave de índice FULLTEXT.

Propiedades de los campos a enmascarar

Siempre es importante conocer las características de las columnas o campos que se desea enmascarar, una parte importante es el tamaño de la columna, el formato que se utiliza para la presentación, la mascara que se utiliza para su captura, o las reglas de validación que se utilizan para el mismo. Esto es importante para poder determinar el tipo de mascara que puede ser utilizado. Las características de los campos a enmascarar generalmente están definidas dentro de un diccionario manejado por el administrador de datos, esta información se puede apreciar en la siguiente tabla.

Propiedad

Descripción

Tamaño de campo
Se utiliza para fijar la longitud máxima de un campo de texto que es de 255 caracteres.
Formato
Esto corrige cómo se pueden mostrar los datos, por ejemplo, las fechas se pueden mostrar en muchas formas diferentes, como 13/01/01 o 13 de enero de 01
Mascara de Entrada
Esto establece un patrón para que los datos se ingresen en este campo.
Subtitulo
Esta es la etiqueta de campo en un formulario o informe.
Valor por Omisión
El valor ingresado en el campo cuando se crea el registro. Por lo general, se deja en blanco, pero puede ser muy poderoso.
Regla de Validación
Esto define las reglas de entrada de datos.
Texto de Validación
Este es el mensaje de error si los datos no son válidos.
Requerido
Indica si se debe realizar una entrada o no.
Indizado
Esto permite que los datos se almacenen en el orden de este campo, lo que acelera las búsquedas.
Permite longitud cero
Se utiliza con campos de texto para decidir si los registros de ese campo pueden contener cadenas de texto vacías o de longitud cero
Compresión Unicode
Método de compresión de los datos ingresados en este campo.
Modo IME
Editor de métodos de entrada, que permite la entrada de caracteres especiales.
Modo de sentencia IME
Permite la entrada de caracteres especiales.

Tipos de Mascara Dinámica de Datos

En Microsoft SQL Server se pueden encontrar 4 diferentes tipos de mascara, las cuales se indican en la siguiente tabla:

Función

Descripción

Default
Enmascaramiento completo según los tipos de datos de los campos designados.
Email
Método de enmascaramiento que expone la primera letra de una dirección de correo electrónico y el sufijo constante ".com", en forma de dirección de correo electrónico.
Random
Una función de enmascaramiento aleatorio para usar en cualquier tipo numérico para enmascarar el valor original con un valor aleatorio dentro de un rango especificado.
Custom String
Método de enmascaramiento que expone la primera y la última letra y agrega una cadena de relleno personalizada en el medio. prefijo, [relleno], sufijo.


Es importante indicar que la sintaxis de la sentencia de Transact-SQL que se utiliza en la definición de la mascara utiliza la palabra FUNCTION para indicar que tipo de mascara se ha elegido. 
La mas general es la indicada como default(), esta función al usarse, ya cuenta con mascaras predefinidas, que se utilizaran de acuerdo con el tipo de dato que se utilice. 
  • Columnas alfabéticas (que utilizan char, varchar o nvarchar) se usará una mascara consistente de 4 caracteres X, o menos si el campo es mas pequeño; 
  • Columnas numéricas, se mostrara el valor 0, como valor; 
  • Columnas de tipo fecha (date, time, datetime) utilizara y mostrara siempre el valor 01.01.1900 00:00:00.0000000; 
  • Columnas de tipo binario, usara la mascara de utilizar un valor 0.
En el caso de la función email, esta función muestra la columna en la forma aXXX@XXXX.com, donde la primera letra corresponderá a la primera letra del valor real.
Para la función random, se requiere indicar un rango de valores, si el campo tiene el valor 1000, entonces muestra cualquier valor entre el rango indicado.
Finalmente, la función custom, requiere indicar (prefijo, [relleno], sufijo), donde el prefijo indica cuántos caracteres del valor real se deben incluir al principio, el relleno indica la máscara a utilizar y el sufijo indica cuántos caracteres del valor real incluirá al final.

Permisos requeridos

Realmente los permisos requeridos para establecer una mascara los tiene por omisión el creador y dueño de la base de datos, así como el administrador de bases de datos, con tener el permiso de CREATE TABLE y ALTER TABLE en el esquema, se puede establecer el enmascaramiento.
Se puede establecer el permiso ALTER ANY MASK en la tabla, para que una persona no administrativa o dueña de la base de datos pueda modificar las mascaras.
De igual forma, se requiere otorgar el permiso a UNMASK para habilitar la recuperación de datos sin máscara, esto es no mostrar el enmascaramiento previamente establecido.

Ejemplos

Se ha creado un usuario para llevar a cabo consultas y se pueda ver el resultado del enmascaramiento, el usuario será identificado como TestUser, creado y asignado a la base de datos MaskingDB, previamente creada, con el role de db_datareader, como se establece a continuación:

USE [master]
GO

/* For security reasons the login is created disabled and with a random password. */
/****** Object:  Login [TestUser]   ******/
CREATE LOGIN [TestUser] WITH PASSWORD=N'nQNze6HGT9PycxneqcT7xIiOJU9DXKuGOHFRsPBWSmE=', 
DEFAULT_DATABASE=[master], 
DEFAULT_LANGUAGE=[us_english], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF
GO

USE [MaskingDB]
GO

/****** Object:  User [TestUser]    ******/
CREATE USER [TestUser] FOR LOGIN [TestUser] WITH DEFAULT_SCHEMA=[dbo]
GO

ALTER ROLE [db_datareader] ADD MEMBER [TestUser]
GO

Para este ejemplo se creará una tabla que se denominará Membership, en una base de datos que previamente se haya creado. 

--- Create a Table
CREATE TABLE Membership 
(
MemberID int IDENTITY PRIMARY KEY, 
FirstName varchar(100) NULL, 
LastName varchar(100) NOT NULL, 
Phone varchar(12) NULL, 
Email varchar(100) NULL,
Payment money NULL
); 
GO

Se procede a insertar algunos datos a la tabla previamente creada.

--- Insert new values
INSERT Membership (FirstName, LastName, Phone, Email, Payment) 
VALUES
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com',1000),
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 1000),
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 1500),
('Rodolfo', 'Gonzalez','536.830.0439','rgonzalez@softown.com.mx', 2000),
('Oliver', 'Blanco','564.998.3032','oblanco@softown.com.mx', 2500);
GO

Para validar que los datos ya están en la tabla indicada, se usa la sentencia general de consulta.

--- Get the table rows using Admin
SELECT * FROM Membership; 
GO

Con los datos ya alimentados en la tabla, se procede a modificar las columnas que se desea enmascarar, la primera columna nombrada FirstName se le establecerá una máscara de tipo custom, indicando que muestre los primeros dos caracteres del nombre, la máscara de 7 letras X y las dos ultimas letras del nombre, quedando como se indica a continuación:

--- ALTER TABLE COLUMNS to be masked (custom mask)
ALTER TABLE Membership
ALTER COLUMN FirstName ADD MASKED WITH (FUNCTION = 'partial(2,"XXXXXXX",2)');
GO

La siguiente columna que se desea enmascarar es la que tiene el nombre Phone, en este caso se solicitara una mascara de tipo default, que mostrara los valores como un patrón de 4 letras X.

--- Alter Table Column to be masked with default mask
ALTER TABLE Membership
ALTER COLUMN Phone ADD MASKED WITH (FUNCTION = 'default()');
GO

De igual forma, se modificará la columna con nombre Email, para establecer una máscara de tipo email, que mostrará los valores cómo aXXX@XXXX.com, de la siguiente forma.

--- Alter table column to be masked with email mask
ALTER TABLE Membership
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
GO

Finalmente, en la columna Payment, se establecerá una máscara de tipo random, indicando un rango entre 1 y 12, como se indica a continuación.

-- Alter table column to be masked with random mask
ALTER TABLE Membership
ALTER COLUMN Payment ADD MASKED WITH (FUNCTION = 'random(1, 12)');
GO

Para validar que las columnas están enmascaradas. Se ejecutará una consulta, indicando un usuario con permisos no administrativos sobre la base de datos, que previamente se ha creado, y se comparará con la obtenida con el uso de la misma consulta ejecutándose con el usuario administrador.

--- Execute as TestUser to get table rows
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  
--Execute as Admin users
SELECT * FROM Membership;
GO

Un usuario sin permiso de ver los valores reales tendrá la siguiente vista:


El usuario con permiso de ver los valores reales tendrá la siguiente vista:


Para determinar que columnas de las tablas de la base de datos tienen establecida una mascara y el tipo de mascara que se utiliza, se puede ejecutar la siguiente consulta:

--- Querying for Masked Columns information
SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
FROM sys.masked_columns AS c  
JOIN sys.tables AS tbl   
    ON c.[object_id] = tbl.[object_id]  
WHERE is_masked = 1;
GO

Se puede llevar a cabo la definición de las columnas con la indicación del enmascaramiento deseado, de tal forma que, para el ejemplo, se borrará la tabla previamente creada, se volverá a crear utilizando las sentencias de enmascarado y se volverán a cargar los datos anteriores.

--- New Table including Masked properties
DROP TABLE IF EXISTS Membership;
GO

CREATE TABLE Membership _
(
MemberID int IDENTITY PRIMARY KEY,
FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,
LastName varchar(100) NOT NULL,
Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,
Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL,
Payment money MASKED WITH (FUNCTION = 'random(1, 10)') NULL
); 
GO

--- Insert new values
INSERT Membership (FirstName, LastName, Phone, Email, Payment) 
VALUES_
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com',1000),_
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 1000),_
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 1500),
('Rodolfo', 'Gonzalez','536.830.0439','rgonzalez@softown.com.mx', 2000),
('Oliver', 'Blanco','564.998.3032','oblanco@softown.com.mx', 2500);
GO

Nuevamente, para validar que las columnas están enmascaradas. Se ejecutará una consulta, indicando un usuario con permisos no administrativos sobre la base de datos y se comparará con la obtenida con el uso de la misma consulta ejecutándose con el usuario administrador.

--- Execute as TestUser to get table rows
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  
--Excute as Admin users
SELECT * FROM Membership;
GO

Esta ejecución mostrara la misma vista que cuando se llevo a cabo la modificación de las columnas, previamente mostrada.

Para quitar el enmascaramiento se utilizará la sentencia correspondiente, de tal forma que se pueda volver visible por el usuario sin privilegios.

--- ALTER TABLE COLUMNS drop masked 
ALTER TABLE Membership
ALTER COLUMN FirstName DROP MASKED;
ALTER TABLE Membership
ALTER COLUMN Phone DROP MASKED;
ALTER TABLE Membership
ALTER COLUMN Email DROP MASKED;
ALTER TABLE Membership
ALTER COLUMN Payment DROP MASKED;
GO

Revisar que las columnas ya no están enmascaradas.

--- Execute as TestUser to get table rows
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  
SELECT * FROM Membership;
GO

Con esta ejecución, ambos usuarios verán los datos originales, ya que se han eliminado las mascaras.

Mejores Prácticas

Es importante indicar que la creación de una máscara en una columna no evita las actualizaciones de esa columna. La columna puede cambiar de valor, si el usuario cuenta con los permisos para hacerlo.
El uso de sentencias SELECT INTO o INSERT INTO para copiar datos de una columna enmascarada a otra tabla da como resultado datos enmascarados en la tabla de destino. Esto significa que, si algún usuario que solo ve la mascara, pretende crear una copia de los datos en alguna otra tabla, entonces la mascara será establecida en la tabla objetivo, para evitar que los datos puedan ser vistos.
Finalmente, el enmascaramiento se aplica al ejecutar la importación y exportación de datos de Microsoft SQL Server.

Conclusión

Hay que recordar que el enmascaramiento aplica para la presentación de la información, para las personas que no tiene permiso de ver los datos. Como se ha indicado, la creación de una vista que utiliza una tabla que tenga una o más columnas enmascaradas, los datos de esa columna se presentara, también, enmascarada. Como se ha visto, el enmascaramiento de datos puede ayudar a las empresas para cuando se llevan a cabo desarrollos que utilizan datos reales, importados de ambientes productivos, para desarrollo de nuevas funcionalidades de las aplicaciones nuevas o existentes, de esta forma, los desarrolladores, cuando lleven a cabo consultas, obtengan los datos sensibles de forma enmascarada.

miércoles, 19 de agosto de 2020

El Regulador de Recursos de SQL Server

Regulador de Recursos

Introducción

A partir de la presentación de Microsoft SQL Server 2008, se puede encontrar el regulador de recursos, cuya característica es que se puede utilizar para administrar la carga de trabajo y el consumo de recursos del sistema dentro de una instancia de Microsoft SQL Server. El regulador de recursos le permite especificar límites en el número de CPU, Entradas/Salidas físicas y memoria que pueden usar las solicitudes de aplicaciones entrantes, regulación de los recursos de E/S físicas, es posible administrarlos desde Microsoft SQL Server 2016.


Regulación de Recursos

En el contexto del regulador de recursos, la carga de trabajo es un conjunto de consultas o solicitudes de tamaño similar que pueden y deben tratarse como una sola entidad. Esto no es un requisito, pero cuanto más uniforme sea el patrón de uso de recursos de una carga de trabajo, más beneficios obtendrá del regulador de recursos. Los límites de recursos se pueden reconfigurar en tiempo real con un impacto mínimo en las cargas de trabajo en ejecución.


En un entorno en el que hay varias cargas de trabajo diferentes en el mismo servidor, el regulador de recursos permite diferenciar estas cargas de trabajo y asignar recursos compartidos según se solicite, según los límites que especifique. Como se indicó anteriormente, estos recursos son CPU, Entrada/Salida física y memoria.


Los siguientes tres conceptos son fundamentales para comprender y utilizar el regulador de recursos (Resource Governor):


➢ Grupos de recursos. Un grupo de recursos representa los recursos físicos del servidor. Debe imaginarse un grupo como una instancia virtual de Microsoft SQL Server dentro de una instancia real de Microsoft SQL Server.


➢ Grupos de carga de trabajo. Un grupo de carga de trabajo sirve como contenedor para solicitudes de sesión con criterios de clasificación similares. Una carga de trabajo permite el monitoreo agregado de las sesiones y define las políticas que deben seguir estas sesiones.


➢ Clasificación. El proceso de clasificación asigna sesiones entrantes a un grupo de carga de trabajo en función de las características de la sesión. Adapte la lógica de clasificación escribiendo una función definida por el usuario, llamada función clasificadora.


El regulador de recursos (Resource Governor) se encuentra localizado en el grupo de administración en SQL Server Management Studio. La siguiente imagen muestra la ubicación y las propiedades reales:



El gobernador de recursos funciona de la siguiente manera:

➢ Cuando llega una conexión a través de una sesión:
    * Se clasifica según la función de clasificación,
    * Pasará al grupo de carga de trabajo correspondiente, 
    * Utilizará el pool de recursos asociado, 
    * El grupo de recursos proporciona y limita el uso de los recursos requeridos por la aplicación, según se ha definido.

El regulador de recursos está deshabilitado de forma predeterminada y usará y asignará el grupo de carga de trabajo predeterminado y el grupo predeterminado, como se ve en la última imagen.

Conclusión

El regulador de recursos es una buena herramienta que permite asignar los recursos del sistema a los procesos que se identifican como críticos. En términos generales, siempre se puede utilizar el proporcionado por omisión (default), de tal forma que todos los procesos se ejecutaran de forma similar. No obstante, es imprescindible que se identifiquen los procesos o aplicaciones que deban ejecutarse de forma prioritaria y crear y asignar los recursos necesarios a estos.