Au lieu de déclencher dans SQL Server perd SCOPE_IDENTITY?

J'ai une table où j'ai créé un INSTEAD OF déclencheur pour faire respecter certaines règles de gestion.

Le problème est que lorsque j'insère des données dans cette table, SCOPE_IDENTITY() renvoie une NULL valeur, plutôt que de la réelle identité insérée.

Insert + Champ d'application du code

INSERT INTO [dbo].[Payment]([DateFrom], [DateTo], [CustomerId], [AdminId])
VALUES ('2009-01-20', '2009-01-31', 6, 1)

SELECT SCOPE_IDENTITY()

Déclencheur:

CREATE TRIGGER [dbo].[TR_Payments_Insert]
   ON  [dbo].[Payment]
   INSTEAD OF INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF NOT EXISTS(SELECT 1 FROM dbo.Payment p
              INNER JOIN Inserted i ON p.CustomerId = i.CustomerId
              WHERE (i.DateFrom >= p.DateFrom AND i.DateFrom <= p.DateTo) OR (i.DateTo >= p.DateFrom AND i.DateTo <= p.DateTo)
              ) AND NOT EXISTS (SELECT 1 FROM Inserted p
              INNER JOIN Inserted i ON p.CustomerId = i.CustomerId
              WHERE  (i.DateFrom <> p.DateFrom AND i.DateTo <> p.DateTo) AND 
              ((i.DateFrom >= p.DateFrom AND i.DateFrom <= p.DateTo) OR (i.DateTo >= p.DateFrom AND i.DateTo <= p.DateTo))
              )

    BEGIN
        INSERT INTO dbo.Payment (DateFrom, DateTo, CustomerId, AdminId)
        SELECT DateFrom, DateTo, CustomerId, AdminId
        FROM Inserted
    END
    ELSE
    BEGIN
            ROLLBACK TRANSACTION
    END


END

Le code a travaillé avant la création de ce déclencheur. Je suis à l'aide de LINQ to SQL en C#. Je ne vois pas un moyen de changer de SCOPE_IDENTITY à @@IDENTITY. Comment puis-je faire ce travail?

  • Je prends cette table de travail avant que vous avez inséré la PLACE DE l'état? Avez-vous vérifié votre champ de Clé Primaire pour s'assurer qu'il a une Identité cahier des charges?
  • Peut-on voir le SQL?
  • Oui et oui, c'est en effet (vous pouvez voir le code maintenant - il ne l'insertion d'une ligne et c'est une automatique d'identité lorsqu'elle est insérée).
  • Pourquoi ne pas utiliser un AVANT déclencheur d'INSERTION qui produit une erreur si les règles ne sont pas satisfaits, plutôt que au LIEU DE?
  • parce que pour ce que j'ai pu voir de SQL Server n'a pas une telle chose - même si je dois admettre que je n'ai pas directement en essayer un, mais que, hors d'une recherche sur Google, il peut être bien sûr que j'ai trouvé non valide ou périmée ressources - est-il en fait une telle chose?
  • Nous avons utilisé ces déclencheurs dans SQL Server 2000 qui semble être le mode par défaut, déclarant simplement le déclencheur "create trigger TG_xxx sur dbo.tablename pour insérer, mettre à jour aussi ....". Nous avons logique pour des conditions de test et d'appeler "raiserror()" puis faites "rollback transaction" si la validation échoue. Après avoir dit cela, nous utilisons un SP pour générer des Id plutôt que l'identité --- cela pourrait être la raison pour laquelle, le gars qui a insisté pour nous faire de cette façon est un peu vague comme pour le raisonnement. Mais alors qu'il avait pris l'habitude avant de scope_identity() a été mis en œuvre.
  • Veuillez considérer Aaron Alton suggestion pour l'utilisation de la sortie pour obtenir le indetity valeurs.
  • araqnid, votre méthode est beaucoup plus dangereux pour l'intégrité des données que d'utiliser des champs identité. Vous pouvez créer de réels problèmes avec insertions simultanées si vous n'êtes pas très prudent.
  • Oui, l'ID de génération SP fait un peu de travail en plus exclusivement de verrouillage de la table contenant le numéro suivant. Qui elle-même provoque des problèmes de contention. Je ne suis pas fan d'elle, soit (et je n'ai pas l'écrire et ne le recommande pas).

InformationsquelleAutor kastermester | 2009-05-25