Текущий архив: 2002.03.28;
Скачать: CL | DM;
ВнизСоздание обзоров Найти похожие ветки
← →
Malder (2002-02-27 16:58) [0]У меня имеется таблица Table.
В ней храняться записи о клиентах. Среди прочих полей там есть поле Manager, где храниться имя менеджера, который "ведет" данного клиента.
Мне нужно, чтобы менеджер под своим именем/паролем мог работать только со своими клиентами. То есть менеджер ivan имеет доступ только к записям, где поле Manager=ivan.
Для этого использую Обзоры (View). Для каждого менеджера создается обзор, и менеджеру выдается грант на доступ к своему обзору. Это ясно.
Но возникает проблема при подключении. К какой таблице нужно подключаться ? Если введен логин ivan, то нужно подключаться к таблице ivan_view. Если за комп сядет менеджер ura, то нужно коннектиться к таблице ura_view. Ну вообщем, понятно я думаю...
Имя таблицы нужно указывать до подключения к базе.
Пока я вижу вариант только такой. Сначала попросить пользователя ввести свой логин. А потом уже при коннекте к базе BDE спросит его еще раз свой логин, но уже с паролем...
но это как то через... одно место получается...
← →
Shirson (2002-02-27 18:05) [1]Что-то непонятно... Организуй свое окно ввода логина и пароля. Когда пользователь ввел логин и пароль, сформируй нужное имя и на основе полученных от пользователя логина и пароля цепляся к базе.
Кстати... а ты как к базе то обращаешься?
← →
Reindeer Moss Eater (2002-02-27 18:53) [2]Малдер, я же тебе уже говорил, что не надо делать много View"вов.
Достаточно ОДНОГО:
Create View MyView as
Select * from Clients
Where Manager = User
With Check Options
Поле Manager заполняй в триггере:
New.Manager = USER
Вот и все!
← →
Reindeer Moss Eater (2002-02-27 19:05) [3]WITH CHECK OPTION - так правильнее
Все пользователи работают только с этим просмотром на который у них GRANT ALL.
А прав на саму таблицу вообще не давай никому.
← →
Bachin (2002-02-27 19:23) [4]2Reindeer Moss Eater
Слегка запутал парня :)
WITH CHECK OPTION означает, что логика будет также проверяться при инсерте. т.е. пользователь не сможет вставить запись, которую потом не сможет выбрать. т.о., если New.Manager != USER, то будет ошибка.
← →
Malder (2002-02-27 21:34) [5]1) Shirson, к базе цепляюсь просто.
query1.sql.add("SELECT * FROM Table_view");
query1.active:=true;
Не понимаю, где здесь можно логин/пароль задать.
2) Reindeer Moss Eater, не понял твой пример.
>Create View MyView as
>Select * from Clients
>Where Manager = User
>With Check Options
>
>Поле Manager заполняй в триггере:
>New.Manager = USER
Если я правильно понял, код "Create View MyView as ..." выполняется один раз под аккаунтом админа... Тогда, что такое USER ? Имя определенного менеджера ? Тогда ты создашь Обзор только на данного конкретного менеджера
И что за структура New ?
← →
Deniz (2002-02-28 07:22) [6]>Malder (27.02.02 21:34)
А если код немного подправить:
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add("select USER from rdb$database");
TmpQuery.Open;
UserName:=TmpQuery.Fields[0].asString;
TmpQuery.Close;
Query1.SQL.Add("SELECT * FROM " + UserName + "_view");
Query1.Active:=True;
Это не достойное решение. Не надо создавать много View"ров, лучше один для всех:
Query1.SQL.Add("select * from ViewName where Manager = :UserName");
Query1.Prepare;
Query1.Params[0].asString:=UserName;
Query1.Open;
И потом не будет проблем с добавлением User"ов.
← →
Reindeer Moss Eater (2002-02-28 08:37) [7]> BACHIN
"WITH CHECK OPTION" - означает, нечто иное.
Если юзер USER1 вставил запись, то в триггере сервер (не клиент!) в поле Manager напишет "USER1".
Если поле Manager есть в просмотре, то гарантирует, что USER1 не сможет изменить его значение на отличное от "USER1", а так же не сможет вставить запись с Manager <> "USER1"
Но я и не предлагаю заполнять это поле с клиента. Это должен делать СЕРВЕР.
При работе по такой схеме не нужно много просмотров (нужен всего один), а также не нужны параметрические запросы по полю "Manager".
Фактически его можно даже не включать в представление.
> Malder "не понял твой пример". А ты попробуй выполнить его и все станет ясно. User - это имя текущего пользователя.
← →
Malder (2002-03-01 13:42) [8]>New.Manager = USER
Обьясните, плиз, что такое New ?
← →
Reindeer Moss Eater (2002-03-01 15:49) [9]CREATE TRIGGER TR_MY_TRIGGER FOR MYTABLE
BEFORE INSERT POSITION 0
AS
BEGIN
NEW.MANAGER = USER
END
"New" это алиас для нового значения поля.
Теперь если любой пользователь вставляет запись в таблицу или в тот просмотр про который я толкую, то сервер в поле Manager пишет имя этого пользователя.
Ну понял наконец?
← →
Malder (2002-03-01 23:33) [10]Reindeer Moss Eater, ага. Спасибо большое
Страницы: 1 вся ветка
Текущий архив: 2002.03.28;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.006 c