Опубликован: 07.05.2010 | Уровень: специалист | Доступ: свободно
Лекция 27:

Программное администрирование баз данных InterBase

< Лекция 26 || Лекция 27: 12345 || Лекция 28 >

Добавление нового пользователя

Реализуем добавление нового пользователя. Сгенерируйте обработчик нажатия на кнопку "Добавить". Код обработчика следующий:

{Нажали "Добавить"}
procedure TfMain.bAddUserClick(Sender: TObject);
begin
  //вначале очистим данные, которые могут быть
  //в редакторе пользователей:
  fEditor.eUser.Text:= '';
  fEditor.ePass.Text:= '';
  fEditor.ePass2.Text:= '';
  fEditor.eName.Text:= '';
  fEditor.eMiddle.Text:= '';
  fEditor.eLast.Text:= '';
  //теперь показываем форму:
  fEditor.ShowModal;
  //если изменений делать не нужно, просто выходим:
  if not Editor.izmen then Exit;
  //иначе готовим компонент IBSS к созданию нового пользователя.
  IBSS.Active:= True;
  try
    //теперь вводим данные нового пользователя:
    IBSS.UserName:= fEditor.eUser.Text;
    IBSS.Password:= fEditor.ePass.Text;
    IBSS.FirstName:= fEditor.eName.Text;
    IBSS.MiddleName:= fEditor.eMiddle.Text;
    IBSS.LastName:= fEditor.eLast.Text;
    //вызываем метод AddUser, который добавляет пользователя:
    IBSS.AddUser;
  finally
    IBSS.Active:= False; //закрываем компонент
  end; //try
  //перечитываем информацию о пользователях:
  ReloadUsers;
end;

Поскольку пользователь у нас новый, данных на него пока никаких нет. Значит, вначале мы очистим все Edit на форме редактора, и только потом покажем ее.

Когда администратор закончит работу с формой, и закроет ее, начинает работу следующая строка процедуры:

//если изменений делать не нужно, просто выходим:
  if not Editor.izmen then Exit;

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

IBSS.Active:= True;
  try
    //теперь вводим данные нового пользователя:
    IBSS.UserName:= fEditor.eUser.Text;
    IBSS.Password:= fEditor.ePass.Text;
    IBSS.FirstName:= fEditor.eName.Text;
    IBSS.MiddleName:= fEditor.eMiddle.Text;
    IBSS.LastName:= fEditor.eLast.Text;
    //вызываем метод AddUser, который добавляет пользователя:
    IBSS.AddUser;
…

Как видите, при сохранении данных мы используем свойства компонента IBSecurityService UserName (логин), Password (пароль), FirstName (имя), MiddleName (отчество) и LastName (фамилия). Есть еще два свойства, которые мы не использовали, и которые устанавливаются по умолчанию в ноль: UserID (идентификатор пользователя) и GroupID (идентификатор группы), обычно программисты не задействуют эти параметры. Физически новый пользователь добавляется методом AddUser. В заключение процедуры мы отключаем IBSecurityService и вызываем процедуру ReloadUsers для обновления данных.

Сохраните проект, скомпилируйте его и попробуйте добавить нового пользователя. Пользователь должен появиться в окне ListBox, кроме того, он должен быть виден и в утилите IBConsole, в разделе Users дерева серверов.

Редактирование пользователя

Редактирование выбранного пользователя вызывается кнопкой "Редактировать". Сгенерируйте этот обработчик. Вот его код:

{Нажали "Редактировать"}
procedure TfMain.bModifyUserClick(Sender: TObject);
var i: Integer; //счетчик
begin
  //если не один пользователь не выбран, просто выходим:
  if LB1.ItemIndex = -1 then begin
    ShowMessage('Выберите пользователя!');
    Exit;
  end
  //если выбран SYSDBA, тоже выходим:
  else if LB1.Items[LB1.ItemIndex] = 'SYSDBA' then begin
    ShowMessage('Редактировать пользователя SYSDBA нельзя.');
    Exit;
  end; //else if
  //иначе редактируем
  //установим у IBSecurityService выбранного пользователя:
  IBSS.Active:= True;
  IBSS.UserName:= LB1.Items[LB1.ItemIndex];
  //найдем в IBSS индекс нужного пользователя:
  for i:= 0 to IBSS.UserInfoCount - 1 do
    if IBSS.UserInfo[i].UserName =
       LB1.Items[LB1.ItemIndex] then break;
  //теперь i содержит индекс пользователя
  //заполняем редактор пользователей данными:
  fEditor.eUser.Text:= IBSS.UserInfo[i].UserName;;
  //раз пользователь уже есть, выводим единички в качестве пароля:
  fEditor.ePass.Text:= '11111111111111111111';
  fEditor.ePass2.Text:= '11111111111111111111';
  fEditor.eName.Text:= IBSS.UserInfo[i].FirstName;
  fEditor.eMiddle.Text:= IBSS.UserInfo[i].MiddleName;
  fEditor.eLast.Text:= IBSS.UserInfo[i].LastName;
  //теперь покажем редактор:
  fEditor.ShowModal;
  //если изменений делать не нужно, просто выходим:
  if not Editor.izmen then Exit;
  //иначе сохраняем их:
  try
    //Имя пользователя менять не будем.
    //Сохраним пароль, если там не единички:
    if fEditor.ePass.Text <> '11111111111111111111' then
      IBSS.Password:= fEditor.ePass.Text;
    //Далее сохраняем остальные параметры:
    IBSS.FirstName:= fEditor.eName.Text;
    IBSS.MiddleName:= fEditor.eMiddle.Text;
    IBSS.LastName:= fEditor.eLast.Text;
    //сохраняем изменения физически методом ModifyUser:
    IBSS.ModifyUser;
  finally
    IBSS.Active:= False;
  end; //try
  //перечитываем информацию о пользователях:
  ReloadUsers;
end;

Подробно разбирать весь код не будем, так как комментариев достаточно, но остановимся на некоторых моментах. Строка

IBSS.UserName:= LB1.Items[LB1.ItemIndex];

делает в компоненте IBSS текущим пользователем того, который в данный момент выбран в списке ListBox. Затем мы находим индекс этого пользователя в списке. Зачем это нужно? Дело в том, что данные о пользователе можно вытащить только через свойство UserInfo. Другими словами, если мы хотим посмотреть отчество пользователя, то IBSS. MiddleName вернет пустую строку, даже если отчество есть, а IBSS. UserInfo [i]. MiddleName вернет отчество. При сохранении отчества нужно напротив, обращаться к IBSS. MiddleName. Физическое изменение данных реализуется методом ModifyUser. Сохраните проект, скомпилируйте его и попробуйте отредактировать какого либо существующего пользователя, например, добавив к нему дополнительные данные (фамилию, имя, отчество). После сохранения результата, в утилите IBConsole должны отобразиться эти данные.

Удаление пользователя

Это самая простая операция с IBSecurityService. Ее код:

{Удаление пользователя}
procedure TfMain.bDeleteUserClick(Sender: TObject);
var s: String; //для формирования строки
begin
  //если не один пользователь не выбран, просто выходим:
  if LB1.ItemIndex = -1 then begin
    ShowMessage('Выберите пользователя!');
    Exit;
  end;
  //иначе продолжаем. формируем запрос:
  s:= 'Вы действительно желаете удалить пользователя ' +
    LB1.Items[LB1.ItemIndex] + '?';
  //попросим подтверждения. выходим, если не подтвердили:
  if Application.MessageBox(PChar(s), 'Удаление пользователя',
    MB_YESNOCANCEL+MB_ICONQUESTION) <> IDYES then Exit;
  //если не вышли, значит удаляем пользователя
  IBSS.Active:= True;
  try
    //делаем пользователя текущим:
    IBSS.UserName:= LB1.Items[LB1.ItemIndex];
    //удаляем его методом DeleteUser:
    IBSS.DeleteUser;
  finally
    IBSS.Active:= False;
  end; //try
  //перечитываем информацию о пользователях:
  ReloadUsers;
end;

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

Вкладка InterBase Admin Палитры компонентов содержит еще целый ряд сервисных компонентов. Однако в рамках лекции просто невозможно разобрать их все, мы рассмотрели работу только основных компонентов. Остальные работают похожим образом, вы сможете самостоятельно разобраться с ними, изучив справку Delphi по компонентам.

< Лекция 26 || Лекция 27: 12345 || Лекция 28 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'.