![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Оговорюсь сразу:
1) Задача еще не поставлена, но непременно возникнет. Хочу быть хотя бы теоретически готовым; 2) Несмотря ни на что, опыт работы именно с MySQL у меня нулевой; 3) Задачу поставлю на модели, тем не менее суть сохранится. Итак. Исходные данные. Имеется база данных, содержащая 2 таблицы: MainTable ID (Primary Key) SubID (Foreign Key) MainData SubTable ID (Primary Key) SubData Есссно таблицы связаны ON MainTable.SubID = SubTable.ID. Т.е. SubTable - словарь. MainData и SubData - группа полей с данными. Имеется 2 пользователя БД. Admin и соответственно User. Admin yb в чем не ограничен, а вот User... Задача. Сформировать комплекс вьювов, хранимых процедур и прав таким образом, чтобы любой запрос возвращал данные: - Если результирующая выборка содержит 1 запись или не содержит записей, она возвращается. - Если результирующая выборка содержит более 1 записи, генерируется распознаваемая ошибка и набор записей не возвращается. Как мне видится, это может быть реализовано, скажем, созданием вьюва плюс запрещением обращения к таблицам напрямую плюс обработкой результирующего набора перед возвратом и генерация ошибки, если количество записей оказалось более 1... возможно, есть более эффективные подходы... При формулировании ответов прошу исходить из того, что я действительно реально с MySQL не работал и у меня он даже не установлен пока - т.е. опробовать не на чем. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 2 Всего: 22 |
Akina,
Читай про LIMIT Добавлено через 7 минут и 35 секунд Akina, Я поспешил... Ставь MySQL - это максимум час, зато заимеешь доки и полигон. На 5.04 есть и русские. А там - по обстановке. Честно говоря, задачу не понял. Если административная - то в MySQL достаточно просто грамотно прописать права. Там оно правда очень хитрое на первый взгляд. Например админ может зайти на сервер локально, но не может удаленно (по умолчанию), а можно сделать наоборот. Соответственно прописав права получишь - либо 0, 1 запись (LIMIT 1,1 например, если надо ограничить), либо access denied ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
можно установить limit 2 - и если записей более одной - генерировать ошибку. есди менее 2 - то работать с пустым/однострочным резулсетом.
|
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 2 Всего: 22 |
Вдогонку. Не бойся ставить. Он ничего не порушит. У меня сейчас например на рабочей машине - MySQL, MS SQl, FireBird вполне уживаются. Нужный по надобности запускаю.
И обрати внимание на codepage. Лучше сразу, чем потом таблицы переделывать. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Вы не поняли. Запрос от приложения может прийти ЛЮБОЙ. Но вернуть приложению нужно либо ошибку, если этот запрос дал более 1 записи, либо полученную выборку - пустую или с одной записью.
Запрос, который пошлет приложение, я НЕ КОНТРОЛИРУЮ. Я вообще не знаю, какие приложения будут запрашивать информацию из БД, кто их напишет, как, на каком языке... мое дело опубликовать базу, и я просто сообщаю имя пользователя и пароль, с которыми приложения должны подключаться к серверу... и все. Т.е. может прийти запрос, например, такой
а отдать результат база должна только если найдено не более 1 записи, удовлетворяющей условиям отбора. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 2 Всего: 22 |
Akina,
Тогда плохо. В голову приходит - 3-звенка. Т.е. сервер прятать за сервером приложения и уже сервер приложения анализирует запрос и его результат. И то не факт, что получится что-то сделать. Больно заковыристая задача. Или лезть в исходники MySQL и "дорабатывать напильником". Тоже не сахар. Если я не путаю и исходники открыты. Мне что-то кажется, что к задаче не с того бока подошли. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Не... В сыром виде это пока должно вроде выглядеть так.
От приложения пришел запрос. Но он не к таблице, а к вьюву - юзеру таблицы недоступны не то что выбирать, а вообще увидеть факт их существования. К вьюву присоединен, скажем, триггер пост-обработки, который получает выборку по переданному запросу, считает count возвращенных записей, и если он оказывается более 1, то он блокирует передачу полученного набора, вместо него возвращая либо ошибку, либо набор с заведомо невозможными данными (скажем, ID = -1). По-моему что-то в этом направлении должно быть реализуемо. В рамках MS SQL во всяком случае это реализуется почти запросто именно такого рода путем. Дополнение: клиентское приложение может только запросить данные. Ни удаление, ни корректировка, ни добавление в компетенцию клиентов не входят. Только смотреть. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 2 Всего: 22 |
Akina,
Честно говоря, не могу сообразить - как отследить, что к серверу пришел банальный select. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |