web-dev-qa-db-fra.com

La mise à jour a échoué car les options de définition suivantes ont des paramètres incorrects: 'citer_identifier' dans le travail de l'agent

En bref, j'ai ajouté une colonne calculée à une table, puis les travaux d'agents ont commencé à omettre et à signaler l'erreur:

La mise à jour a échoué car les options de définition suivantes ont des paramètres incorrects: 'citer_identifier'. Vérifiez que les options de réglage sont correctes pour une utilisation avec des vues indexées et/ou des index sur des colonnes calculées et/ou des index filtrés et/ou des notifications de la requête et/ou des méthodes de type de données XML et/ou des opérations d'index spatiaux. [SQLSTAT 42000] (Erreur 1934).

Une question antérieure suggère que les procédures stockées doivent être créées avec cité_dentifiant défini sur. Dans mon cas, toutefois, il n'y a pas de procédures stockées. Un exemple de travail d'agent a une étape et contient SQL droit pour effectuer deux mises à jour - chaque mise à jour est contre le tableau que j'ai modifié. Aucun de ce SQL ne contient un caractère de double citation (qui fait l'objet de cité_dentifiant).

Microsoft Documentation dit:

Définir cible_Identifier doit être activé lorsque vous créez ou modifiez des index sur des colonnes calculées ou des vues indexées.

... Cependant, j'ai simplement ajouté la colonne (persistée). Je n'ai ni créé ni modifié d'index.

  1. Pourquoi suis-je cette erreur dans ce scénario?
  2. Comment résoudre ça? Dois-je recréer tous les travaux de l'agent, changer cité_dentifiant sur avant que je fasse? Ou dois-je changer citer_identifier avant de modifier la table pour ajouter la colonne calculée?

Peut-être associé, le SQL suivant indique quels objets de la base de données avaient cité_dentifiant au moment de la compilation (c.-à-d. Qui sera interprété avec cette valeur lorsqu'elle est utilisée). De cela, je vois que ces déclencheurs sont également affectés par ce paramètre. Peut-être que la mise à jour du travail de l'agent invoque une gâchette qui est en quelque sorte liée? Je note cependant que tous les objets sont répertoriés en tant qu'utilisation_quoted_identififier = 1. En d'autres termes, si la résolution était de recréer des objets lors de la définition de cité_dentifiant avant de les recever, je ne vois pas quelle différence cela ferait ; Tous les objets semblent déjà avoir été créés de cette façon.

SELECT uses_ansi_nulls, uses_quoted_identifier, name, *
 FROM sys.sql_modules -- WHERE object_id = object_id('SampleProcedure')
 left outer join sys.sysobjects on sql_modules.object_id = sysobjects.id
2
youcantryreachingme

Pourquoi suis-je cette erreur dans ce scénario?

L'agent lui-même change QUOTED_IDENTIFIER à OFF.

J'ai écrit à ce sujet ici ( Mind the Police illisible, pas mon choix ).

Voici les tests exécutés sur SQL Server 2012 à SQL Server 2017:

Si j'exécute cette requête dans une fenêtre de requête SSMS:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';  
IF ( (256 & @@OPTIONS) = 256 ) SET @QUOTED_IDENTIFIER = 'ON';  
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;  

Le résultat montre comme sur:

QUOTED_IDENTIFIER
ON

Lorsque je mets la requête pour vérifier l'identifiant cité dans un travail et exécutez-le, cela se produit:

create table dbo.QUOTEDIDENTIFIER_CHECK(QUOTEDIDENTIFIER varchar(3));


DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';  
IF ( (256 & @@OPTIONS) = 256 ) SET @QUOTED_IDENTIFIER = 'ON';  
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;  

insert into dbo.QUOTEDIDENTIFIER_CHECK(QUOTEDIDENTIFIER)
select @QUOTED_IDENTIFIER;

enter image description here Voir les résultats:

select * from dbo.QUOTEDIDENTIFIER_CHECK;

Résultat:

QUOTEDIDENTIFIER
OFF

Lors de la traçage de l'agent, vous pouvez clairement voir la déclaration qui active l'identifiant cité.

enter image description here

Comment résoudre ça? Dois-je recréer tous les travaux de l'agent, changer cité_dentifiant sur avant que je fasse?

Pour résoudre ce problème, vous devez ajouter explicit SET QUOTED_IDENTIFIER ON; déclarations aux étapes du travail de l'agent.

2
Randi Vertongen