2009-07-17 11 views
0

J'ai 3 tables.Comment refactoriser des requêtes de mise à jour SQL répétitives?

1. Users 4 Cols 
UserID - User - RealName - Flags 

2. UsersGroups 2 Cols 
UserID - GroupID 

3. Groups 3 Cols 
GroupID - Group - Flags 

et je veux mettre les drapeaux sur la table User pour User = 'Administrator' et appliquer la même à la table Group.

J'ai le SQL suivant qui fonctionne, mais j'ai aussi plusieurs drapeaux que je dois appliquer en utilisant des opérateurs au niveau du bit. J'ai trouvé que mon code était vraiment répétitif, alors je me demandais si quelqu'un pouvait suggérer un refactoring qui n'affecterait pas la performance.

code:

--- SET FLAG 1  
UPDATE User 
SET User.Flags = User.Flags | 2048 
WHERE User.Value = 'Administrator' 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = 'Administrator') | 2048 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = 'Administrator' 

-- SET FLAG 2  
UPDATE User 
SET User.Flags = User.Flags | 512 
WHERE User.Value = 'Administrator' 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = 'Administrator') | 512 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = 'Administrator' 

Répondre

1

Vous pouvez créer une procédure stockée qui prend la valeur du bit de drapeau et le nom d'utilisateur/groupe comme arguments et de les utiliser en tant que paramètres pour vos requêtes - puis appelez la procédure stockée lorsque vous avez besoin changer un drapeau

Quelque chose comme (non testé)

create proc usp_set_flags 
    @flag int 
    ,@username varchar(50) 
AS 
UPDATE User 
SET User.Flags = User.Flags | @flag 
WHERE User.Value = @username 

UPDATE dbo.Group 
SET dbo.Group.Flags = 
    (Select e.Flags FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
    INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
    WHERE p.Value = @username) | @flag 

FROM dbo.User p INNER JOIN dbo.UserInGroup pe ON p.UserID = pe.UserID 
INNER JOIN dbo.Group e ON e.GroupID = pe.GroupID 
WHERE p.Value = @username 
GO 

(Ceci est un exemple de base varie - ce serait une bonne idée d'ajouter une validation et vérification d'erreur)

Vous auriez alors appelez-le comme suit:.

exec usp_set_flags @flag = 2048, @username = 'Administrator' 
0

Si votre objectif est de supprimer UPDATE clauses pour groups table, puis créez simplement un UPDATEdéclencheur sur la table users que les groupes à jour table.

Questions connexes