Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программное добавление логина и пользователя в базу данных [D6, MSSQL]


AndrewK ©   (2003-02-14 19:28:00) 

Доброго времени суток.

Подскажите, пожалуйста, как можно решить следующую задачку.

Есть программа, которая работает с базой данных MS SQL Server 7.0
Она поддерживает работу нескольких групп пользователей:
Администратор, который может добавлять пользователей,
Координатора, который располагает рассширенными правами на работу в программе,
Оператора, который осуществляет только ввод текущей информации.

Как сделать так, чтобы администратор мог добавлять логин и
пользователя в базу данных. Проблема в еще в том, что логин может добавить только SecurityAdmin.

Вопрос, как корректно отследить наличие у пользователя этих прав? Если они у него есть, то как корректно добавить или удалить пользователя и логин (чтобы это не повлияло на другие базы данных, расположенных на этом же сервере)? И, позвольте еще один вопрос в догонку предыдущим, как перехватить сообщения базы данных, например "Login incorrect" и заменить его своим сообщением, например "Извините, такого логина нет.".

Заранее спасибо.


asmith   (2003-02-14 21:47:00) [1]

Создаем в базе роли:
sp_addrole "Operator" -- для оператора

sp_addrole "Administrator" -- для админа
EXEC sp_addrolemember "db_securityadmin", "Administrator"
EXEC sp_addrolemember "db_accessadmin", "Administrator"

Юзеров вводим примерно такой процедурой:
CREATE PROCEDURE [dbo].[sp_NewUser]
@loginname varchar(30),
@password varchar(128),
@admin bit = 0
-- другие параметры
AS
declare @msg varchar(255), @dbname varchar(30)
set @dbname = db_name()
if exists (select * from master.dbo.syslogins where loginname = @loginname and isntname = 0)
begin
EXEC master..xp_sprintf @msg OUTPUT, "Cannot add new login and user account. Login "%s" already exists on SQL Server", @loginname
RAISERROR (@msg, 16, 1)
RETURN
end
if suser_sid(@loginname) is NULL and CHARINDEX("\", @loginname) = 0 -- быстрый некрасивый способ ловли доменных юзеров
EXEC sp_addlogin @loginname, @password, @dbname
else
EXEC sp_grantlogin @loginname

EXEC sp_grantdbaccess @loginname
if @admin = 1
begin
EXEC sp_addrolemember "Administrator", @loginname
EXEC sp_addsrvrolemember @loginname, "securityadmin"
end
else
EXEC sp_addrolemember "Operator", @loginname
-- делаем еще что-нибудь, например, лобавляем запись в собственную таблицу юзеров для нестандартных настроек
GO

Что касается перехвата сообщений о неправильновильном соединении с сервером, то это существенно зависит от клиентского ПО доступа к данным (BDE, ADO etc)


Наверх

Титульная страница Поиск, карта сайта Написать письмо