2017-03-21 1 views
1

Supposons que j'ai une table avec une colonne timestamp qui a utilisé via NHibernate pour gérer la version d'enregistrement, Maintenant, je cherche un moyen de mettre à jour un enregistrement de mes données sans augmentez la valeur de la colonne ts, car, comme vous le savez, cette valeur augmente après chaque instruction de mise à jour pour suivre la version des données afin d'éviter les problèmes de simultanéité.Comment mettre à jour un enregistrement dans SQL contournant contrôle de version NHibernate

CREATE TABLE [dbo].[TSTest]( 
    [ID] [int] NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [ts] [timestamp] NOT NULL, 
    CONSTRAINT [PK_TSTest] PRIMARY KEY CLUSTERED ([ID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Une idée?

+0

non, vous ne pouvez pas. –

+0

Je pense que ce serait possible, Rien n'est impossible dans le logiciel! –

+0

Merci pour modifier @Serg –

Répondre

1

S'il existe certaines colonnes qui ne doivent pas être soumises au suivi timestamp, vous pouvez déplacer ces colonnes dans une nouvelle table qui renvoie ensuite à cette table d'origine. Si vous le souhaitez, vous pouvez masquer l'existence de cette nouvelle table et de la table originale modifiée à partir de l'application en produisant une vue appelée TSTest qui joint les tables (avec des déclencheurs qui appliquent des insertions, des mises à jour et des suppressions aux tables de base).

Cependant, dans ce cas, il est clair pas ce que nous devrions faire car il n'y a qu'une seule évidente colonne « actualisable » - Name - et donc si nous ne voulons pas l'objet d'un suivi timestamp, on ne sait pas pourquoi nous avons sur ce table du tout.

Malheureusement, il n'existe aucun autre mécanisme T-SQL pour éviter le comportement de timestamp - et cela est généralement considéré comme une bonne chose. Vous ne pouvez rien faire via des déclencheurs, car si vous touchez la table de base, le timestamp sera modifié et vous ne pourrez pas utiliser les colonnes d'horodatage UPDATE. Vous ne pourrez donc pas le réinitialiser après un changement.

Je pense qu'il serait possible, rien est impossible dans le logiciel

En laissant de côté l'existence des choses comme le problème de l'arrêt, vous êtes bien sûr exact que ce problème peut être résolu - mais pas d'une manière qui pourrait vous être utile. Comme je l'ai dit plus haut, ce n'est pas possible avec T-SQL.

Si vous vraiment besoin de faire cela, vous pouvez le faire en manipulant directement le fichier de base de données. Bien sûr, cela vous oblige à détacher la base de données ou à descendre le serveur, puis à parcourir les structures de fichiers pour localiser manuellement la ou les pages contenant les lignes que vous souhaitez modifier, puis à appliquer ces modifications, puis à corriger d'autres parties de la structure (telles que les sommes de contrôle de page) afin que SQL Server ne croit pas que les pages sont maintenant corrompues. Je ne préconise pas vraiment cette approche, en soulignant simplement à quel point loin de la normalité vous deviez accomplir réellement ce que vous demandez.

+0

J'ai aimé votre répondre à cause de votre large opinion pour résoudre cette question, Juste pour votre information ce schéma de table est juste pour tester ma table d'origine est un autre, En passant, je suis intéressé par votre deuxième solution qui me recommande d'utiliser View, je pense serait travail pour ma situation, merci mon ami :) –

0

Une idée?

Par votre commentaire et schéma votre ts colonne [ts] [timestamp] NOT NULL. Donc, il serait modifié à chaque opération de mise à jour.

Une façon d'utiliser un déclencheur AFTER UPDATE et d'annuler la modification s'est produite. Mais pourquoi ferais-tu cela? De plus, le déclenchement sur la même table (ou) le trigger récursif n'est pas supporté par MySQL.

+0

CREATE TABLE [dbo]. [TSTest] ( \t [ID] [int] NOT NULL, \t [Nom] [nvarchar] (50) NULL, \t [ts] [timestamp] NOT NULL, CONTRAINTE [PK_TSTest] PRIMARY KEY CLUSTERED ( \t [ID] ASC ) AVEC (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRINCIPAL] ) ON [PRIMARY] –

+0

Non, c'est une colonne 'timestamp' (alias' rowversion'), * pas * une date-heure. Ainsi, la mention 'current_timestamp' et les déclencheurs sont un faux-fuyant. –

+0

@MohammadNikravesh - quand les gens demandent un schéma (généralement comme un commentaire, plutôt que dans une réponse), il est généralement préférable de * modifier * votre question afin que vous puissiez marquer le bloc comme du code ('{}') pour qu'il soit * lisible *, contrairement aux commentaires. (Bien sûr, idéalement, nous n'aurions pas à demander le schéma et ce serait dans votre question dès le début) –