4/12/2024 10:11:00 p. m.
Share:
Blog Informático sobre Análisis y Desarrollo de Software.
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:
- --Sincronizar la tabla TARGET con
- --los datos actuales de la tabla SOURCE
- MERGE Alumno AS TARGET
- USING AlumnoActual AS SOURCE
- ON (TARGET.Codigo = SOURCE.Codigo)
- --Cuandos los registros concuerdan con por la llave
- --se actualizan los registros si tienen alguna variación
- WHEN MATCHED AND TARGET.Nombre <> SOURCE.Nombre
- OR TARGET.Promedio <> SOURCE.Promedio THEN
- UPDATE SET TARGET.Nombre = SOURCE.Nombre,
- TARGET.Promedio = SOURCE.Promedio
- --Cuando los registros no concuerdan por la llave
- --indica que es un dato nuevo, se inserta el registro
- --en la tabla TARGET proveniente de la tabla SOURCE
- WHEN NOT MATCHED BY TARGET THEN
- INSERT (Codigo, Nombre, Promedio)
- VALUES (SOURCE.Codigo, SOURCE.Nombre, SOURCE.Promedio)
- --Cuando el registro existe en TARGET y no existe en SOURCE
- --se borra el registro en TARGET
- WHEN NOT MATCHED BY SOURCE THEN
- DELETE
- --Seccion opcional e informativa
- --$action indica el tipo de accion
- --en OUTPUT retorna cualquiera de las 3 acciones
- --'INSERT', 'UPDATE', or 'DELETE',
- OUTPUT $action,
- DELETED.Codigo AS TargetCodigo,
- DELETED.Nombre AS TargetNombre,
- DELETED.Promedio AS TargetPuntos,
- INSERTED.Codigo AS SourceCodigo,
- INSERTED.Nombre AS SourceNombre,
- INSERTED.Promedio AS SourcePuntos;
- SELECT @@ROWCOUNT;
- GO
- SELECT * FROM Alumno
- SELECT * FROM AlumnoActual
Asignación de Roles a Login
- CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020'
- GO
- CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]
- -- creación de login desde Windows
- CREATE LOGIN [LoginFinanciera] FROM WINDOWS WITH DEFAULT_DATABASE=[FinancieraDemoBD]
- -- Agregar rol dbcreator al login
- EXEC sp_addsrvrolemember 'LoginFinanciera', 'dbcreator'
- USE FinancieraDemoBD
- GO
- CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
- GO
- -- conceder permisos al usuario para que realice Select sobre una tabla de la BD.
- GRANT SELECT ON dbo.CLIENTE TO UsuarioBDFinanciera
- GO
- -- Eliminar Login y Usuario
- drop login LoginFinanciera
- drop user UsuarioBDFinanciera
- -- CREACION DE LOGIN
- USE [master]
- GO
- IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = N'LoginFinanciera')
- CREATE LOGIN [LoginFinanciera] WITH PASSWORD = N'Protect2020', DEFAULT_DATABASE=[FinancieraDemoBD]
- -- CREACION DE USUARIO DE BASE DE DATOS
- USE [FinancieraDemoBD]
- GO
- IF NOT EXISTS(SELECT name FROM sys.sysusers WHERE name = 'UsuarioBDFinanciera')
- CREATE USER [UsuarioBDFinanciera] FOR LOGIN [LoginFinanciera]
- GO
- -- ASIGNACION DE PERMISOS
- EXEC sp_addrolemember N'db_datareader', N'UsuarioBDFinanciera'
- GO
- EXEC sp_addrolemember N'db_datawriter', N'UsuarioBDFinanciera'
- GO
- GRANT EXECUTE TO [UsuarioBDFinanciera]
- -- DAR PERMISOS AL USUARIO DE BASE DE DATOS SOBRE PROCEDIMIENTOS ALMACENADOS Y TABLAS
- USE [FinancieraDemoBD]
- GO
- GRANT EXECUTE ON [spListar_Clientes] TO [UsuarioBDFinanciera];
- GRANT EXECUTE ON [spInsertar_Cliente] TO [UsuarioBDFinanciera];
- GRANT EXECUTE ON [spListar_Proveedor] TO [UsuarioBDFinanciera];
- GRANT EXECUTE ON [spInsertar_Proveedor] TO [UsuarioBDFinanciera];
- GRANT SELECT,INSERT,UPDATE,DELETE ON [CLIENTE] TO [UsuarioBDFinanciera];
- GRANT SELECT,INSERT,UPDATE,DELETE ON [PROVEEDOR] TO [UsuarioBDFinanciera];
- GRANT SELECT,INSERT,UPDATE,DELETE ON "dbo"."COLABORADOR" TO "UsuarioBDFinanciera";
- -- PERMISO ESPECIAL --> EVALUAR CONSIDERACIONES DE SEGURIDAD
- GRANT ALTER ON "dbo"."CLIENTE" TO "UsuarioBDFinanciera";
- GO
- -- *** Ver los Inicios de Sesión de la Instancia de SQL Server ***
- select sid, name, dbname, password, loginname
- from master..syslogins
- -- Ver los inicios de Sesion
- select * from sys.server_principals
- -- *** Ver los Usuarios de la Base de Datos actual de SQL Server ***
- use FinancieraDemoBD
- GO
- select uid, name, sid, *
- from sysusers
- where islogin=1
- select * from sys.database_principals
Ahora borraremos la llave simetrica, el certificado y la master key
- USE FinancieraDemoBD
- GO
- -- sacaremos una copia de seguridad de la DMK
- BACKUP MASTER KEY TO FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
- ENCRYPTION BY PASSWORD = 'TopSecret2020MK';
- GO
- -- Sacaremos una copia de seguridad del certificado
- BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cer'
- WITH PRIVATE KEY ( FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key' ,
- ENCRYPTION BY PASSWORD = 'TopSecret2020C' );
- GO
- DROP SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
- GO
- -- Ahora perderemos el certificado.
- DROP CERTIFICATE FinancieraCertificado
- GO
- -- Ahora perderemos la DMK
- DROP MASTER KEY
- GO
- RESTORE MASTER KEY
- FROM FILE = 'D:\BACKUP\PERSONAL\DMK.dat'
- DECRYPTION BY PASSWORD = 'TopSecret2020MK'
- ENCRYPTION BY PASSWORD = 'TopSecret2020MKN'
- GO
- -- Ahora abrimos la DMK sino no podremos restaurar el certificado
- OPEN MASTER KEY DECRYPTION BY PASSWORD = 'TopSecret2020MKN'
- GO
- -- Ahora restauramos el certificado
- CREATE CERTIFICATE FinancieraCertificado
- FROM FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.cert'
- WITH PRIVATE KEY (FILE = 'D:\BACKUP\PERSONAL\FinancieraCertificadoCS.key',
- DECRYPTION BY PASSWORD = 'TopSecret2020C');
- GO
- -- Ahora recreamos la llave simetrica
- CREATE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
- WITH
- KEY_SOURCE = 'ClaveSimetrica2020',
- IDENTITY_VALUE = 'MiValorIdentidad',
- ALGORITHM = AES_256
- ENCRYPTION BY CERTIFICATE FinancieraCertificado
- GO
- OPEN SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC DECRYPTION BY CERTIFICATE FinancieraCertificado;
- -- Ahora seleccionamos los datos pero antes los desencriptamos con la llave simetrica
- SELECT MATRICULACOLABORADOR, CONVERT(VARCHAR(100),DECRYPTBYKEY(NOMBRES)) AS NOMBRES,
- CONVERT(VARCHAR(100),DECRYPTBYKEY(APELLIDOS)) AS APELLIDOS
- FROM dbo.COLABORADOR
- /*
- MATRICULACOLABORADOR NOMBRES APELLIDOS
- CAR001 CESAR ANTONIO AVILA ROBLES
- */
- -- Y ahora volvemos a cerrar la llave simetrica
- CLOSE SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC