2010-04-20 9 views
1

Je suis en cours d'exécution SQL qui identifie les enregistrements qui doivent être marqués pour la suppression et pour insérer une valeur dans ces enregistrements. Cette valeur doit être modifiée pour rendre l'enregistrement inutile et chaque enregistrement doit être modifié en une valeur unique en raison d'une contrainte de base de données.TSQL pour insérer une valeur croissante

UPDATE Users 
SET Username = 'Deleted' + (ISNULL(
     Cast(SELECT RIGHT(MAX(Username),1) 
       FROM Users WHERE Username LIKE 'Deleted%') AS INT) 
        ,0) + 1 
FROM Users a LEFT OUTER JOIN #ADUSERS b ON 
a.Username = 'AVSOMPOL\' + b.sAMAccountName 
WHERE (b.sAMAccountName is NULL 
AND a.Username LIKE 'AVSOMPOL%') OR b.userAccountControl = 514 

Ceci est le bit important:

SET Username = 'Deleted' + (ISNULL(
     Cast(SELECT RIGHT(MAX(Username),1) 
       FROM Users WHERE Username LIKE 'Deleted%') AS INT) 
        ,0) + 1 

Ce que j'ai essayé de faire est d'avoir supprimé les enregistrements ont leur champ Nom d'utilisateur défini sur « Deletedxxx ». Le ISNULL est nécessaire car il peut y avoir aucun enregistrement correspondant à l'instruction SELECT RIGHT(MAX(Username),1) FROM Users WHERE Username LIKE 'Deleted%' et cela retournera NULL.

-je obtenir une erreur de syntaxe lorsque vous essayez d'analyser ce (Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword 'SELECT'. Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.

Je suis sûr qu'il doit y avoir une meilleure façon d'aller à ce sujet, des idées?

+0

Pouvez-vous ajouter un champ de bits à cette table (par exemple IsDeleted) et l'utiliser pour le marquer à la place? Va faire pour des requêtes plus rapides pour obtenir tous les utilisateurs non supprimés. – Paddy

+0

Non - Je ne peux pas modifier le comportement de l'application, cela ne servira donc pas à désactiver un utilisateur. Le champ de nom d'utilisateur contient en réalité l'identifiant de connexion réseau de l'utilisateur et l'application l'utilise pour connecter les utilisateurs avec les informations d'identification Windows, ce qui est la seule façon de désactiver un compte. –

Répondre

1

Si votre table d'utilisateurs a déjà un nombre entier Colonne PK, vous pouvez simplement utiliser cette colonne pour générer des noms d'utilisateur PK + supprimés

Btw, le SELECT RIGHT (MAX (Nom d'utilisateur), 1) ne doit pas échouer après 10 utilisateurs? Mieux vaut utiliser SUBSTRING().

+0

Excellent - c'est une bien meilleure idée que ma solution. Et oui, j'ai négligé l'échec après 10 utilisateurs. –

0

Je soupçonne que cela fonctionnerait mieux comme multi-st Énoncé SQL, mais je ne sais pas si c'est raisonnable. L'erreur que vous voyez est parce que vous essayez de concaténer un int à une chaîne, vous ajoutez également 1. Votre ordre des opérations est tout vilain dans cette déclaration d'ensemble. Cela fait ce que vous demandez, mais il échouera la minute où vous obtenez plus de 9 entrées supprimées.

SELECT 'DELETED' + CAST(
ISNULL(
CAST(
SELECT RIGHT(MAX(Username),1) 
FROM #Users WHERE username LIKE 'DELETED%') 
AS INT) 
, 0) + 1) 
AS VARCHAR(3)) 

éditer: Désolé pour l'horrible formatage. Impossible de comprendre comment le rendre lisible.

1

Est-il strictement nécessaire d'utiliser des valeurs 'xxx' incrémentielles? Ne pourriez-vous pas utiliser des valeurs aléatoires?

SET Username = Username + '_deleted_' + CAST(NEWID() AS char(36))

De plus, il pourrait être une mauvaise idée de remplacer la connexion complètement. Étant donné que vous désactivez l'enregistrement, ne le supprimez pas entièrement, je suppose que vous en avez besoin à des fins d'audit ou de smth. comme ça. Dans ce cas, les enregistrements avec des ID tels que 'Deleted1234' peuvent être trop anonymes.

+0

Bonne suggestion, je vais utiliser le PK mais je ne connaissais pas NEWID() alors merci. Les enregistrements sont simplement laissés parce qu'il y a trop d'index qui les relient mais il reste d'autres attributs avec l'enregistrement qui peuvent identifier l'utilisateur de manière unique. –

Questions connexes