2 votes

L'insertion dans la vue renvoie 2 lignes affectées

Dans Sql Server 2005, j'ai deux bases de données. Dans la première, j'ai une table comme celle-ci :

CREATE TABLE [dbo].[SG](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [sgName] [nvarchar](50) NOT NULL,
    [active] [bit] NOT NULL,
    [hiddenf] [int] NOT NULL
)

Dans la seconde, j'ai une vue comme celle-ci :

CREATE VIEW [dbo].[SG] AS   
    SELECT id,sgName, active 
    FROM [FirstDatabase].dbo.SG WHERE hiddenf = 1

avec un déclencheur comme celui-ci :

CREATE TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
   INSERT INTO [FirstDatabase].dbo.SG(sgName,active,hiddenf)
   SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END

Quand j'insère dans la vue :

using (SqlConnection connection = new SqlConnection(
               connectionString))
{
   SqlCommand command = new SqlCommand("INSERT INTO SG(sgName, active) VALUES('Test', 1)", connection);
   var affectedRows = command.ExecuteNonQuery();
   Assert.AreEqual(1, affectedRows);
}

J'obtiens affectedRows égal à deux, alors que ma valeur attendue est de 1.

4voto

Tom Chantler Points 8266

Ce genre de question me fait généralement penser à des "déclencheurs".

Je viens de créer une copie exacte de votre scénario (merci pour les instructions détaillées) et je vois des résultats similaires.

Par "en quelque sorte", je voulais dire que lorsque j'exécute l'insertion, SSMS affiche

(1 rangée(s) affectée(s))

(1 rangée(s) affectée(s))

mais quand j'ai vérifié la base de données originale, une seule ligne avait été ajoutée.

Pour résoudre votre problème, faites ceci :

ALTER TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
   SET NOCOUNT ON -- adding this in stops it from reporting from in here
   INSERT INTO [TEST].dbo.SG(sgName,active,hiddenf)
   SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END

Le problème est que le déclencheur et la table réelle de la base de données d'origine signalent tous deux qu'ils ont mis à jour une ligne. Si vous supprimez ce rapport du déclencheur, mais le laissez dans la base de données d'origine, vous obtiendrez toujours une réponse vraie, que vous mettiez à jour via la vue ou directement dans la table d'origine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X