SQL Server - Sincronizacion de 2 bases de datos

 
Vista:
sin imagen de perfil
Val: 3
Ha aumentado su posición en 13 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

Sincronizacion de 2 bases de datos

Publicado por Carlos (9 intervenciones) el 16/07/2015 23:35:08
Hola a toda la comunidad.
El motivo de escribirles es para resolver unos problemas que estoy teniendo. Anteriormente me beneficio mucho la ayuda que recibí en el foro.
Lo que estoy tratando de hacer es un update entre distintos datos de 2 bases de datos (eBob y Sbmx_BATCH). La base de datos eBob pertenece a un software de medición de nivel en silos y la base de datos Smbx_BATCH es de mi autoría.
Al principio realice la sincronización por medio de un UPDATE entre las 2 bases de datos, el cual me funciono pero al tratar de que fuese automático me decidí por utilizar un TRIGGER (tanto el UPDAE como el TRIGGER recibí asesoría por un usuario de este foro).

En este momento estoy utilizando 3 TRIGGERs:

1) actualiza el materia de las tolvas (Sbmx_BATCH a eBob) - me funciona bien
Código:
Use Sbmx_BATCH1
GO

CREATE TRIGGER Material
ON [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores]
AFTER UPDATE
AS
UPDATE [eBob].[dbo].[tblVessel]
SET [eBob].[dbo].[tblVessel].[Contents] = inserted.[Material]
FROM inserted
WHERE [eBob].[dbo].[tblVessel].[VesselName] = inserted.[Id]
GO


2) actualiza las mediciones % de llenado (eBob a Sbmx_BATCH) - me da errores en el software de medición:
the server principal 'eBob' is notable to access the database 'Smbx_BATCH1' under the current security contexto

Código:
Use eBob
GO

CREATE TRIGGER Porcentaje
ON [eBob].[dbo].[tblMeasurementData_Temp]
AFTER INSERT
AS
UPDATE [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores]
SET [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores].[%] = inserted.[PercentFull]
FROM inserted
WHERE [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores].[Id] = inserted.[VesselName]
GO




3) actualiza las mediciones Peso en Kg (eBob a Sbmx_BATCH) - me da el mismo error:
the server principal 'eBob' is notable to access the database 'Smbx_BATCH1' under the current security contexto

Código:
Use eBob
GO

CREATE TRIGGER Peso
ON [eBob].[dbo].[tblMeasurementData_Temp]
AFTER INSERT
AS
UPDATE [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores]
SET [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores].[Peso medido (Kg)] = inserted.[ProductWeight]
FROM inserted
WHERE [Sbmx_BATCH1].[dbo].[Sbmx_Contenedores].[Id] = inserted.[VesselName]
GO


también me tengo que agregar que existen 2 tablas donde saco las mediciones en eBob, tblMeasurementData_Temp y tblMeasurementData. Don de la ultima al llegar a 200 registros pasa a la Temp.

Les agradezco cualquier información que me ayude a resolver el problema.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Sincronizacion de 2 bases de datos

Publicado por Isaias (4558 intervenciones) el 17/07/2015 19:21:54
Simple, tu problema esta en LOS PERMISOS, de cada base de datos, te explico.

Ejecutar un INSERT en tu base A y se dispara un trigger que inserta en B (esto con el usuario jmendez)

¿jmendez tiene permisos en la base B?

El mensaje es mas que claro: 'under the current security contexto' (bajo el ACTUAL contexto de SEGURIDAD)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 3
Ha aumentado su posición en 13 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

Sincronizacion de 2 bases de datos

Publicado por Carlos (9 intervenciones) el 17/07/2015 21:50:33
Hola Isaias, gracias por responder.
Obviamente por el mensaje de error supuse que seria algo de los permisos como tu lo dices.

Te explico lo que realiza el programa:
El programa de medición (eBob) lo tengo programado para que mande a leer el nivel de las tolvas cada 30 minutos, y su base de datos realiza un INSERT en la tabla tblMeasurementData. De esa tabla yo busco recoger esos datos de medición realizando un UPDATE con el TRIGGER.
Ayer y hoy estuve probando en mi laptop y todo va de maravilla, el problema ahora seria como dejar los permisos iguales que como los tengo en mi laptop en la otra PC. (en mi Laptop solo tengo acceso a un medidor de nivel, mientras que en la PC serian 37)

Replique el medidor de nivel 5 veces, cambiándole la dirección para ampliar mas la tabla de mediciones y sigue funcionando.
También quisiera comentarles que intente realizar una vista con los datos que me fueran útiles pero no supe como tomar solo los mas actuales.
Seleccione las siguientes columnas:

VesselName
ProductWeight
PercentFull
MeasurementDate

Con el siguiente codigo:

1
2
3
SELECT VesselName AS Id, ProductWeight AS Peso, PercentFull AS Porcentaje, MAX(MeasurementDate) AS Fecha
FROM     dbo.tblMeasurementData
GROUP BY VesselName, PercentFull, ProductWeight

No me resulto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sincronizacion de 2 bases de datos

Publicado por jesubu (3 intervenciones) el 20/07/2015 09:00:46
¿Las Base de Datos están en el mismo servidor o en distintos?.
La respuesta puede variar según esto.
Si están en el mismo servidor me decantaría a problemas de permisos. como bien ha indicado Isaias.

Te adjunto un script para compara permisos en Base de datos.
Selecciona la base de datos y ejecuta script en las base de datos correspondiente para comparar permisos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
USE MI_BASE_DE_DATOS
GO
SELECT
    [UserName] = ulogin.[name],
    [UserType] = CASE princ.[type]
                    WHEN 'S' THEN 'SQL User'
                    WHEN 'U' THEN 'Windows User'
                    WHEN 'G' THEN 'Windows Group'
                 END,
    [DatabaseUserName] = princ.[name],
    [Role] = null,
    [PermissionType] = perm.[permission_name],
    [PermissionState] = perm.[state_desc],
    [ObjectType] = CASE perm.[class]
                        WHEN 1 THEN obj.type_desc               -- Schema-contained objects
                        ELSE perm.[class_desc]                  -- Higher-level objects
                   END,
    [ObjectName] = CASE perm.[class]
                        WHEN 1 THEN OBJECT_NAME(perm.major_id)  -- General objects
                        WHEN 3 THEN schem.[name]                -- Schemas
                        WHEN 4 THEN imp.[name]                  -- Impersonations
                   END,
    [ColumnName] = col.[name]
FROM
    --database user
    sys.database_principals princ
LEFT JOIN
    --Login accounts
    sys.server_principals ulogin on princ.[sid] = ulogin.[sid]
LEFT JOIN
    --Permissions
    sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id]
LEFT JOIN
    --Table columns
    sys.columns col ON col.[object_id] = perm.major_id
                    AND col.[column_id] = perm.[minor_id]
LEFT JOIN
    sys.objects obj ON perm.[major_id] = obj.[object_id]
LEFT JOIN
    sys.schemas schem ON schem.[schema_id] = perm.[major_id]
LEFT JOIN
    sys.database_principals imp ON imp.[principal_id] = perm.[major_id]
WHERE
    princ.[type] IN ('S','U','G') AND
    -- No need for these system accounts
    princ.[name] NOT IN ('sys', 'INFORMATION_SCHEMA')


un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar