2009-10-05 8 views
2

Dans le cas suivant:création d'une table si elle n'existe pas

if object_id('MyTable') is null create table MyTable(myColumn int) 

est-il pas possible que deux appelants distincts pourraient aussi bien évaluer object_id (« MyTable ») comme nul et donc à la fois essayer de créer la table . Évidemment, l'un des deux appelants dans ce scénario échouerait, mais idéalement, aucun appelant ne devrait échouer, plutôt que l'un devrait bloquer et l'autre devrait créer la table, alors l'appelant bloqué verra object_id ('MyTable') comme non nul et continuez. Sur quoi puis-je appliquer un verrouillage exclusif, de sorte que je ne verrouille pas plus que ce qui est absolument nécessaire?

Répondre

2

Après votre vérification initiale, utilisez une prise d'essai lors de la création de la table, et si l'erreur est que la table existe déjà, passez, sinon, vous avez un problème plus grave

0

Je ne pense pas, vous devriez vous inquiéter à ce sujet.

Les instructions DDL ne s'exécutent pas dans une transaction. En outre, le deuxième appelant échouera, si la table a déjà été créée par un appel du 1er appelant.

+0

en quelque sorte ne vous inquiétez pas être heureux que le 2ème appelant échouera est peu de confort. Je préférerais le 2ème appelant à procéder sans erreur –

+1

@Ralph: Makes sens. À quelle fréquence cette procédure est-elle exécutée? Pourquoi voudriez-vous créer une table dans la procédure? Est-ce un tableau, vous allez laisser tomber à la fin de la procédure? Si non, pourquoi ne pas créer une vraie table à l'avance? S'il vous plaît expliquer votre scénario pour savoir pourquoi vous faites une telle chose? – shahkalpesh

0

Je ne permets pas que les utilisateurs créer des tables. En général, c'est une mauvaise pratique. S'ils ont besoin d'insérer des données, la table est déjà là. Si vous craignez que deux personnes créent la même table, êtes-vous également inquiet de savoir si leurs données se croisent? Je ne sais pas ce que fait votre proc, mais si cela supprime quelque chose comme supprimer les enregistrements si la table existe et ensuite insérer, alors vous pourriez avoir des problèmes étranges si deux utilisateurs étaient en même temps. En général, cependant, si vous avez besoin de créer une table au moment de l'exécution, c'est généralement un signe que votre design a besoin d'être travaillé.

+1

-1 la réponse est sur les mérites de la conception supposée. Cependant, la question est une question de détails de mise en œuvre. –

+0

Lorsque nous constatons une mauvaise conception, il est de notre responsabilité de signaler que le problème peut être lié à la conception et non à la mise en œuvre pour laquelle vous posez une question. – HLGEM

+0

@HLGEM Dans ce cas, l'exigence système est que le service multithread qui utilise cette base de données puisse être configuré ou non pour enregistrer des informations d'erreur dans une table d'audit. Si configuré pour enregistrer cette information d'audit, il est supposé créer la table. S'il n'est pas configuré, la table d'audit des erreurs ne doit pas exister car une table d'audit existante mais vide peut indiquer que le système fonctionne normalement et qu'aucune erreur n'est consignée. En un mot, c'est l'exigence de conception. –

1

Habituellement CREATE TABLE est exécuté à partir de scripts d'installation et de configuration et est raisonnable d'attendre des scripts d'installation pour permettre l'installation simultanée de connexions séparées.

Je vous recommande d'utiliser un verrou d'application scopped de session acquis au début de votre procédure d'installation/mise à niveau, voir sp_getapplock.

Questions connexes