OVH Cloud OVH Cloud

Savoir le nom de la table que l'on traite dans un trigger

5 réponses
Avatar
Hervé R.
Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché dans
les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel il
exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous

5 réponses

Avatar
Med Bouchenafa
En principe si tu connais le nom de ton trigger, tu peux connaitre la table
à laquelle il appartient

SELECT @tableid = parent_obj FROM sysobjects WHERE id =
object_id(@triggername, 'local') AND xtype='TR'


--
Bien cordialement
Med Bouchenafa

"Hervé R." a écrit dans le message de news:
44be0c63$0$895$
Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché dans
les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel il
exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous




Avatar
Hervé R.
Merci pour la réponse, mais il se trouve que je voudrais quelque chose de
générique quelque soit le nom du trigger pour ne pas avoir à mettre le nom
du trigger dans le code.
Si il n'y a pas d'autre solution, je me débrouillerai avec ca.

Encore Merci

Hervé Rous


"Med Bouchenafa" a écrit dans le message de news:

En principe si tu connais le nom de ton trigger, tu peux connaitre la
table à laquelle il appartient

SELECT @tableid = parent_obj FROM sysobjects WHERE id =
object_id(@triggername, 'local') AND xtype='TR'


--
Bien cordialement
Med Bouchenafa

"Hervé R." a écrit dans le message de news:
44be0c63$0$895$
Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché dans
les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel il
exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous








Avatar
Philippe T [MS]
Bonjour,

On peut cumuler la réponse présédente avec cela :

<<
DROP PROCEDURE testprocedure
GO

CREATE PROCEDURE testprocedure AS
BEGIN
DECLARE @ProcId int
DECLARE @ProcName nvarchar(100)
DECLARE @TableId int

SELECT @ProcId = @@PROCID
SELECT @ProcName = name FROM sysobjects WHERE id = @ProcId -- Nom de la
procédure

PRINT @ProcName
END
GO

EXEC testprocedure
GO






Si l'on est dans un trigger, je pense que le nom du trigger est récupéré
dans @ProcName et donc on peut récupérer le nom de la table sous-jacente.

Phil.
________________________________________________________
Philippe TROTIN
Microsoft Services France http://www.microsoft.com/france
"Hervé R." wrote in message
news:44be2239$0$864$
Merci pour la réponse, mais il se trouve que je voudrais quelque chose de
générique quelque soit le nom du trigger pour ne pas avoir à mettre le nom
du trigger dans le code.
Si il n'y a pas d'autre solution, je me débrouillerai avec ca.

Encore Merci

Hervé Rous


"Med Bouchenafa" a écrit dans le message de news:

En principe si tu connais le nom de ton trigger, tu peux connaitre la
table à laquelle il appartient

SELECT @tableid = parent_obj FROM sysobjects WHERE id =
object_id(@triggername, 'local') AND xtype='TR'


--
Bien cordialement
Med Bouchenafa

"Hervé R." a écrit dans le message de news:
44be0c63$0$895$
Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché
dans les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel
il exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous












Avatar
SQLpro
Insiprez vous de ce code :

-- le trigger de traçage
ALTER TRIGGER E_UD_APT
ON T_APISTER_APT
FOR UPDATE, DELETE
AS
INSERT INTO T_H_APISTER_APT
SELECT d.*,
CASE
WHEN EXISTS(SELECT *
FROM inserted)
THEN 'U'
ELSE 'D'
END ,
CURRENT_TIMESTAMP,
hostname,
program_name ,
nt_domain,
nt_username,
net_address,
loginame,
s.name --> nom du trigger
FROM deleted AS d
CROSS JOIN master.dbo.sysprocesses as p
CROSS JOIN sysobjects as s --> table système contennt les défintions
d'objets
WHERE p.spid = @@SPID
AND s.id = @@PROCID --> identifiant système de la procédure en cours
(dans notre cas trigger)

Voir le post intitulé "trigger, curseur et création de fichier texte du 18/07.

A +


--
Frédéric BROUARD - MVP SQL Server, expert SGBDR & SQL
Le site SQL et les SGBDR http://sqlpro.developpez.com
Audit, conseil, formation, modélisation, optimisation
=> http://www.datasapiens.com


"Hervé R." a écrit :

Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché dans
les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel il
exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous





Avatar
Hervé R.
J'ai trouvé ma solution....

declare @NOMFIC AS varchar(50)
declare @tableid as varchar(50)
SELECT @tableid = parent_obj FROM sysobjects WHERE id @@PROCID AND xtype='TR'
set @nomfic=object_name(@tableid)

Merci de vos réponses.


"SQLpro" a écrit dans le message de news:

Insiprez vous de ce code :

-- le trigger de traçage
ALTER TRIGGER E_UD_APT
ON T_APISTER_APT
FOR UPDATE, DELETE
AS
INSERT INTO T_H_APISTER_APT
SELECT d.*,
CASE
WHEN EXISTS(SELECT *
FROM inserted)
THEN 'U'
ELSE 'D'
END ,
CURRENT_TIMESTAMP,
hostname,
program_name ,
nt_domain,
nt_username,
net_address,
loginame,
s.name --> nom du trigger
FROM deleted AS d
CROSS JOIN master.dbo.sysprocesses as p
CROSS JOIN sysobjects as s --> table système contennt les défintions
d'objets
WHERE p.spid = @@SPID
AND s.id = @@PROCID --> identifiant système de la procédure en cours
(dans notre cas trigger)

Voir le post intitulé "trigger, curseur et création de fichier texte du
18/07.

A +


--
Frédéric BROUARD - MVP SQL Server, expert SGBDR & SQL
Le site SQL et les SGBDR http://sqlpro.developpez.com
Audit, conseil, formation, modélisation, optimisation
=> http://www.datasapiens.com


"Hervé R." a écrit :

Bonjour,

Une petite question concernant les triggers en SQL2000. J'ai cherché dans
les docs etc.. mais j'ai rien trouvé.
J'ai besoin dans un trigger de connaitre le nom de la table sur lequel il
exécute, auriez vous une solution (genre select DB_NAME()).
J'explique un peu pourquoi car ma demande peut passer pour bizarre étant
donné qu'on créé un trigger sur une table donnée...
J'ai un ensemble de tables identiques mais avec des nom différents
(préfixées par 01 à 99). Ces tables auront un trigger identique qui
exécutera.
Ce trigger update un autre table qui est commune au 99 autres mais dans
laquelle j'ai une colonne qui contient le nom de la table d'origine.
Je voudrais donc créer un trigger 'générique' dont le code pourrait être
copié facilement pour toutes les tables.

SET @NOMTABLE= REPONSE_A_ME_DONNER
UPDATE TABLECOMMUNE SET ORIGINE=@NOMTABLE

Merci de vos réponses.

Hervé Rous