Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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, ага. Спасибо большое



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.006 c
1-91002
Alx2
2002-03-15 15:47
2002.03.28
Быстро заполнить TTreeView


3-90809
Михаил с
2002-03-04 13:17
2002.03.28
Проблема с InterBase


4-91121
ctapik-net
2002-01-29 14:18
2002.03.28
Вопрос про Hint


1-90905
kronos
2002-03-13 21:03
2002.03.28
Помогите чайнику!!!


3-90765
Sam
2002-02-20 19:53
2002.03.28
Конвертирование БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский