7
votes

DBCC Checkident Reseat - est une nouvelle valeur requise?

Toute la documentation que j'ai lue sur Resefining suggère quelque chose dans le sens de:

  1. SET @MAxidentityValue = (Sélectionnez max (ID) à partir de Tablename) Code> Li>
  2. Exécuter DBCC Checkident ("Nom", Reseed, @maxidentityValue) Code> Li> ol>

    et mais em> il me semble qu'un simple DBCC checkent ("Tableur", Reseed) code> est tout ce qui est nécessaire, et il déterminera automatiquement le Corrigez la valeur d'identité de la table sans fournir une valeur max. p>

    existe une raison (performance ou autre) qui extraite la valeur à l'aide de max code> est préférable? P> Question de Piggyback: La raison pour laquelle je dois réexécutez est parce que j'utilise la réplication et les identités continuent à être définie sur NULL chaque fois que la réplication de la base de données s'exécute. Qu'est-ce que je fais mal? Comment maintenir la bonne graine d'identité pour chaque table? P>

    Mise à jour (solution actuelle) h2>

    Pour l'instant, je n'utilise pas la valeur maximale. Ceci est la procédure stockée que j'utilise (je le générais à l'aide d'une requête sur sys.columns code> puis coupez-vous et colle chaque dans une nouvelle fenêtre de requête. Messier, plus lent, moins élégant, mais je ' m Pas très familier avec les procédures stockées et ne veuillez pas utiliser les requêtes SQL dynamiques): P>

    declare @seedval integer
    declare @maxval integer
    declare @newval integer
    set @seedval = (select ident_current('mytable'));
    set @maxval = (select MAX(id) from mytable);
    if @maxval > @seedval or @seedval is NULL
    BEGIN
        print 'Need to reseed: max is '  + cast(@maxval as varchar) + ' and seed is ' + cast(@seedval as varchar) 
        dbcc checkident('mytable', RESEED);
        set @newval = (select ident_current('mytable'));
        print 'Max is ' + cast(@maxval as varchar) + ' and seed is ' + cast(@newval as varchar) 
    END 
    ELSE
        print 'No need to reseed'; 
    


4 commentaires

Avez-vous testé que cela fonctionne? Je l'ai fait récemment et j'ai été obligé d'utiliser le travail.


Ouais, pour une raison quelconque, cela a fonctionné pour moi. Correctement identifié 31 comme valeur maximale et définissez l'identité à cela.


Ah, la réponse acceptée contient la raison pour laquelle il n'a pas fonctionné pour moi. Je voulais Diminuer la valeur actuelle. Pas possible pour une raison quelconque.


DBCC Contempter ("Carte.Alias ​​', Regeeed, 0)
DBCC Checkident (" Carte.Alias')


3 Réponses :


2
votes

Il y a des cas où vous voudrez peut-être déterminer le maximum afin que vous puissiez réaction et laisser un espace (par exemple max + 100). Un cas pourrait être lorsque vous avez plusieurs copies d'une table et que vous allez distribuer une identité indépendante mais mutuellement exclusive d'eux.

Mais toujours, je ne suis pas convaincu que la résealité sans paramètre fonctionnera correctement dans tous les scénarios.

Est-ce un événement commun que vous retirez des tables de retour au maximum? Pourquoi? Application mal codée qui génère une bande de lignes dans une boucle que vous finissez par rouler?

Dans tous les cas, vous voudrez envelopper le max et réside dans une transaction pour empêcher les chances qu'un utilisateur insère une nouvelle ligne après avoir pris le maximum mais avant d'avoir publié la résetude.


3 commentaires

Comme indiqué dans la question, pour une raison quelconque lorsque la base de données se reproduit, les identités sont toutes définies à NULL. J'aimerais que je puisse résoudre ce problème, mais comme je ne suis pas directement responsable de la réplication elle-même (un autre administrateur DB est impliqué dans cela), j'ai besoin d'une solution de contournement jusqu'à ce que l'autre gars puisse comprendre pourquoi la réplication est en train de gâcher notre identités.


J'ai raté cette ligne dans la question - avez-vous ajouté qu'après avoir posté à l'origine? Quoi qu'il en soit, si c'est le problème que vous essayez réellement de résoudre puis je vous suggère de poster cela comme la question à la place de cette performance de YAY ou de la vérification du max - peut-être que vous n'avez pas besoin d'utiliser Reseed en premier lieu (cependant je ne peux pas commenter Comme mon expérience avec la réplication est essentiellement isolée pour savoir comment l'épeler).


Ce serait bien de résoudre le problème sous-jacent mais pour aujourd'hui, j'ai juste besoin de résoudre le symptôme. Je vais faire boucle à travers toutes mes tables qui courent Reseed et je voulais juste m'assurer qu'il n'y a pas de problème fondamental avec cela.



9
votes

tel qu'il est indiqué dans MSDN , il est assez assez utilisé: xxx

la plupart du temps, mais il y a ces deux conditions où elle ne fonctionnera pas:

  • La valeur d'identité actuelle est supérieure à la valeur maximale du tableau.
  • Toutes les lignes sont supprimées de la table.

    dans lequel vous devez aller avec leur façon de mentionner (sélectionnez Max (ID) et le reste), alors pourquoi déranger en premier lieu? :)


0 commentaires

2
votes

(je republie ma réponse de cette autre page)

Peut-être le moyen le plus simple (aussi fou que ce que cela sonne et comme le code sodomy tel qu'il a l'air) est de simplement exécuter dbcc up utile code> deux fois comme celui-ci: p>

-- run it again to display what the seeds are now set to
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'


0 commentaires