OVH Cloud OVH Cloud

Solution avec un trigger

3 réponses
Avatar
laffilippe
Bonjour,
je souhaite alimenter un datawarehouse à partir de BDD sources
sous sql server 2000. Pour cela je pars du principe que
j'alimente seulement le 'delta' mis à jour dans la source
(enregistrements mis à jour depuis le dernier chargement).

Mon but est de minimiser un quelconque impact sur tous processus
transactionnels dans la base source tout en choisissant une
méthode générique. Mon idée est donc de placer un trigger sur
chaques tables sources qui m'intéressent, et qui sur chaque
UPDATE / INSERT, va modifier un champ dédié de la table
appelé 'date_alim_DW'.

Voici le code du trigger :
------------------------------------------------------------------------
CREATE TRIGGER delta_sales ON [dbo].[sales]
AFTER INSERT, UPDATE
AS

-- blocage du phénomène de récursivité
IF ( (SELECT trigger_nestlevel( object_ID('delta_sales') ) ) > 1) RETURN

-- mis à jour du champ date_alim_DW avec la date de jour
UPDATE [dbo].[sales]
SET date_alim_DW = current_timestamp
FROM INSERTED
INNER JOIN [dbo].[sales] ON [dbo].[sales].sales_id = INSERTED.sales_id
------------------------------------------------------------------------

cela fonctionne très bien, cependant :
je suis obligé d'inactiver la récursivité (sinon le trigger
s'auto-appelle !). De même, il n'est pas possible de faire cela
dans le trigger :
exec sp_dboption 'Philippe Database', 'recursive triggers', 'FALSE';
et éventuellement de le repositionner avec sa valeur initiale.

Ma question est double : est-ce que cette méthode vous semble
intéressante pour détecter le 'delta' dans les sources ? de même
est ce qu'il n'y a pas un code plus simple qui permet de modifier
directement les données (comme avec ':NEW.') sans prendre
le risque d'une récursivité ?

Merci d'avance pour vos éclairages !
Philippe

3 réponses

Avatar
bruno reiter [MVP]
ne serait-il pas possible d'utiliser une colonne de type
timestamp(rowversion) et de stocker le dernier vu dans chaque table à chaque
extraction?

br

"laffilippe" wrote in message
news:
Bonjour,
je souhaite alimenter un datawarehouse à partir de BDD sources
sous sql server 2000. Pour cela je pars du principe que
j'alimente seulement le 'delta' mis à jour dans la source
(enregistrements mis à jour depuis le dernier chargement).

Mon but est de minimiser un quelconque impact sur tous processus
transactionnels dans la base source tout en choisissant une
méthode générique. Mon idée est donc de placer un trigger sur
chaques tables sources qui m'intéressent, et qui sur chaque
UPDATE / INSERT, va modifier un champ dédié de la table
appelé 'date_alim_DW'.

Voici le code du trigger :
------------------------------------------------------------------------
CREATE TRIGGER delta_sales ON [dbo].[sales]
AFTER INSERT, UPDATE
AS

-- blocage du phénomène de récursivité
IF ( (SELECT trigger_nestlevel( object_ID('delta_sales') ) ) > 1) RETURN

-- mis à jour du champ date_alim_DW avec la date de jour
UPDATE [dbo].[sales]
SET date_alim_DW = current_timestamp
FROM INSERTED
INNER JOIN [dbo].[sales] ON [dbo].[sales].sales_id = INSERTED.sales_id
------------------------------------------------------------------------

cela fonctionne très bien, cependant :
je suis obligé d'inactiver la récursivité (sinon le trigger
s'auto-appelle !). De même, il n'est pas possible de faire cela
dans le trigger :
exec sp_dboption 'Philippe Database', 'recursive triggers', 'FALSE';
et éventuellement de le repositionner avec sa valeur initiale.

Ma question est double : est-ce que cette méthode vous semble
intéressante pour détecter le 'delta' dans les sources ? de même
est ce qu'il n'y a pas un code plus simple qui permet de modifier
directement les données (comme avec ':NEW.') sans prendre
le risque d'une récursivité ?

Merci d'avance pour vos éclairages !
Philippe


Avatar
Med Bouchenafa
Ne serait-il pas plus simple de mettre en place une replication
transactionnelle ?

Bien cordialement
Med Bouchenafa

"laffilippe" wrote in message
news:
Bonjour,
je souhaite alimenter un datawarehouse à partir de BDD sources
sous sql server 2000. Pour cela je pars du principe que
j'alimente seulement le 'delta' mis à jour dans la source
(enregistrements mis à jour depuis le dernier chargement).

Mon but est de minimiser un quelconque impact sur tous processus
transactionnels dans la base source tout en choisissant une
méthode générique. Mon idée est donc de placer un trigger sur
chaques tables sources qui m'intéressent, et qui sur chaque
UPDATE / INSERT, va modifier un champ dédié de la table
appelé 'date_alim_DW'.

Voici le code du trigger :
------------------------------------------------------------------------
CREATE TRIGGER delta_sales ON [dbo].[sales]
AFTER INSERT, UPDATE
AS

-- blocage du phénomène de récursivité
IF ( (SELECT trigger_nestlevel( object_ID('delta_sales') ) ) > 1) RETURN

-- mis à jour du champ date_alim_DW avec la date de jour
UPDATE [dbo].[sales]
SET date_alim_DW = current_timestamp
FROM INSERTED
INNER JOIN [dbo].[sales] ON [dbo].[sales].sales_id = INSERTED.sales_id
------------------------------------------------------------------------

cela fonctionne très bien, cependant :
je suis obligé d'inactiver la récursivité (sinon le trigger
s'auto-appelle !). De même, il n'est pas possible de faire cela
dans le trigger :
exec sp_dboption 'Philippe Database', 'recursive triggers', 'FALSE';
et éventuellement de le repositionner avec sa valeur initiale.

Ma question est double : est-ce que cette méthode vous semble
intéressante pour détecter le 'delta' dans les sources ? de même
est ce qu'il n'y a pas un code plus simple qui permet de modifier
directement les données (comme avec ':NEW.') sans prendre
le risque d'une récursivité ?

Merci d'avance pour vos éclairages !
Philippe


Avatar
laffilippe
Je ne connais pas les 2 solutions proposées, mais je vais les regarder
de près, merci pour ces propositions.
Philippe


"Med Bouchenafa" a écrit :

Ne serait-il pas plus simple de mettre en place une replication
transactionnelle ?

Bien cordialement
Med Bouchenafa

"laffilippe" wrote in message
news:
> Bonjour,
> je souhaite alimenter un datawarehouse à partir de BDD sources
> sous sql server 2000. Pour cela je pars du principe que
> j'alimente seulement le 'delta' mis à jour dans la source
> (enregistrements mis à jour depuis le dernier chargement).
>
> Mon but est de minimiser un quelconque impact sur tous processus
> transactionnels dans la base source tout en choisissant une
> méthode générique. Mon idée est donc de placer un trigger sur
> chaques tables sources qui m'intéressent, et qui sur chaque
> UPDATE / INSERT, va modifier un champ dédié de la table
> appelé 'date_alim_DW'.
>
> Voici le code du trigger :
> ------------------------------------------------------------------------
> CREATE TRIGGER delta_sales ON [dbo].[sales]
> AFTER INSERT, UPDATE
> AS
>
> -- blocage du phénomène de récursivité
> IF ( (SELECT trigger_nestlevel( object_ID('delta_sales') ) ) > 1) RETURN
>
> -- mis à jour du champ date_alim_DW avec la date de jour
> UPDATE [dbo].[sales]
> SET date_alim_DW = current_timestamp
> FROM INSERTED
> INNER JOIN [dbo].[sales] ON [dbo].[sales].sales_id = INSERTED.sales_id
> ------------------------------------------------------------------------
>
> cela fonctionne très bien, cependant :
> je suis obligé d'inactiver la récursivité (sinon le trigger
> s'auto-appelle !). De même, il n'est pas possible de faire cela
> dans le trigger :
> exec sp_dboption 'Philippe Database', 'recursive triggers', 'FALSE';
> et éventuellement de le repositionner avec sa valeur initiale.
>
> Ma question est double : est-ce que cette méthode vous semble
> intéressante pour détecter le 'delta' dans les sources ? de même
> est ce qu'il n'y a pas un code plus simple qui permet de modifier
> directement les données (comme avec ':NEW.') sans prendre
> le risque d'une récursivité ?
>
> Merci d'avance pour vos éclairages !
> Philippe