Как я могу рефакторинг повторяющихся запросов на обновление SQL? - PullRequest
0 голосов
/ 17 июля 2009

у меня 3 таблицы.

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

2. UsersGroups 2 Cols
UserID - GroupID

3. Groups 3 Cols
GroupID - Group - Flags

и я хочу установить флаги в таблице User для User = 'Administrator' и применить то же самое к таблице Group.

У меня работает следующий SQL, но у меня также есть несколько флагов, которые я должен применить, используя побитовые операторы.

Я обнаружил, что мой код действительно повторяется, поэтому мне было интересно, может ли кто-нибудь предложить какой-либо рефакторинг, который не повлияет на производительность.

Код:

--- 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'

Ответы [ 2 ]

1 голос
/ 17 июля 2009

Вы можете создать хранимую процедуру, которая принимает значение бита флага и имя пользователя / группы в качестве аргументов, и использовать их в качестве параметров для ваших запросов - затем вызывать хранимую процедуру, когда вам нужно изменить флаг

Что-то вроде (не проверено)

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

(Это простой базовый пример - было бы неплохо добавить проверку и проверку ошибок.)

Тогда вы бы назвали это так:

exec usp_set_flags @flag = 2048, @username = 'Administrator'
0 голосов
/ 17 июля 2009

Если ваша цель - удалить пункты UPDATE для таблицы groups, просто создайте UPDATE триггер для users таблицы, которая обновляет таблицу групп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...