Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > MySQL > Вернуть не более одной записи |
Автор: Akina 3.5.2007, 08:18 |
Оговорюсь сразу: 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 3.5.2007, 09:24 |
Akina, Читай про LIMIT Добавлено через 7 минут и 35 секунд Akina, Я поспешил... Ставь MySQL - это максимум час, зато заимеешь доки и полигон. На 5.04 есть и русские. А там - по обстановке. Честно говоря, задачу не понял. Если административная - то в MySQL достаточно просто грамотно прописать права. Там оно правда очень хитрое на первый взгляд. Например админ может зайти на сервер локально, но не может удаленно (по умолчанию), а можно сделать наоборот. Соответственно прописав права получишь - либо 0, 1 запись (LIMIT 1,1 например, если надо ограничить), либо access denied ![]() |
Автор: skyboy 3.5.2007, 09:46 |
можно установить limit 2 - и если записей более одной - генерировать ошибку. есди менее 2 - то работать с пустым/однострочным резулсетом. |
Автор: SergeBS 3.5.2007, 09:49 |
Вдогонку. Не бойся ставить. Он ничего не порушит. У меня сейчас например на рабочей машине - MySQL, MS SQl, FireBird вполне уживаются. Нужный по надобности запускаю. И обрати внимание на codepage. Лучше сразу, чем потом таблицы переделывать. |
Автор: Akina 3.5.2007, 10:07 | ||
Вы не поняли. Запрос от приложения может прийти ЛЮБОЙ. Но вернуть приложению нужно либо ошибку, если этот запрос дал более 1 записи, либо полученную выборку - пустую или с одной записью. Запрос, который пошлет приложение, я НЕ КОНТРОЛИРУЮ. Я вообще не знаю, какие приложения будут запрашивать информацию из БД, кто их напишет, как, на каком языке... мое дело опубликовать базу, и я просто сообщаю имя пользователя и пароль, с которыми приложения должны подключаться к серверу... и все. Т.е. может прийти запрос, например, такой
а отдать результат база должна только если найдено не более 1 записи, удовлетворяющей условиям отбора. |
Автор: SergeBS 3.5.2007, 11:54 | ||
Akina,
Тогда плохо. В голову приходит - 3-звенка. Т.е. сервер прятать за сервером приложения и уже сервер приложения анализирует запрос и его результат. И то не факт, что получится что-то сделать. Больно заковыристая задача. Или лезть в исходники MySQL и "дорабатывать напильником". Тоже не сахар. Если я не путаю и исходники открыты. Мне что-то кажется, что к задаче не с того бока подошли. |
Автор: Akina 3.5.2007, 12:08 |
Не... В сыром виде это пока должно вроде выглядеть так. От приложения пришел запрос. Но он не к таблице, а к вьюву - юзеру таблицы недоступны не то что выбирать, а вообще увидеть факт их существования. К вьюву присоединен, скажем, триггер пост-обработки, который получает выборку по переданному запросу, считает count возвращенных записей, и если он оказывается более 1, то он блокирует передачу полученного набора, вместо него возвращая либо ошибку, либо набор с заведомо невозможными данными (скажем, ID = -1). По-моему что-то в этом направлении должно быть реализуемо. В рамках MS SQL во всяком случае это реализуется почти запросто именно такого рода путем. Дополнение: клиентское приложение может только запросить данные. Ни удаление, ни корректировка, ни добавление в компетенцию клиентов не входят. Только смотреть. |
Автор: SergeBS 3.5.2007, 12:52 | ||
Akina,
Честно говоря, не могу сообразить - как отследить, что к серверу пришел банальный select. |