OVH Cloud OVH Cloud

QUOTED_IDENTIFIER

5 réponses
Avatar
nicolasheurtevin
Bonjour,

J'ai cr=E9e un trigger dans une base commerciale SAGE SQL Server,
trigger qui porte sur la table F_COMPTET (table des tiers). Le principe
est le suivant : affecter un bar=EAme pour chaque tiers par
l'interm=E9diaire du champ statistique n=B06. Lorsque l'utilisateur
quitte la fiche tiers, le trigger va tout d'abord rechercher la
correspondance entre l'indice du champ CT_Statistique06 et l'indice du
bar=EAme. Une fois l'indice trouv=E9, on ins=E8re dans la table
F_TARIFSELECT l'association tiers/bar=EAme en ayant pris soin de
supprimer auparavant toute association du client avec un autre bar=EAme
existant.


Le probl=E8me est le suivant : lorsque je ferme la fiche tiers, j'ai la
sympathique erreur suivante :

DELETE a =E9chou=E9 car les options SET suivantes comportent des
param=E8tres incorrects : 'QUOTED_IDENTIFIER'.

J'ai pourtant essay=E9 l'option SET QUOTED_IDENTIFIER OFF mais sans
effet.

Que faire ?


Voici mon trigger (tout conseil d'optimisation est =E9videmment le
bienvenu)

CREATE TRIGGER TG_BAREME_F_COMPTET ON F_COMPTET
FOR UPDATE
AS
DECLARE @CT_Num VARCHAR(32)

SELECT @CT_Num=3DCT_Num FROM INSERTED

DELETE FROM F_TARIFSELECT
WHERE TS_Ref =3D @CT_Num
AND (TF_No =3D 2 OR TF_No =3D 4 OR TF_No =3D 5 OR TF_No =3D 6)

INSERT INTO F_TARIFSELECT(TF_No, TS_Interes, TS_Ref)
SELECT F_TARIF.TF_No, 3 AS TS_Interes, CT_Num AS TS_Ref
FROM F_COMPTET, F_TARIF
WHERE F_COMPTET.CT_Statistique06 =3D RIGHT(F_TARIF.AR_Ref,1)
AND CT_Statistique06 <> ''
AND CT_Num NOT IN
(
SELECT TS_Ref
FROM F_TARIFSELECT
)

5 réponses

Avatar
Fred BROUARD
bonjour,

a écrit:
Bonjour,

J'ai crée un trigger dans une base commerciale SAGE SQL Server,
trigger qui porte sur la table F_COMPTET (table des tiers). Le principe
est le suivant : affecter un barême pour chaque tiers par
l'intermédiaire du champ statistique n°6. Lorsque l'utilisateur
quitte la fiche tiers, le trigger va tout d'abord rechercher la
correspondance entre l'indice du champ CT_Statistique06 et l'indice du
barême. Une fois l'indice trouvé, on insère dans la table
F_TARIFSELECT l'association tiers/barême en ayant pris soin de
supprimer auparavant toute association du client avec un autre barême
existant.


Le problème est le suivant : lorsque je ferme la fiche tiers, j'ai la
sympathique erreur suivante :

DELETE a échoué car les options SET suivantes comportent des
paramètres incorrects : 'QUOTED_IDENTIFIER'.

J'ai pourtant essayé l'option SET QUOTED_IDENTIFIER OFF mais sans
effet.

Que faire ?


Voici mon trigger (tout conseil d'optimisation est évidemment le
bienvenu)

CREATE TRIGGER TG_BAREME_F_COMPTET ON F_COMPTET
FOR UPDATE
AS
DECLARE @CT_Num VARCHAR(32)

SELECT @CT_Num=CT_Num FROM INSERTED

DELETE FROM F_TARIFSELECT
WHERE TS_Ref = @CT_Num
AND (TF_No = 2 OR TF_No = 4 OR TF_No = 5 OR TF_No = 6)

INSERT INTO F_TARIFSELECT(TF_No, TS_Interes, TS_Ref)
SELECT F_TARIF.TF_No, 3 AS TS_Interes, CT_Num AS TS_Ref
FROM F_COMPTET, F_TARIF
WHERE F_COMPTET.CT_Statistique06 = RIGHT(F_TARIF.AR_Ref,1)
AND CT_Statistique06 <> ''
AND CT_Num NOT IN
(
SELECT TS_Ref
FROM F_TARIFSELECT
)




Votre logique au sein du trigger est déjà une hérésie car vous n'avez prévu que
le seul cas ou le déclenchement se fait sur une seule ligne.

Or un trigger se déclanche une seule fois quelque soit le nombre de ligne.

Votre trigger ne vas donc opérer que pour une seule ligne même si la mise à jour
concerne 33 lignes !

voici donc une correction de votre trigger :

CREATE TRIGGER TG_BAREME_F_COMPTET ON F_COMPTET
FOR UPDATE
AS

DELETE FROM F_TARIFSELECT
WHERE TS_Ref IN (SELECT CT_Num
FROM INSERTED)
AND TF_No IN (2, 4, 5, 6)

INSERT INTO F_TARIFSELECT (TF_No, TS_Interes, TS_Ref)
SELECT F_TARIF.TF_No, 3, CT_Num
FROM F_COMPTET C
INNER JOIN F_TARIF T
ON C.CT_Statistique06 = RIGHT(T.AR_Ref, 1)
WHERE CT_Statistique06 <> ''
AND CT_Num NOT IN (SELECT TS_Ref
FROM F_TARIFSELECT)

maintenant je ne sais pourquoi l'erreur à été levée, mais des éditeurs comme
SAGE implémentent des triggers de contrôle de redondance pour éviter que les
bidouilleurs en informatique ne polluent les données des bases par des INSERT,
UPDATE ou DELETE parasite et rendent la base incohérente.

testez donc un trigger que ne fait rien dans les données et voyez ce qui se
passe et di vous avez la même erreur. Par exemple un trigger qui genère un faux
message d'erreur.

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Med Bouchenafa
Il faut probablement inclure SET QUOTED_IDENTIFIER OFF avant la création du
trigger
comme ceci

SET QUOTED_IDENTIFIER OFF
GO
CREATE TRIGGER....
GO
SET QUOTED_IDENTIFIER ON
GO

--
Bien cordialement
Med Bouchenafa

wrote in message
news:
Bonjour,

J'ai crée un trigger dans une base commerciale SAGE SQL Server,
trigger qui porte sur la table F_COMPTET (table des tiers). Le principe
est le suivant : affecter un barême pour chaque tiers par
l'intermédiaire du champ statistique n°6. Lorsque l'utilisateur
quitte la fiche tiers, le trigger va tout d'abord rechercher la
correspondance entre l'indice du champ CT_Statistique06 et l'indice du
barême. Une fois l'indice trouvé, on insère dans la table
F_TARIFSELECT l'association tiers/barême en ayant pris soin de
supprimer auparavant toute association du client avec un autre barême
existant.


Le problème est le suivant : lorsque je ferme la fiche tiers, j'ai la
sympathique erreur suivante :

DELETE a échoué car les options SET suivantes comportent des
paramètres incorrects : 'QUOTED_IDENTIFIER'.

J'ai pourtant essayé l'option SET QUOTED_IDENTIFIER OFF mais sans
effet.

Que faire ?


Voici mon trigger (tout conseil d'optimisation est évidemment le
bienvenu)

CREATE TRIGGER TG_BAREME_F_COMPTET ON F_COMPTET
FOR UPDATE
AS
DECLARE @CT_Num VARCHAR(32)

SELECT @CT_Num=CT_Num FROM INSERTED

DELETE FROM F_TARIFSELECT
WHERE TS_Ref = @CT_Num
AND (TF_No = 2 OR TF_No = 4 OR TF_No = 5 OR TF_No = 6)

INSERT INTO F_TARIFSELECT(TF_No, TS_Interes, TS_Ref)
SELECT F_TARIF.TF_No, 3 AS TS_Interes, CT_Num AS TS_Ref
FROM F_COMPTET, F_TARIF
WHERE F_COMPTET.CT_Statistique06 = RIGHT(F_TARIF.AR_Ref,1)
AND CT_Statistique06 <> ''
AND CT_Num NOT IN
(
SELECT TS_Ref
FROM F_TARIFSELECT
)
Avatar
Sylvain Lafontaine
Ou programmer le trigger de façon indépendante de cette option, c'est-à-dire
en utilisant l'apostrophe ou simple quote ' comme délimiteur des chaînes de
caractères (et si possible en évitant les caractères spéciaux et espaces
blancs dans les noms symboliques et/ou en utilisant [] sur SQL-Server).

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Med Bouchenafa" wrote in message
news:%
Il faut probablement inclure SET QUOTED_IDENTIFIER OFF avant la création
du trigger
comme ceci

SET QUOTED_IDENTIFIER OFF
GO
CREATE TRIGGER....
GO
SET QUOTED_IDENTIFIER ON
GO

--
Bien cordialement
Med Bouchenafa

wrote in message
news:
Bonjour,

J'ai crée un trigger dans une base commerciale SAGE SQL Server,
trigger qui porte sur la table F_COMPTET (table des tiers). Le principe
est le suivant : affecter un barême pour chaque tiers par
l'intermédiaire du champ statistique n°6. Lorsque l'utilisateur
quitte la fiche tiers, le trigger va tout d'abord rechercher la
correspondance entre l'indice du champ CT_Statistique06 et l'indice du
barême. Une fois l'indice trouvé, on insère dans la table
F_TARIFSELECT l'association tiers/barême en ayant pris soin de
supprimer auparavant toute association du client avec un autre barême
existant.


Le problème est le suivant : lorsque je ferme la fiche tiers, j'ai la
sympathique erreur suivante :

DELETE a échoué car les options SET suivantes comportent des
paramètres incorrects : 'QUOTED_IDENTIFIER'.

J'ai pourtant essayé l'option SET QUOTED_IDENTIFIER OFF mais sans
effet.

Que faire ?


Voici mon trigger (tout conseil d'optimisation est évidemment le
bienvenu)

CREATE TRIGGER TG_BAREME_F_COMPTET ON F_COMPTET
FOR UPDATE
AS
DECLARE @CT_Num VARCHAR(32)

SELECT @CT_Num=CT_Num FROM INSERTED

DELETE FROM F_TARIFSELECT
WHERE TS_Ref = @CT_Num
AND (TF_No = 2 OR TF_No = 4 OR TF_No = 5 OR TF_No = 6)

INSERT INTO F_TARIFSELECT(TF_No, TS_Interes, TS_Ref)
SELECT F_TARIF.TF_No, 3 AS TS_Interes, CT_Num AS TS_Ref
FROM F_COMPTET, F_TARIF
WHERE F_COMPTET.CT_Statistique06 = RIGHT(F_TARIF.AR_Ref,1)
AND CT_Statistique06 <> ''
AND CT_Num NOT IN
(
SELECT TS_Ref
FROM F_TARIFSELECT
)




Avatar
nicolasheurtevin
Merci à tous pour vos réponses.
Je concède effectivement une certaine hérésie dans mon trigger (je
débute ... mais ce n'est pas une raison).
Toujours est-il que même en essayant avec les instructions SET
QUOTED_IDENTIFIER OFF et GO avant le trigger, une erreur persiste mais
cette fois ci dans la cohérence du trigger lors du clic sur le bouton
Appliquer :

Erreur 170 : Ligne 2 : syntaxe incorrecte vers 'GO'.
'ALTER TRIGGER' doit être la première instruction d'un lot de requête s.
Avatar
Med Bouchenafa
Je pense que tu dois créer ton trigger par Entreprise Manager.
Ce que je t'ai donné dans un précédent message est à faire dans l'Analyseur
de requêtes

--
Bien cordialement
Med Bouchenafa


wrote in message
news:
Merci tous pour vos rponses.
Je concde effectivement une certaine hrsie dans mon trigger (je
dbute ... mais ce n'est pas une raison).
Toujours est-il que mme en essayant avec les instructions SET
QUOTED_IDENTIFIER OFF et GO avant le trigger, une erreur persiste mais
cette fois ci dans la cohrence du trigger lors du clic sur le bouton
Appliquer :

Erreur 170 : Ligne 2 : syntaxe incorrecte vers 'GO'.
'ALTER TRIGGER' doit tre la premire instruction d'un lot de requtes.