viernes, 12 de abril de 2024

Conceder permisos para el Servicio de SQL Server Integration Services 2012

Posted by InfoTacticas Soluciones  |  No comments

4/12/2024 10:11:00 p. m. Share:

viernes, 7 de julio de 2023

INSTALACION SQL SERVER - ERROR - this SQL server setup media does not support the language of the OS

Si al intentar instalar SQL SERVER se muestra el siguiente mensaje de error "this SQL server setup media does not support the language of the OS" para solucionar se tiene que cambiar la configuración de Idioma a Español - España.

Mirar el siguiente video

sql server
Posted by InfoTacticas Soluciones  |  No comments

7/07/2023 10:17:00 p. m. Share:

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.

--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

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:

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
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]

Asignación de Roles a Login
-- Agregar rol dbcreator al login
EXEC sp_addsrvrolemember 'LoginFinanciera', 'dbcreator'

Creación de Usuario de Base de Datos
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 de Base de Datos
-- Eliminar Login y Usuario
drop login LoginFinanciera

drop user UsuarioBDFinanciera


Creación de Login y Usuario de Base de Datos, previa verificación de existencia

-- 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


Asignación de Roles a Usuario de Base de Datos y otorgar permisos a objetos: procedimientos almacenados, tablas
-- 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 


Consultar login y usuarios de base de datos

-- *** 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


Posted by InfoTacticas Soluciones  |  No comments

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

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.

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

Ahora borraremos la llave simetrica, el certificado y la master key
DROP SYMMETRIC KEY FINANCIERA_KEY_SYMMETRIC
GO

-- Ahora perderemos el certificado.
DROP CERTIFICATE FinancieraCertificado
GO

-- Ahora perderemos la DMK
DROP  MASTER KEY
GO


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 .
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

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
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
Posted by InfoTacticas Soluciones  |  1 comment

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