DBCC CHECKIDENT sur une table temporaire en jetant des autorisations d'erreur pour l'utilisateur incorrect
Je suis connecté à un Serveur SQL server 2005 base de données comme un non-utilisateur sa 'bhk', qui est un membre du "public" rôle de serveur. Le code suivant tente d'exécuter une procédure stockée appelée par l'utilisateur "bhk'. Cette ligne de code...
TRUNCATE TABLE #Table1
DBCC CHECKIDENT('#Table1', RESEED, @SequenceNumber) WITH NO_INFOMSGS
la cause de cette erreur...
L'utilisateur "invité" n'a pas l'autorisation
pour exécuter DBCC CHECKIDENT pour objet
'#Table1__00000000007F'.
Je suis conscient des autorisations requises pour l'exécution de DBCC CHECKIDENT...
De l'appelant doit être propriétaire de la table, ou être membre du rôle de serveur fixe sysadmin, la base de données fixe db_owner, ou les données db_ddladmin.
J'ai donc deux questions:
- Depuis bhk' est d'appeler un stockées
procédure qui crée un temporaire
table, ne devrait-on pas "bhk' être le propriétaire
et être autorisé à exécuter DBCC
CHECKIDENT? - Pourquoi le message d'erreur
message de retour que l'utilisateur "invité"
n'a pas l'autorisation? À ma connaissance, je ne suis pas
connecté en tant que "invité".
Toute aide serait grandement appréciée.
OriginalL'auteur Brad Knowles | 2008-10-09
Vous devez vous connecter pour publier un commentaire.
Voici une autre solution, qui peut fonctionner que si vous avez besoin de re-seed avec un numéro de séquence de plus de 1.
Ce que cela est en train de faire est de définir le IDENTITY_INSERT sur votre table temporaire, pour vous permettre d'ajouter une ligne avec un explicite ID. Vous pouvez alors supprimer cette ligne, mais de nouveaux inserts doivent commencer à partir du dernier numéro de séquence.
OriginalL'auteur Tim C
Vous avez écrit:
Donc (si ce n'est pas un bug), selon Le Lieutenant Columbo est logique impeccable, chacune des prémisses doit être fausse. Cela signifie que, l'appelant n'a pas propriétaire de la table, même si il l'a créé.
En fait, il semble que tous les objets créés dans tempd sont la propriété de dbo par défaut. Vous pouvez examiner, si vous ne l'suivante dans l'Analyseur de Requêtes:
CREATE TABLE #NotMyTable (TestID int identity)
SELECT user_name(uid) FROM sysobjects WHERE name LIKE '#NotMyTable%'
Vous verrez que la dbo est le propriétaire de la table temporaire.
Donc, ce que pourrait être une solution?
(Avant-propos: je n'aime pas ce genre de manipulation, mais la stimulation intellectuelle est le moteur de moi... 😉 )
Donc, vous pourriez écrire une autre procédure stockée qui met à jour l'UID dans sysobjects de la base de données tempdb à la valeur de votre utilisateur (frisson!). Je l'ai testé uniquement dans l'Analyseur de Requêtes. Après la mise à Jour je pourrais exécuter votre commande DBCC CHECKIDENT.
OriginalL'auteur splattne
Vous pouvez accomplir cela en pleinement la qualification de la base de données tempdb table.
OriginalL'auteur Bob
Une solution alternative pour faire le TRONQUER et CHECKIDENT commandes serait tout simplement de supprimer et recréer votre table temporaire. E. g.
Cela peut ne pas être la solution la plus efficace.
OriginalL'auteur Tim C
Je viens de tomber sur cette. La réponse fut de donner à son compte les autorisations dans la base de données tempdb où, apparemment, ces tables ont été créées.
OriginalL'auteur John Christensen