2009-07-17 4 views
0

У меня есть 3 стола.Как рефакторировать повторяющиеся запросы на обновление SQL?

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' 

ответ

1

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

что-то вроде (непроверенные)

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

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

Смежные вопросы