Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.009 c
3-90746
AnIg
2002-02-28 18:21
2002.03.28
Кто работал с DBChart ? Что за эффект?


3-90771
Hawk2
2002-02-28 15:55
2002.03.28
Простой вопрос по Access.


1-90902
tovSuhov
2002-03-18 12:35
2002.03.28
ParamStr...


3-90791
Sewix
2002-02-28 10:32
2002.03.28
Отчет


4-91127
skiph
2002-01-24 11:20
2002.03.28
Скрыть файлы