Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Вниз

Создание обзоров 


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, ага. Спасибо большое




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.042 c
1-90923           Брат                  2002-03-13 09:47  2002.03.28  
Вопрос по Паскалю: как сделать курсор невидимым?


6-91032           Beginer               2001-11-12 08:43  2002.03.28  
Подключить сетевой диск...


1-90820           Malder                2002-03-15 19:49  2002.03.28  
Русифиация Delphi ресурсов...


1-90951           d_oleg                2002-03-14 10:54  2002.03.28  
Font pitch


1-90917           alex1111              2002-03-18 15:43  2002.03.28  
Unicode