Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Именованные константы / 11 сообщений из 11, страница 1 из 1
24.06.2009, 09:31
    #36056769
=MOHAX=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
Хотелось бы понять, существует ли в БД понятие enum?
Например у меня есть таблица ролей:
IdRoleName1Админ2Гость3Менеджер

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE FUNCTION IsManager(@UserId int)
RETURNS int AS
BEGIN
  DECLARE @Role INT
  SELECT @Role = Person.RoleId FROM Person WHERE Person.Id = @UserId
  IF @Role =  3 
    RETURN  1 
  RETRUN  0 
END

Что мне очень не нравится в этом примере, так это сравнение @Role = 3. В языках высокого уровня можно было бы создать перечисление, например:
Код: plaintext
1.
2.
3.
4.
5.
enum
{
  roleAdmin,
  roleGuest,
  roleManager
};
И тогда сравнение выглядело бы очень прозрачно: IF @Role = roleManager.
Можно ли реализовать такое на уровне БД, чтобы избегать сравнения с magic numbers?
...
Рейтинг: 0 / 0
24.06.2009, 10:09
    #36056822
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
=MOHAX=Можно ли реализовать такое на уровне БД, чтобы избегать сравнения с magic numbers?
А какая принципиальная разница в Вашем случае, править в случае чего Magic Numbers внутри enum или внутри function, если оно будет только в одном месте?
...
Рейтинг: 0 / 0
24.06.2009, 10:16
    #36056834
Егоров Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
=MOHAX=,

В общем случае - нет, не существует. БД занимается хранением данных, а перечисление - это "представление" значений теми же "magic number", но скрытое внутри компилятора\интерпретатора ЯВУ. Представлением данных занимается клиент.
...
Рейтинг: 0 / 0
24.06.2009, 10:26
    #36056854
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
Если хочется сильно, то создайте парсер, который перед отправой на сервер текста процедуры (да и вообще запроса) будет преобразовывать в понятный серверу код
С уважением, Naf
...
Рейтинг: 0 / 0
24.06.2009, 10:27
    #36056862
=MOHAX=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
Сергей ВаскецовА какая принципиальная разница в Вашем случае, править в случае чего Magic Numbers внутри enum или внутри function, если оно будет только в одном месте?
В данном примере разницы почти никакой.
Просто мне оставили в наследство кучу хранимых процедур, в которых везде встречаются записи вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
if @aStageId in ( 181 )
SET @Mode= 1 
else
if @aStageId in ( 182 )
SET @Mode= 2 
else
SET @Mode= 3 

Такой код очень сложно прочитать. Переделывать его я не буду, но хотелось бы разобраться как грамотные люди делают.
В принципе можно сделать кучу функций:
Код: plaintext
1.
2.
3.
4.
CREATE FUNCTION roleManager()
RETURNS int AS
BEGIN
  RETURN  3 
END

И потом сравнивать вот так:
Код: plaintext
IF @Role = dbo.roleManager()
Но тоже как то коряво получается... :(
...
Рейтинг: 0 / 0
24.06.2009, 10:27
    #36056864
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
Вместо IF @Role = 3 достаточно написать if exists(select 1 from roles where Id=@Role and RoleName='Менеджер'). Ну или еще добавить поле RoleCode ит туда забубенить roleAdmin, roleGuest и roleManager соответственно, и проверять это поле.
...
Рейтинг: 0 / 0
24.06.2009, 10:41
    #36056900
=MOHAX=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
NafЕсли хочется сильно, то создайте парсер, который перед отправой на сервер текста процедуры (да и вообще запроса) будет преобразовывать в понятный серверу код
Я имел ввиду только код функций и хранимых процедур в БД. Просто хотелось бы сделать его более понятным и прозрачным.
...
Рейтинг: 0 / 0
24.06.2009, 10:43
    #36056903
=MOHAX=
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
Сергей ВаскецовВместо IF @Role = 3 достаточно написать if exists(select 1 from roles where Id=@Role and RoleName='Менеджер'). Ну или еще добавить поле RoleCode ит туда забубенить roleAdmin, roleGuest и roleManager соответственно, и проверять это поле.

Это просто пример, для наглядности :)
...
Рейтинг: 0 / 0
24.06.2009, 11:29
    #36057011
RENaissance
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
=MOHAX=
В данном примере разницы почти никакой.
Просто мне оставили в наследство кучу хранимых процедур, в которых везде
встречаются записи вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  if  @aStageIdin  ( 181 )
  SET  @Mode= 1 
  else
  if  @aStageIdin  ( 182 )
  SET  @Mode= 2 
  else
  SET  @Mode= 3 

IMHO, в данном случае комментарии рулят.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
24.06.2009, 11:36
    #36057031
Егоров Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
=MOHAX=
В данном примере разницы почти никакой.
Просто мне оставили в наследство кучу хранимых процедур, в которых везде встречаются записи вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
if @aStageId in ( 181 )
SET @Mode= 1 
else
if @aStageId in ( 182 )
SET @Mode= 2 
else
SET @Mode= 3 

Такой код очень сложно прочитать.

Дело в том, что в БД такие вещи делаются не кодом, а таблицами, их отношениями, вычисляемыми полями и прочим. По этому примеру не виден источник данных для переменной @aStageId, на вскидку подошла бы таблица соответствий значений aStageID и Mode и join к ней, возврашаюший сразу нужное значение в @Mode. В случае с ролями - если их не много, можно добавить колонки непосредственно к таблице Person (IsAdmin bit, IsGuest bit, IsManager bit) и т.д.
...
Рейтинг: 0 / 0
24.06.2009, 12:34
    #36057239
Flying Dutchman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованные константы
=MOHAX=Хотелось бы понять, существует ли в БД понятие enum?
Например у меня есть таблица ролей:
IdRoleName1Админ2Гость3Менеджер

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



Для таких справочников я использую Id текстового типа (например, varchar в SQL Server):

IdRoleNameADMINАдминGUESTГостьMANAGERМенеджер

Соответственно, запросы становятся более читабельными.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Именованные константы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]