2009-07-17 5 views
0

Ich habe 3 Tabellen.Wie reflukturiere ich wiederholende SQL-Aktualisierungsabfragen?

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

2. UsersGroups 2 Cols 
UserID - GroupID 

3. Groups 3 Cols 
GroupID - Group - Flags 

und ich möchte für User = 'Administrator' und wenden diese an die Group Tabelle sind die Flaggen auf der User Tisch setzen.

Ich habe die folgende SQL, die funktioniert, aber ich habe auch mehrere Flags, die ich mit bitweisen Operatoren anwenden muss.

Ich habe festgestellt, dass mein Code wirklich repetitiv ist, also habe ich mich gefragt, ob jemand etwas Refactoring vorschlagen könnte, das die Leistung nicht beeinträchtigen würde.

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' 

Antwort

1

Sie können eine gespeicherte Prozedur erstellen, die das Flag-Bit-Wert und den Benutzer/Gruppennamen als Argumente und sie als Parameter für Ihre Anfragen nimmt - dann die gespeicherte Prozedur aufrufen, wenn Sie brauchen

So etwas wie (ungetestet)

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 

(Dies ist eine unterschiedlich sein grundsätzliches Beispiel ein Flag zu ändern - es wäre eine gute Idee, einige Validierung hinzuzufügen und Fehlerprüfung)

Sie würden es dann rufen Sie wie folgt:.

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

Wenn Ihr Ziel UPDATE Klauseln für groups Tabelle zu entfernen ist, dann erstellen Sie einfach eine UPDATETrigger auf users Tabelle, die Gruppen-Updates Tabelle.

Verwandte Themen