Mejorar los errores Data Truncation en SQL Server

Mejorar los errores Data Truncation en SQL Server

Los errores de truncamiento de datos es algo que alguna vez como programadores de SQL Server nos hemos topado.
cuando hablamos de estos errores nos referimos a por ejemplo querer insertar en un VARCHAR(10) la palabra ‘TRIGGERDB CONSULTING SRL‘ lo cual como es lógico nos dará un error.

Ahora bien , este error no es muy detallado que digamos, por ende vamos a ver como podemos trabajar con lo que se denomina “Silent Truncation”

Veamos el siguiente ejemplo:

USE MASTER
GO
DROP DATABASE IF EXISTS TRIGGERDB2019
CREATE DATABASE TRIGGERDB2019
GO

USE TRIGGERDB2019
GO
DROP TABLE IF EXISTS DBO.DEMO_TRUNCATE;

CREATE TABLE DBO.DEMO_TRUNCATE
(ID INT IDENTITY PRIMARY KEY,
 C1 VARCHAR (10));

INSERT INTO DBO.DEMO_TRUNCATE (C1)
VALUES ('TRIGGERDB CONSULTING SRL')
Al ejecutar nuestra operación INSERT observamos el siguiente error

Msg 8152, Level 16, State 30, Line 16
Los datos de cadena o binarios se truncarían.
Se terminó la instrucción.

Msg 8152, Level 16, State 30, Line 1
String or binary data would be truncated.
The statement has been terminated.

SQL Server 2019 

En SQL Server 2019 usando solamente el modo de compatibilidad 150 podremos tener un mejor mensaje de error.

ALTER DATABASE TRIGGERDB2019 
SET COMPATIBILITY_LEVEL = 150

INSERT INTO DBO.DEMO_TRUNCATE (C1)
VALUES ('TRIGGERDB CONSULTING SRL')

Msg 2628, Level 16, State 1, Line 16
Los datos binarios o de la cadena se truncan en la columna “C1” de la tabla “TRIGGERDB2019.dbo.DEMO_TRUNCATE”. Valor truncado: “TRIGGERDB “.
Se terminó la instrucción.

Msg 2628, Level 16, State 1, Line 7
String or binary data would be truncated in table ‘TRIGGERDB2019.dbo.DEMO_TRUNCATE’, column ‘C1’. Truncated value: ‘TRIGGERDB ‘.
The statement has been terminated.

SQL Server 2016 y 2017 

Si se quiere usar esta funcionalidad en SQL Server 2016 o 2017 se requiere activar el Trace Flag 460 el cual esta disponible en el Sp2 de SQL Server 2016 y CU6 de 2017  

TF 460 en el scope
DBCC TRACEON (460)

INSERT INTO DBO.DEMO_TRUNCATE (C1)
VALUES ('TRIGGERDB CONSULTING SRL')

Msg 2628, Level 16, State 1, Line 16
Los datos binarios o de la cadena se truncan en la columna “C1” de la tabla “TRIGGERDB2019.dbo.DEMO_TRUNCATE”. Valor truncado: “TRIGGERDB “.
Se terminó la instrucción.

Msg 2628, Level 16, State 1, Line 7
String or binary data would be truncated in table ‘TRIGGERDB2019.dbo.DEMO_TRUNCATE’, column ‘C1’. Truncated value: ‘TRIGGERDB ‘.
The statement has been terminated.

SQL 2019 RTM en Docker

En el siguiente post vamos a instalar un SQL Server 2019 RTM sobre docker de Windows. 

Pre requisitos

Paso 1: Bajar la imagen

Como primer paso lo que debemos hacer es bajar la imagen de SQL Server 2019 RTM, en este caso bajaremos la imagen de Linux Ubuntu
c:> docker pull mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

Paso 2: Crear un contenedor con SQL 2019  RTM

Cuando ya tengamos la imagen descargada podemos iniciar un contenedor , en mi caso usare el puerto externo 15000
c:> docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Passw0rd///" -p 15000:1433 --name sql2019 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

Paso 3: Conectarnos a nuestro contenedor

Para poder conectarnos a nuestro contenedor con SQL Server 2019 RTM podemos usar cualquier herramienta cliente, en mi caso lo hare con SSMS
También podemos ejecutar el siguiente código TSQL para verificar algunos datos
SELECT 
SERVERPROPERTY('ProductVersion') as Build,
SERVERPROPERTY('ProductLevel') as Level,
SERVERPROPERTY('Edition') as Edition

Eliminar el contenedor

Para eliminar nuestro contendor deberíamos ejecutar el siguiente código desde la línea de comandos
c:> docker stop sql2019
c:> docker rm sql2019

SQL 2019 CTP 2.5 en Docker

En este articulo vamos a ver como probar SQL Server 2019 CTP 2.5 sobre Docker dektop para Windows 10

Instalando Docker

Lo primero que debemos hacer es instalar docker desktop, para ello simplemente debemos bajarlo del siguiente link y luego ejecutar el instalador.

Para comprobar el funcionamiento abrimos una consola de PowerShell o CMD en modo administrador y ejecutamos el siguiente comando.

PS C:\> DOCKER VERSION 

Configurar un disco compartido (shared disk)

Si bien este paso no es un requisito si es recomendable. Lo que haremos aquí es compartir un disco externo al contenedor para así poder tener persistencia de los datos fuera del contenedor, para leer sobre discos compartidos en docker podes acceder al siguiente link .

Para habilitar el shared disk desde docker desktop es bastante simple, como primer paso abrimos el docker desktop y vamos a discos compartidos, en mi caso compartí el disco E de mi SO.

Bajando la imagen de SQL 2019 CTP 2.5

Nuestro siguiente paso es bajar la imagen de SQL Server 2019 CTP 2.5, la misma tiene como base un Linux Ubuntu.

Para esta operación desde la consola de PS o CMD como administrador ejecutaremos el siguiente comando.

PS c:\> docker pull mcr.microsoft.com/mssql/server:2019-CTP2.5-ubuntu

Creando el container

En este paso vamos a crear un contenedor con la imagen que hemos descargado anteriormente, para ello ejecutaremos desde la consola el siguiente comando.

PS c:\> docker run -d -p 15790:1433 --env ACCEPT_EULA=Y 
        --env SA_PASSWORD=123@Passw0rd 
        -v e:\Docker\SQL:/sql --name sql2019ctp 
        mcr.microsoft.com/mssql/server:2019-CTP2.5-ubuntu

El comando creara un contenedor con la imagen de SQL 2019CTP2.5 donde se mapea el puerto 15790 del SO anfitrión contra el 1433 del contenedor. No es requisito cambiar el puerto pero en mi caso ya tengo instalado un SQL Server en mi windows 10 en el puerto 1433.

Con el parametro -V montamos la ruta e:\docker\sql para que nuestro container pueda tener acceso.

Nuestro siguiente paso es iniciar el contenedor, para ellos ejecutaremos el siguiente comando desde la consola.

PS c:\> docker start sql2019ctp

Conectándonos a la instancia de SQL Server

Ahora lo que vamos a hacer es usar una herramienta cliente (en mi caso el Management Studio V18) para podernos conectar a la instancia de SQL Server 2019 CTP 2.5 que esta en el contenedor en el puerto 15790

Como podemos observar en la imagen anterior vemos que la versión es la 15 correspondiente a SQL Server 2019. También probaremos el siguiente comando TSQL para tener mas información de la instancia MSSQL.

select @@version 

Restaurar una base de datos de ejemplo

Nuestro siguiente paso es hacer un restore de la base de datos de ejemplo WideWordl

Para ello lo que vamos a hacer es bajar el archivo .bak
WideWorldImporters-Full.bak y copiarlo en nuestro disco compartido del SO, en mi caso lo copiare en el disco E:\Docker\sql\bkp

Luego desde el SSMS conectado a la instancia haremos un simple restore de ese archivo, podemos hacer que los MDF , LDF y NDF se persistan dentro del container o bien hacerlo afuera, esto ultimo nos daría la ventaja de no perder luego esos archivos al borrar el container.

Aquí para acceder a nuestro recurso compartido simplemente ponemos /SQL el cual fue mapeado con la unidad cuando creamos el container y en donde tendremos nuestro archivo .bak a restaurar.

El siguiente código TSQL hace el restore de nuestra base

USE [master]
RESTORE DATABASE [WideWorldImporters] 
FROM  DISK = N'/sql/Bkp/WideWorldImporters-Full.bak' WITH  FILE = 1,  
MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',  
MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',  
MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',  
MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',  
NOUNLOAD,  STATS = 5
GO

Ahora lo que haremos con la base restaurada en nuestro container con SQL 2019 es cambiarle el modo de compatibilidad a 150.

Conclusiones

En este post no solo hemos visto como podemos probar la versión beta de SQL Server 2019 sino que también como montarla en un container de docker