miércoles, 25 de noviembre de 2020

MERGE en SQL Server para Insert, Delete y Update con dos tablas - Práctico

MERGE permite sincronizar dos tablas a través de Insert, Update y Delete en un solo query. Válido para SQL SERVER 2008 o superior.
En un caso normal se tendría que hacer los 3 querys por separado, lo que significaría varias consultas y un select para verificar si el dato existe, otro para insertar otro para modificar y otro para borrar. Con MERGE, SQL Server nos permite hacer todo esto en una sola consulta, lo que es mucho más eficiente y utiliza muchísimo menos recursos en el servidor, más aun cuando las tablas son muy grandes, es muy útil cuando se realizan migraciones de grandes volumenes de datos.
La sintaxis de MERGE es:
MERGE <table_destino> [AS TARGET]
USING <table_origen> [AS SOURCE]
   ON <condicion_compara_llaves>
[WHEN MATCHED THEN 
    <accion cuando coinciden> ]
[WHEN NOT MATCHED [BY TARGET] THEN 
    <accion cuando no coinciden por destino> ]
[WHEN NOT MATCHED BY SOURCE THEN 
    <accion cuando no coinciden por origen> ];
Analizando la instrucción, podemos desglosar su funcionamiento:

  • Utiliza la tabla_destino como destino (MERGE INTO)
    Define la tabla de la cual provienen los datos, aunque también se puede utilizar un CTE o tabla derivada entre algunas otras opciones. Lo más común es utilizar una tabla.
  • Utiliza la tabla_origen como origen (USING)
  • Une ambas tablas por campos: condicion_compara_llaves (ON)
  • WHEN matched (cuando exista el registro en el destino), realiza acciones como: lo actualiza
    NOTA: INSERT no está permitida; es posible utilizar 2 cláusulas WHEN MATCHED, una para utilizar la acción UPDATE y otra para la acción DELETE, la única condicionante es que deben tener filtros si se utilizan ambas
  • WHEN not matched by target (cuando no exista el registro en el destino), realiza acciones como: lo agrega o inserta
    La única operación permitida es un INSERT.
  • WHEN not matched by source (cuando exista el registro en el destino y no exista en el origen), realiza acciones como: eliminar registros del origen
    Cuando la fila existe en la tabla destino pero no en la fuente, no se puede aplicar una operación INSERT pero si UPDATE y DELETE, también se puede declarar dos cláusulas de este tipo al igual que la claúsula WHEN MATCHED, con la misma condicionante que deben tener filtros.

Entonces, no solo evalúa las diferencias, sin que nos permite realizar una acción por cada clase de diferencia que se encuentre.
NO es obligatorio utilizar todas las opciones:si por ejemplo, no queremos actualizar los registros existentes en ambas tablas, no utilizamos la sección WHEN matched.

utilizaremos MERGE para comparar las dos tablas y hacer las acciones correspondientes.

  1. --Sincronizar la tabla TARGET con
  2. --los datos actuales de la tabla SOURCE
  3. MERGE Alumno AS TARGET
  4. USING AlumnoActual AS SOURCE
  5. ON (TARGET.Codigo = SOURCE.Codigo)
  6. --Cuandos los registros concuerdan con por la llave
  7. --se actualizan los registros si tienen alguna variación
  8. WHEN MATCHED AND TARGET.Nombre <> SOURCE.Nombre
  9. OR TARGET.Promedio <> SOURCE.Promedio THEN
  10. UPDATE SET TARGET.Nombre = SOURCE.Nombre,
  11. TARGET.Promedio = SOURCE.Promedio
  12. --Cuando los registros no concuerdan por la llave
  13. --indica que es un dato nuevo, se inserta el registro
  14. --en la tabla TARGET proveniente de la tabla SOURCE
  15. WHEN NOT MATCHED BY TARGET THEN
  16. INSERT (Codigo, Nombre, Promedio)
  17. VALUES (SOURCE.Codigo, SOURCE.Nombre, SOURCE.Promedio)
  18. --Cuando el registro existe en TARGET y no existe en SOURCE
  19. --se borra el registro en TARGET
  20. WHEN NOT MATCHED BY SOURCE THEN
  21. DELETE
  22. --Seccion opcional e informativa
  23. --$action indica el tipo de accion
  24. --en OUTPUT retorna cualquiera de las 3 acciones
  25. --'INSERT', 'UPDATE', or 'DELETE',
  26. OUTPUT $action,
  27. DELETED.Codigo AS TargetCodigo,
  28. DELETED.Nombre AS TargetNombre,
  29. DELETED.Promedio AS TargetPuntos,
  30. INSERTED.Codigo AS SourceCodigo,
  31. INSERTED.Nombre AS SourceNombre,
  32. INSERTED.Promedio AS SourcePuntos;
  33. SELECT @@ROWCOUNT;
  34. GO
  35. SELECT * FROM Alumno
  36. SELECT * FROM AlumnoActual

una sección OUTPUT, esta es totalmente opcional y ahí podemos ver que acciones se tomó por cada línea afectada.
El resultado de OUTPUT es el siguiente:

el resultado de las dos tablas después de usar MERGE

Al final las dos tablas quedaron sincronizadas, se actualizaron los datos en la tabla TARGET y el alumno que no tenía movimientos fue eliminado.
Posted by InfoTacticas Soluciones  |  1 comment

11/25/2020 03:18:00 a. m. Share:

1 comentarios:

viernes, 9 de octubre de 2020

Diferencia entre Login (Inicio de Sesión) y Usuario en SQL Server

Un Inicio de Sesión (Login) representa la conexión a la Instancia de SQL Server. Un login es usado para la autenticación al servidor SQL Server. Dicha conexión debe ser validada por algún tipo de servidor de autenticación, de tal modo, que podemos encontrar Inicios de Sesión de Windows (la validación la realiza el Sistema Operativo, y representa al usuario contextual con el que hemos iniciado sesión en Windows) e Inicios de Sesión de SQL Server (la validación la realiza SQL Server, luego es el motor de base de datos quién debe almacenar la contraseña y quién debe validar al usuario).

En cualquier caso, un Inicio de Sesión definido en una Instancia puede pertenecer a determinadas Funciones de Servidor (Server Roles) de dicha Instancia, y cuya pertenencia suele conceder determinados privilegios en dicha Instancia de SQL Server (ej: pertenecer a BULKADMIN permite poder realizar cargas masivas en cualquier base de datos de la Instancia, siempre que además se tengan permisos sobre la tabla de destino).

Una cuenta de usuario (Usuarios de base de datos) es usada para la validación y permisos de acceso a los objetos de una base de datos (procedimientos almacenados, tablas, etc.). Un usuario se define a nivel de Base de Datos y se le asigna al inicio de sesión o login.

un Inicio de Sesión se almacena en la base de datos master (a nivel de la Instancia) y queda definido por su SID, mientras que los Usuarios se almacenan en cada Base de Datos particular y quedan definidos por su UID aunque tienen asignado el SID que les corresponda según el Inicio de Sesión al que pertenecen.

Creación de Login
  1. CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020'
  2. GO
  3.  
  4. CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]
  5.  
  6. -- creación de login desde Windows
  7. CREATE LOGIN [LoginFinanciera] FROM WINDOWS WITH DEFAULT_DATABASE=[FinancieraDemoBD]
  8.  
Asignación de Roles a Login
  1. -- Agregar rol dbcreator al login
  2. EXEC sp_addsrvrolemember 'LoginFinanciera', 'dbcreator'

Creación de Usuario de Base de Datos
  1. USE FinancieraDemoBD
  2. GO
  3. CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
  4. GO
  5.  
  6. -- conceder permisos al usuario para que realice Select sobre una tabla de la BD.
  7. GRANT SELECT ON dbo.CLIENTE TO UsuarioBDFinanciera
  8. GO

Eliminar Login y Usuario de Base de Datos
  1. -- Eliminar Login y Usuario
  2. drop login LoginFinanciera
  3.  
  4. drop user UsuarioBDFinanciera
  5.  

Creación de Login y Usuario de Base de Datos, previa verificación de existencia
  1.  
  2. -- CREACION DE LOGIN
  3. USE [master]
  4. GO
  5. IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = N'LoginFinanciera')
  6. CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]
  7.  
  8. -- CREACION DE USUARIO DE BASE DE DATOS
  9. USE [FinancieraDemoBD]
  10. GO
  11. IF NOT EXISTS(SELECT name FROM sys.sysusers WHERE name = 'UsuarioBDFinanciera')
  12. CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
  13. GO
  14.  

Asignación de Roles a Usuario de Base de Datos y otorgar permisos a objetos: procedimientos almacenados, tablas
  1. -- ASIGNACION DE PERMISOS
  2. EXEC sp_addrolemember N'db_datareader', N'UsuarioBDFinanciera'
  3. GO
  4. EXEC sp_addrolemember N'db_datawriter', N'UsuarioBDFinanciera'
  5. GO
  6. GRANT EXECUTE TO [UsuarioBDFinanciera]
  7.  
  8. -- DAR PERMISOS AL USUARIO DE BASE DE DATOS SOBRE PROCEDIMIENTOS ALMACENADOS Y TABLAS
  9. USE [FinancieraDemoBD]
  10. GO
  11. GRANT EXECUTE ON [spListar_Clientes] TO [UsuarioBDFinanciera];
  12. GRANT EXECUTE ON [spInsertar_Cliente] TO [UsuarioBDFinanciera];
  13. GRANT EXECUTE ON [spListar_Proveedor] TO [UsuarioBDFinanciera];
  14. GRANT EXECUTE ON [spInsertar_Proveedor] TO [UsuarioBDFinanciera];
  15.  
  16. GRANT SELECT,INSERT,UPDATE,DELETE ON [CLIENTE] TO [UsuarioBDFinanciera];
  17. GRANT SELECT,INSERT,UPDATE,DELETE ON [PROVEEDOR] TO [UsuarioBDFinanciera];
  18. GRANT SELECT,INSERT,UPDATE,DELETE ON "dbo"."COLABORADOR" TO "UsuarioBDFinanciera";
  19.  
  20. -- PERMISO ESPECIAL --> EVALUAR CONSIDERACIONES DE SEGURIDAD
  21. GRANT ALTER ON "dbo"."CLIENTE" TO "UsuarioBDFinanciera";
  22.  
  23. GO
  24.  

Consultar login y usuarios de base de datos
  1.  
  2. -- *** Ver los Inicios de Sesión de la Instancia de SQL Server ***
  3. select sid, name, dbname, password, loginname
  4. from master..syslogins


  1. -- Ver los inicios de Sesion
  2. select * from sys.server_principals


  1. -- *** Ver los Usuarios de la Base de Datos actual de SQL Server ***
  2. use FinancieraDemoBD
  3. GO
  4. select uid, name, sid, *
  5. from sysusers
  6. where islogin=1


  1. select * from sys.database_principals


Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 09:42:00 p. m. Share:

0 comentarios:

COPIA DE SEGURIDAD DE CLAVE SIMÉTRICA EN SQL SERVER

Las llaves simétricas deberían tener una copia de seguridad, pero lamentablemente esto no es posible debido a que dentro de las sentencias T-SQL para manejar las llaves simétricas no hay ninguna que sirva para sacar copias de seguridad, sin embargo hay dos atributos especiales que fueron especificados en la creación de la llave simétrica:
IDENTITY_VALUE: el cual SQL Server usa para generar in valor GUID para la llave.
KEY_SOURCE: el cual SQL Server usa como material para poder generar la llave en sí.
Si estos dos atributos fueron especificados en la creación de la llave simétrica, entonces esta podrá ser recreada siempre y cuando se tengan copias de seguridad de los objetos usados para generarla: el certificado usado.

Ejemplo de cómo sacar la copia de seguridad de la Master Key >y del Certificado los cuáles serán usados para recrear la creación de la llave simétrica.

  1. USE FinancieraDemoBD
  2. GO
  3.  
  4. -- sacaremos una copia de seguridad de la DMK
  5. BACKUP MASTER KEY TO FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
  6. ENCRYPTION BY PASSWORD = 'TopSecret2020MK';
  7. GO
  8.  
  9. -- Sacaremos una copia de seguridad del certificado
  10. BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cer'
  11. WITH PRIVATE KEY ( FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key' ,
  12. ENCRYPTION BY PASSWORD = 'TopSecret2020C' );
  13. GO
  14.  
Ahora borraremos la llave simetrica, el certificado y la master key
  1. DROP SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  2. GO
  3.  
  4. -- Ahora perderemos el certificado.
  5. DROP CERTIFICATE FinancieraCertificado
  6. GO
  7.  
  8. -- Ahora perderemos la DMK
  9. DROP MASTER KEY
  10. GO
  11.  

Al no tener la llave simetrica la informacion es inaccesible. Entonces, para recrear nuestra configuración, primero restauraremos la DMK, luego se abre la DMK para poder restaurar el certificado, luego se restaura el certificado y después se recrea la creación de la llave simétrica con el mismo valor de KEY_SOURCE y IDENTITY_VALUE .
  1. RESTORE MASTER KEY
  2. FROM FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
  3. DECRYPTION BY PASSWORD = 'TopSecret2020MK'
  4. ENCRYPTION BY PASSWORD = 'TopSecret2020MKN'
  5. GO
  6.  
  7. -- Ahora abrimos la DMK sino no podremos restaurar el certificado
  8. OPEN MASTER KEY DECRYPTION BY PASSWORD = 'TopSecret2020MKN'
  9. GO
  10.  
  11. -- Ahora restauramos el certificado
  12. CREATE CERTIFICATE FinancieraCertificado
  13. FROM FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cert'
  14. WITH PRIVATE KEY (FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key',
  15. DECRYPTION BY PASSWORD = 'TopSecret2020C');
  16. GO
  17.  
  18. -- Ahora recreamos la llave simetrica
  19. CREATE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  20. WITH
  21. KEY_SOURCE = 'ClaveSimetrica2020',
  22. IDENTITY_VALUE = 'MiValorIdentidad',
  23. ALGORITHM = AES_256
  24. ENCRYPTION BY CERTIFICATE FinancieraCertificado
  25. GO

A continuación se vuelve a consultar los datos usando el Certificado y la desencriptación por clave y volvemos a obtener la información desencriptada
  1. OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
  2.  
  3. -- Ahora seleccionamos los datos pero antes los desencriptamos con la llave simetrica
  4. SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
  5. CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
  6. FROM dbo.COLABORADOR
  7. /*
  8. MATRICULACOLABORADOR NOMBRES APELLIDOS
  9. CAR001 CESAR ANTONIO AVILA ROBLES
  10. */
  11.  
  12. -- Y ahora volvemos a cerrar la llave simetrica
  13. CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
Posted by InfoTacticas Soluciones  |  1 comment

10/09/2020 04:25:00 p. m. Share:

1 comentarios:

COPIA DE SEGURIDAD (BACKUP) DE CERTIFICADO EN SQL SERVER Y RESTAURACIÓN DEL CERTIFICADO

Los certificados deben tener una copia de seguridad como la base de datos misma debido a que en el caso de que perdamos el certificado solo esa copia de seguridad nos podrá asegurar la recuperación de toda la data encriptada con ese certificado, caso contrario, la información permanecerá perdida debido a que ya no se tiene el mismo certificado que la encriptó.
Breve Ejemplo de creación de certificado y registro de datos encriptados.
  1. IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
  2. BEGIN
  3. USE MASTER
  4. ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
  5. DROP DATABASE FinancieraDemoBD
  6. END
  7.  
  8.  
  9. -- Creamos la Base de Datos de prueba
  10. use master
  11. GO
  12.  
  13. create database FinancieraDemoBD
  14. GO
  15.  
  16. -- Usamos la Base de Datos de Prueba
  17. use FinancieraDemoBD
  18. GO
  19.  
  20. -- Creamos una tabla cliente con las columnas Nombre y NombreCorto
  21. -- de tipo varbinary para que contenga la informacion encriptada
  22. CREATE TABLE [dbo].[CLIENTE](
  23. [IDCLIENTE] [int] IDENTITY(1,1) NOT NULL,
  24. [FECING] [datetime] NULL,
  25. [USUING] [varchar](6) NULL,
  26. [FECACT] [datetime] NULL,
  27. [USUACT] [varchar](6) NULL,
  28. [NOMBRE] [varbinary](max) NOT NULL,
  29. [NOMBRECORTO] [varbinary](max) NULL,
  30. PRIMARY KEY CLUSTERED
  31. (
  32. [IDCLIENTE] ASC
  33. )
  34. ) ON [PRIMARY]
  35.  
  36. GO
  37.  
  38.  
  39.  
  40. -- Crear una Database Master Key
  41. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
  42. GO
  43.  
  44. -- Crear el Certificado
  45. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  46. EXPIRY_DATE = '20211231'
  47. GO
  48.  
  49.  
  50. -- Consultar los certificados creados en la base de datos
  51. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  52. FROM sys.certificates
  53. /*
  54. name pvt_key_encryption_type_desc subject expiry_date
  55. FinancieraCertificado ENCRYPTED_BY_MASTER_KEY INFOTACTICAS Certificate 2021-12-31 00:00:00.000
  56. */
  57.  
  58.  
  59. -- Insertar un valor
  60. INSERT INTO dbo.CLIENTE (FECING, USUING, NOMBRE, NOMBRECORTO)
  61. VALUES (getdate(), 'IRE001', ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES RIOS'), ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES'))
  62. GO
  63. -- Select convencional
  64. SELECT IDCLIENTE, NOMBRE, NOMBRECORTO, FECING
  65. FROM dbo.CLIENTE
  66. /*
  67. IDCLIENTE NOMBRE NOMBRECORTO FECING
  68. 1 0xC118457BFAA... 0xEF308BFC78424F717... 2020-10-08 23:47:39.520
  69. */
  70.  
  71.  
  72. -- Select desencriptando los datos con el certificado correcto
  73. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  74. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  75. FECING
  76. FROM dbo.CLIENTE
  77. /*
  78. IDCLIENTE NOMBRE NOMBRECORTO FECING
  79. 1 CARLOS FLORES RIOS CARLOS FLORES 2020-10-08 23:47:39.520
  80. */

Ejemplo de cómo sacarle una copia de seguridad al certificado.
  1. USE FinancieraDemoBD
  2. GO
  3.  
  4. -- Sacar una copia de seguridad del certificado
  5. BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
  6. WITH PRIVATE KEY ( FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key' ,
  7. ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' );
  8. GO
  9.  
Se borrará el certificado para simular su pérdida en escenarios donde se hace un backup de la base de datos y se restaurá en otro servidor y dicho certificado no se guardó con el backup.
  1. -- Eliminar el certificado.
  2. DROP CERTIFICATE FinancieraCertificado
  3. GO
  4.  
  5.  
  6. -- Podemos confirmar que nuestro certificado no esta y no podemos desencriptar nuestra informacion
  7. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  8. FROM sys.certificates
  9.  
  10. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  11. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  12. FECING
  13. FROM dbo.CLIENTE
  14.  
  15. /*
  16. IDCLIENTE NOMBRE NOMBRECORTO FECING
  17. 1 NULL NULL 2020-10-08 23:47:39.520
  18. */
Probaremos a crear nuevamente el certificado a ver si todo funcionara nuevamente.
  1. -- Creamos el certificado
  2. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  3. EXPIRY_DATE = '20211231'
  4. GO
  5.  
  6. -- Probamos desencriptar la informacion
  7. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  8. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  9. FECING
  10. FROM dbo.CLIENTE
  11. /*
  12. IDCLIENTE NOMBRE NOMBRECORTO FECING
  13. 1 NULL NULL 2020-10-08 23:47:39.520
  14. */
Sin embargo, no funcionó debido a que el certificado que se usó no es el mismo que encripto la información, a pesar de que se creó el certificado con la misma instrucción. Volveremos a eliminar el certificado y restaurarlo desde el backup.
  1. -- Volvemos a eliminar el certificado
  2. DROP CERTIFICATE FinancieraCertificado
  3. GO
  4.  
  5. -- Ahora restauramos el certificado desde nuestra copia de seguridad
  6. CREATE CERTIFICATE FinancieraCertificado
  7. FROM FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
  8. WITH PRIVATE KEY (FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key',
  9. DECRYPTION BY PASSWORD = 'TopSecretINFO2020');
  10. GO
  11.  
  12. -- Finalmente volvemos a consultar la informacion
  13. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  14. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  15. FECING
  16. FROM dbo.CLIENTE

La clave especificada en: DECRYPTION BY PASSWORD = 'TopSecretINFO2020' tiene que ser la misma que la especificada en: ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' y no tiene que se la misma que se usó al crear la MASTER KEY en: CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'

Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 10:52:00 a. m. Share:

0 comentarios:

Encriptación de Datos en SQL SERVER

En los sistemas de información muchas veces se maneja data sensible que se requiere proteger para evitar que caigan en manos maliciosas, por ejemplo: nombre de un cliente, número de documento de identidad, número de cuenta de ahorros, número de tarjetas de crédito, dirección de correo, número de teléfono, etc. Para esto es conveniente tener la información encriptada dentro de la base de datos. SQL Server, a partir de la versión 2005, nos ofrece una variedad de formas para encriptar la información en la base de datos, entre las cuales tenemos:
  • Passphrase
  • Certificate
  • Symmetric Key
  • Asymmetric Key

Passphrase:
Esta es la forma más simple y básica de encriptación de datos que se puede tener en SQL Server. Lo único que se necesita para encriptar los datos es una frase o contraseña “segura”.
Ejemplo:
  1. --
  2. --
  3. IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
  4. BEGIN
  5. USE MASTER
  6. ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
  7. DROP DATABASE FinancieraDemoBD
  8. END
  9.  
  10.  
  11. -- Creamos la Base de Datos de prueba
  12. use master
  13. GO
  14.  
  15. create database FinancieraDemoBD
  16. GO
  17.  
  18. -- Usamos la Base de Datos de Prueba
  19. use FinancieraDemoBD
  20. GO
  21.  
  22. -- Creamos una tabla cliente con las columnas Nombre y NombreCorto
  23. -- de tipo varbinary para que contenga la informacion encriptada
  24. CREATE TABLE [dbo].[PROVEEDOR](
  25. [IDPROVEEDOR] [int] IDENTITY(1,1) NOT NULL,
  26. [FECING] [datetime] NULL,
  27. [USUING] [varchar](6) NULL,
  28. [FECACT] [datetime] NULL,
  29. [USUACT] [varchar](6) NULL,
  30. [NOMBRE] [varbinary](max) NOT NULL
  31. PRIMARY KEY CLUSTERED
  32. (
  33. [IDPROVEEDOR] ASC
  34. )
  35. ) ON [PRIMARY]
  36. GO
  37.  
  38.  
  39.  
  40. -- Insertar un valor
  41. INSERT INTO dbo.PROVEEDOR (FECING, USUING, NOMBRE)
  42. VALUES (getdate(), 'IRE001', ENCRYPTBYPASSPHRASE('ClaveSecretaIRE','ANDRES LARA FABIAN'))
  43. GO
  44. -- Select convencional
  45. SELECT IDPROVEEDOR, NOMBRE, FECING
  46. FROM dbo.PROVEEDOR
  47. /*
  48. IDPROVEEDOR NOMBRE FECING
  49. 1 0x01000000DC8... 2020-10-08 23:36:54.097
  50. */
  51.  
  52. -- Select con una frase incorrecta
  53. SELECT IDPROVEEDOR, CONVERT(VARCHAR(100), DECRYPTBYPASSPHRASE('ClaveSecreta',NOMBRE)) as 'NOMBRE',
  54. FECING
  55. FROM dbo.PROVEEDOR
  56. /*
  57. IDPROVEEDOR NOMBRE FECING
  58. 1 NULL 2020-10-08 23:14:56.043
  59. */
  60.  
  61. -- Select con la frase correcta
  62. SELECT IDPROVEEDOR, CONVERT(VARCHAR(100), DECRYPTBYPASSPHRASE('ClaveSecretaIRE',NOMBRE)) as 'NOMBRE',
  63. FECING
  64. FROM dbo.PROVEEDOR
  65. /*
  66. IDPROVEEDOR NOMBRE FECING
  67. 1 ANDRES LARA FABIAN 2020-10-08 23:14:56.043
  68. */



Certificate: Otra forma de encriptación de datos dentro de la base de datos SQL Server a través de certificados digitales los cuales pueden ser adquiridos en alguna de las entidades que los expiden. SQL Server también permite la creación de certificados “self-signed” los cuales permiten al usuario crear un certificado propio con una sentencia simple de T-SQL. Los certificados en SQL Server pueden estar encriptados por un password, o por la Database Master Key, la cual es la primera llave que se debe crear en la base de datos para que a partir de ésta se encripten los demás objetos. A través de los certificados se puede tener un poco más de seguridad ya que para poder usar un certificado es necesario tener permiso al mismo para poder utilizarlo.

Ejemplo completo de la creación de un certificado “self-signed” encriptado a partir de la Database Master Key y se mostrará la encriptación y desencriptación de la información con dicho certificado.

  1. IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
  2. BEGIN
  3. USE MASTER
  4. ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
  5. DROP DATABASE FinancieraDemoBD
  6. END
  7.  
  8.  
  9. -- Creamos la Base de Datos de prueba
  10. use master
  11. GO
  12.  
  13. create database FinancieraDemoBD
  14. GO
  15.  
  16. -- Usamos la Base de Datos de Prueba
  17. use FinancieraDemoBD
  18. GO
  19.  
  20. -- Creamos una tabla cliente con las columnas Nombre y NombreCorto
  21. -- de tipo varbinary para que contenga la informacion encriptada
  22. CREATE TABLE [dbo].[CLIENTE](
  23. [IDCLIENTE] [int] IDENTITY(1,1) NOT NULL,
  24. [FECING] [datetime] NULL,
  25. [USUING] [varchar](6) NULL,
  26. [FECACT] [datetime] NULL,
  27. [USUACT] [varchar](6) NULL,
  28. [NOMBRE] [varbinary](max) NOT NULL,
  29. [NOMBRECORTO] [varbinary](max) NULL,
  30. PRIMARY KEY CLUSTERED
  31. (
  32. [IDCLIENTE] ASC
  33. )
  34. ) ON [PRIMARY]
  35.  
  36. GO
  37.  
  38.  
  39.  
  40. -- Crear una Database Master Key
  41. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
  42. GO
  43.  
  44. -- Crear el Certificado
  45. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  46. EXPIRY_DATE = '20211231'
  47. GO
  48.  
  49.  
  50. -- Consultar los certificados que creados en la base de datos
  51. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  52. FROM sys.certificates
  53. /*
  54. name pvt_key_encryption_type_desc subject expiry_date
  55. FinancieraCertificado ENCRYPTED_BY_MASTER_KEY INFOTACTICAS Certificate 2021-12-31 00:00:00.000
  56. */
  57.  
  58.  
  59. -- Insertar un valor
  60. INSERT INTO dbo.CLIENTE (FECING, USUING, NOMBRE, NOMBRECORTO)
  61. VALUES (getdate(), 'IRE001', ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES RIOS'), ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES'))
  62. GO
  63. -- Select convencional
  64. SELECT IDCLIENTE, NOMBRE, NOMBRECORTO, FECING
  65. FROM dbo.CLIENTE
  66. /*
  67. IDCLIENTE NOMBRE NOMBRECORTO FECING
  68. 1 0xC118457BFAA... 0xEF308BFC78424F717... 2020-10-08 23:47:39.520
  69. */
  70.  
  71.  
  72. -- Select desencriptando los datos con el certificado correcto
  73. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  74. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  75. FECING
  76. FROM dbo.CLIENTE
  77. /*
  78. IDCLIENTE NOMBRE NOMBRECORTO FECING
  79. 1 CARLOS FLORES RIOS CARLOS FLORES 2020-10-08 23:47:39.520
  80. */
  81.  
  82. -- Select desencriptando los datos con el certificado incorrecto
  83. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificadoOTRO'),NOMBRE)) as 'NOMBRE',
  84. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  85. FECING
  86. FROM dbo.CLIENTE
  87. /*
  88. IDCLIENTE NOMBRE NOMBRECORTO FECING
  89. 1 NULL CARLOS FLORES 2020-10-08 23:14:56.043
  90. */

También se mostrará como es que se debe dar permisos a un usuario para que este pueda ver la información encriptada por el certificado.
Creamos un Usuario de pruebas para seleccionar la información de la tabla desencriptándola con el certificado pero ejecutándolo domo el Usuario creado, en este caso la información sale como NULL debido a que no se le ha dado permisos al usuario creado para usar el certificado, por ello para hacer uso del certificado se debe tener el permiso de CONTROL sobre el certificado (GRANT CONTROL ON CERTIFICATE :: [FinancieraCertificado] TO [USUARIO_FINANCIERA]

  1. --
  2. -- Crear un usuario de prueba
  3. CREATE LOGIN [UsuarioFinanciera] WITH PASSWORD = N'Financiera2020'
  4. GO
  5. CREATE USER [UsuarioFinanciera] FOR LOGIN [UsuarioFinanciera]
  6. GO
  7. GRANT SELECT ON dbo.CLIENTE TO [UsuarioFinanciera]
  8. GO
  9.  
  10. -- Seleccionar la informacion con el certificado
  11. EXECUTE AS USER = 'UsuarioFinanciera'
  12. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  13. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  14. FECING
  15. FROM dbo.CLIENTE;
  16. REVERT
  17. /*
  18. IDCLIENTE NOMBRE NOMBRECORTO FECING
  19. 1 NULL NULL 2020-10-08 23:47:39.520
  20. */
  21.  
  22. -- La informacion sale como NULL debido a que no se tiene
  23. -- permiso para usuar el certificado como el UsuarioFinanciera
  24.  
  25. -- Para hacer uso del certificado se debe tener el permiso
  26. -- de control sobre el certificado. Ahora asignaremos ese permiso al UsuarioFinanciera
  27. GRANT CONTROL ON CERTIFICATE::[FinancieraCertificado] TO [UsuarioFinanciera]
  28. GO
  29.  
  30. -- Seleccionar de nuevo la informacion con el certificado
  31. EXECUTE AS USER = 'UsuarioFinanciera'
  32. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  33. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  34. FECING
  35. FROM dbo.CLIENTE;
  36. REVERT
  37. /*
  38. IDCLIENTE NOMBRE NOMBRECORTO FECING
  39. 1 CARLOS FLORES RIOS CARLOS FLORES 2020-10-08 23:47:39.520
  40. */


Para conocer como crear copia de seguridad (BACKUP) de un certificado en SQL SERVER Y restaurarlo, visitar la siguiente entrada de mi blog:
http://infotacticassoluciones.blogspot.com/2020/10/copia-de-seguridad-backup-de.html

Simmetric Key (Clave Simétrica):
El principio de la encriptación a partir de llaves simétricas es que para encriptar y desencriptar la información se necesita la misma llave. Este tipo de encriptación es la más común. Para crear una llave simétrica, esta debe ser encriptada a partir de un certificado, de una llave asimétrica o de otra llave simétrica, lo cual nos brinda mayor seguridad porque el usuario deberá pasar por encima de todos estos métodos de encriptación para poder acceder a la llave que le permitirá encriptar o desencriptar la información.
A continuación, un ejemplo simple de encriptación de datos con clave simétrica.
  1. IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
  2. BEGIN
  3. USE MASTER
  4. ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
  5. DROP DATABASE FinancieraDemoBD
  6. END
  7.  
  8.  
  9. -- Creamos la Base de Datos de prueba
  10. use master
  11. GO
  12.  
  13. create database FinancieraDemoBD
  14. GO
  15.  
  16. -- Usamos la Base de Datos de Prueba
  17. use FinancieraDemoBD
  18. GO
  19.  
  20. -- Creamos una tabla COLABORADOR con las columnas Nombres y Apellidos
  21. -- de tipo varbinary para que contenga la informacion encriptada
  22. CREATE TABLE [dbo].[COLABORADOR](
  23. [IDCOLABORADOR] [int] IDENTITY(1,1) NOT NULL,
  24. [MATRICULACOLABORADOR] [varchar](6) NOT NULL,
  25. [FECING] [datetime] NULL,
  26. [USUING] [varchar](6) NULL,
  27. [FECACT] [datetime] NULL,
  28. [USUACT] [varchar](6) NULL,
  29. [NOMBRES] [varbinary](max) NOT NULL,
  30. [APELLIDOS] [varbinary](max) NOT NULL,
  31. PRIMARY KEY CLUSTERED
  32. (
  33. [IDCOLABORADOR] ASC
  34. )
  35. ) ON [PRIMARY]
  36.  
  37. GO
  38.  
  39.  
  40. -- Crear una Database Master Key
  41. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
  42. GO
  43.  
  44. -- Crear el Certificado
  45. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  46. EXPIRY_DATE = '20211231'
  47. GO
  48.  
  49.  
  50. -- Consultar los certificados que creados en la base de datos
  51. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  52. FROM sys.certificates
  53. /*
  54. name pvt_key_encryption_type_desc subject expiry_date
  55. FinancieraCertificado ENCRYPTED_BY_MASTER_KEY INFOTACTICAS Certificate 2021-12-31 00:00:00.000
  56. */
Para crear la llave simétrica
  1. -- Creamos la llave simetrica
  2. CREATE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  3. WITH
  4. KEY_SOURCE = 'ClaveSimetrica2020',
  5. IDENTITY_VALUE = 'MiValorIdentidad',
  6. ALGORITHM = AES_256
  7. ENCRYPTION BY CERTIFICATE FinancieraCertificado;
  8. GO
  9.  
  10. -- Hacemos una consulta para visualizar las llaves simetricas de la base de datos
  11. -- en este caso podemos observar 2: las cuales son la DMK y la llave simetrica creada
  12. -- a partir del certificado.
  13. SELECT name, algorithm_desc, create_date--, *
  14. FROM sys.symmetric_keys
  15. /*
  16. name algorithm_desc create_date
  17. ##MS_DatabaseMasterKey## AES_256 2020-10-08 23:45:00.460
  18. FINANCIERA_KEY_SYMMETRIC AES_256 2020-10-09 16:40:52.293
  19.  
  20. */
Ahora procederemos a ingresar valores a nuestra tabla. Para esto debemos abrir la llave simetrica, insertar un valor y Una vez que se termino de encriptar los datos, se cierra la llave simetrica.
  1. -- Abrir la llave simétrica
  2. OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
  3.  
  4. -- insertamos un valor
  5. INSERT INTO dbo.COLABORADOR (MATRICULACOLABORADOR, FECING, USUING, NOMBRES, APELLIDOS)
  6. VALUES ('CAR001', getdate(), 'IRE001', ENCRYPTBYKEY(KEY_GUID('FINANCIERA_KEY_SYMMETRIC'),'CESAR ANTONIO'), ENCRYPTBYKEY(KEY_GUID('FINANCIERA_KEY_SYMMETRIC'),'AVILA ROBLES'))
  7. GO
  8.  
  9. -- Una vez que se termino de encriptar los datos, se cierra la llave simetrica
  10. CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  11.  
  12. -- Intentamos hacer un select convencional
  13. SELECT MATRICULACOLABORADOR, NOMBRES, APELLIDOS
  14. FROM dbo.COLABORADOR
  15. /*
  16. MATRICULACOLABORADOR NOMBRES APELLIDOS
  17. CAR001 0x0034CE8C5... 0x0034CE8C5716...
  18. */
Para poder ver los datos debemos desencriptarlos con la llave simetrica, y para hacerlo debemos primero abrirla.
  1. OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
  2.  
  3. -- Ahora seleccionamos los datos pero antes los desencriptamos con la llave simetrica
  4. SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
  5. CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
  6. FROM dbo.COLABORADOR
  7. /*
  8. MATRICULACOLABORADOR NOMBRES APELLIDOS
  9. CAR001 CESAR ANTONIO AVILA ROBLES
  10. */
  11.  
  12. -- Y ahora volvemos a cerrar la llave simetrica
  13. CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  14.  

Para probar la seguridad de la llave simetrica, creamos un usuario de prueba: UsuarioCAFinanciera y probamos seleccionar la informacion con la llave simetrica.
  1.  
  2. CREATE LOGIN [UsuarioCAFinanciera] WITH PASSWORD = N'Protect2020'
  3. GO
  4. CREATE USER [UsuarioCAFinanciera] FOR LOGIN [UsuarioCAFinanciera]
  5. GO
  6. GRANT SELECT ON dbo.COLABORADOR TO UsuarioCAFinanciera
  7. GO
  8.  
  9. -- Probamos seleccionar la informacion con la llave simetrica
  10. EXECUTE AS USER = 'UsuarioCAFinanciera'
  11. OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
  12. SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
  13. CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
  14. FROM dbo.COLABORADOR
  15. REVERT
Aparece un error porque el usuario no tiene permisos sobre la llave simetrica. Para poder hacer uso de la llave simetrica debemos tener el permiso de control sobre el certificado que la encripta y sobre la misma llave simetrica.
  1. -- Ahora asignaremos ese permiso al UsuarioCAFinanciera
  2. GRANT CONTROL ON CERTIFICATE::[FinancieraCertificado] TO [UsuarioCAFinanciera]
  3. GO
  4. GRANT CONTROL ON SYMMETRIC KEY::FINANCIERA_KEY_SYMMETRIC TO UsuarioCAFinanciera
  5. GO
  6.  
  7. -- Probamos seleccionar la informacion con la llave simetrica
  8. EXECUTE AS USER = 'UsuarioCAFinanciera'
  9. OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
  10. SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
  11. CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
  12. FROM dbo.COLABORADOR
  13. CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
  14. REVERT
  15. /*
  16. MATRICULACOLABORADOR NOMBRES APELLIDOS
  17. CAR001 CESAR ANTONIO AVILA ROBLES
  18. */
Ahora la informacion si aparece.

Para conocer como crear copia de seguridad (BACKUP) de un clave simétrica en SQL SERVER Y restaurarlo, visitar la siguiente entrada de mi blog: https://infotacticassoluciones.blogspot.com/2020/10/copia-de-seguridad-de-clave-simetrica.html

Referencias:
https://dbamemories.wordpress.com/2011/10/14/encriptacion-de-datos-en-sql-server-%e2%80%93-parte-3/
Posted by InfoTacticas Soluciones  |  No comments

10/09/2020 09:04:00 a. m. Share:

0 comentarios:

sábado, 11 de enero de 2020

OPTION EXPLICIT ON y OPTION STRICT

Usar OPTION EXPLICIT ON y OPTION STRICT en VB.NET. (Tipado Estático, Dinámio, Fuerte y Débil)
Una de las cualidades más valoradas de Visual Basic es su flexibilidad y facilidad a la hora de programar, sin embargo, abusar de estas cualidades puede llevarnos a malas de programación, como por ejemplo:

No declarar variables vs OPTION EXPLICIT ON
Visual Basic permite el uso de variables al vuelo, es decir que las usemos sin declararlas y a eso se le llama tipado dinámico. Los lenguajes que exigen que declaremos las variables y les asignemos un tipo se llaman de tipado estático.
Visual Basic es que nos permite hacer lo que sigue Sin necesidad de haber declarado una variable ni haber definido su tipo, permitiendo que una variable pueda contener diferentes tipo de dato, sin preocuparnos de que haya errores.

Nombre= "Pedro"
Nombre = 2

Se puede decir que una variable es un contenedor genérico donde el tipo de dato se define en tiempo de ejecución, en lugar de en tiempo de compilación. Este contenedor también se crea en tiempo de ejecución, ya que el entorno de ejecución decide cuando hemos invocado una nueva variable y la crea.
En un lenguaje de tipado estático, la variable se reserva una posición de memoria y se define el tipo de dato que se utilizara. Estos lenguajes marcaran error si usamos una variable sin declararla o si en tiempo de ejecución cambiamos su tipo de dato.

La instrucción OPTION EXPLICIT ON, automáticamente convierte nuestro programa en un programa de tipado estático. Es decir nos obliga a declarar las variables y definir su tipo antes de usarlas. Eso implica mas trabajo a la hora de programar pero es importante usarlo porque mejora el rendimiento de la aplicación. Un lenguaje de tipado estático reserva de manera más exacta la memoria que va a utilizar. Toda la asignación de memoria se hace en tiempo de compilación, así que tampoco tiene que gastar tiempo en reservar nuevas direcciones de memoria conforme aparecen nuevas variables. Además el compilador puede crear un código mas optimizado cuando conoce las variables y tipos de datos a utilizar. También es importante porque facilita la lectura y mantenimiento de código y previene errores de tipado dado que podemos tener errores de tipo de conversión de datos o asignaciones de datos incorrectas. Y además se hace mas complejo debuguear dichos errores.

Conversión de tipo de datos "al vuelo" vs OPTION STRICT ON
Otra característica referente al tipo de datos es que los lenguajes pueden ser de tipado fuerte y tipado débil. ¿Qué significa esto?
Bueno en Visual Basic, el entorno de ejecución se encarga de hacer las conversiones de tipo de dato de manera implícita. Es decir que no tenemos que usar una función especial para convertir los datos e un tipo a otro, y además el entorno de ejecución sabe descifrar el tipo de dato y lo convierte en el mas adecuado al momento de la ejecución. Por ejemplo en Visual Basic esto es válido:

Num = 1
Num2 = "33"
Num3 = Num - Num2
Num4 = Num2 + Num
Direccion = "Calle"
Direccion = Direccion + Num

Se pueden mezclar tipos de datos en diferentes operaciones y el entorno decidirá cuál es la conversión mas adecuado. Es decir podemos hacer operaciones aritméticas con strings, concatenar números y strings y básicamente cualquier operación que el entorno de ejecución pueda manejar.
A simple vista podemos notar cómo este tipo de programación puede generar bastantes errores al hacer las conversiones de datos.
Si queremos mayor exactitud en nuestro código, y que el lenguaje nos obligue a convertir los tipos de datos de manera explícita, es decir utilizando las apropiadas funciones de conversión de datos, debemos utilizar la siguiente instrucción en VB.NET: OPTION STRICT ON. Al activar esta opción, Visual Basic no nos permitirá hacer conversiones implícitas y será mucho más estricto en el manejo de nuestros tipos de datos.

Fuente: https://robertomiguelz.blogspot.com/2018/08/por-que-usar-option-explicit-on-y.html
Posted by InfoTacticas Soluciones  |  No comments

1/11/2020 11:12:00 p. m. Share:

0 comentarios:

Page 1 of 11123»
Get updates in your email box
Complete the form below, and we'll send you the best coupons.

Deliver via FeedBurner