Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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  smile 

Автор: 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 записи, либо полученную выборку - пустую или с одной записью.

Запрос, который пошлет приложение, я НЕ КОНТРОЛИРУЮ. Я вообще не знаю, какие приложения будут запрашивать информацию из БД, кто их напишет, как, на каком языке... мое дело опубликовать базу, и я просто сообщаю имя пользователя и пароль, с которыми приложения должны подключаться к серверу... и все. 

Т.е. может прийти запрос, например, такой
Код

Select MainTable.*, SubTable.*
From MainTable 
Join SubTable
ON MainTable.SubID = SubTable.ID
Where MainTable.ID Between 1000 AND 2000;

а отдать результат база должна только если найдено не более 1 записи, удовлетворяющей условиям отбора.

Автор: SergeBS 3.5.2007, 11:54
Akina
Цитата
Запрос от приложения может прийти ЛЮБОЙ. Но вернуть приложению нужно либо ошибку, если этот запрос дал более 1 записи, либо полученную выборку - пустую или с одной записью.

Тогда плохо. В голову приходит - 3-звенка. Т.е. сервер прятать за сервером приложения и уже сервер приложения анализирует запрос и его результат. И то не факт, что получится что-то сделать. Больно заковыристая задача.
Или лезть в исходники MySQL и "дорабатывать напильником". Тоже не сахар. Если я не путаю и исходники открыты.
Мне что-то кажется, что к задаче не с того бока подошли.

Автор: Akina 3.5.2007, 12:08
Не... В сыром виде это пока должно вроде выглядеть так.

От приложения пришел запрос. Но он не к таблице, а к вьюву - юзеру таблицы недоступны не то что выбирать, а вообще увидеть факт их существования. К вьюву присоединен, скажем, триггер пост-обработки, который получает выборку по переданному запросу, считает count возвращенных записей, и если он оказывается более 1, то он блокирует передачу полученного набора, вместо него возвращая либо ошибку, либо набор с заведомо невозможными данными (скажем, ID = -1).

По-моему что-то в этом направлении должно быть реализуемо. В рамках MS SQL во всяком случае это реализуется почти запросто именно такого рода путем.

Дополнение: клиентское приложение может только запросить данные. Ни удаление, ни корректировка, ни добавление в компетенцию клиентов не входят. Только смотреть.

Автор: SergeBS 3.5.2007, 12:52
Akina
Цитата
По-моему что-то в этом направлении должно быть реализуемо. В рамках MS SQL во всяком случае это реализуется почти запросто именно такого рода путем.

Честно говоря, не могу сообразить - как отследить, что к серверу пришел банальный select.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)