Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть не более одной записи, вне зависимости от запроса. 
:(
    Опции темы
Akina
  Дата 3.5.2007, 08:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 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 не работал и у меня он даже не установлен пока - т.е. опробовать не на чем.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SergeBS
Дата 3.5.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



Akina
Читай про LIMIT

Добавлено через 7 минут и 35 секунд
Akina
Я поспешил... Ставь MySQL - это максимум час, зато заимеешь доки и полигон. На 5.04 есть и русские.
А там - по обстановке.
Честно говоря, задачу не понял. Если административная - то в MySQL достаточно просто грамотно прописать права. Там оно правда очень хитрое на первый взгляд. Например админ может зайти на сервер локально, но не может удаленно (по умолчанию), а можно сделать наоборот. Соответственно прописав права получишь - либо 0, 1 запись (LIMIT 1,1 например, если надо ограничить), либо access denied  smile 
PM MAIL   Вверх
skyboy
Дата 3.5.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



можно установить limit 2 - и если записей более одной - генерировать ошибку. есди менее 2 - то работать с пустым/однострочным резулсетом.
PM MAIL   Вверх
SergeBS
Дата 3.5.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



Вдогонку. Не бойся ставить. Он ничего не порушит. У меня сейчас например на рабочей машине - MySQL, MS SQl, FireBird вполне уживаются. Нужный по надобности запускаю. 
И обрати внимание на codepage. Лучше сразу, чем потом таблицы переделывать. 
PM MAIL   Вверх
Akina
Дата 3.5.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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

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

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

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SergeBS
Дата 3.5.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



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

Тогда плохо. В голову приходит - 3-звенка. Т.е. сервер прятать за сервером приложения и уже сервер приложения анализирует запрос и его результат. И то не факт, что получится что-то сделать. Больно заковыристая задача.
Или лезть в исходники MySQL и "дорабатывать напильником". Тоже не сахар. Если я не путаю и исходники открыты.
Мне что-то кажется, что к задаче не с того бока подошли.
PM MAIL   Вверх
Akina
Дата 3.5.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Не... В сыром виде это пока должно вроде выглядеть так.

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

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SergeBS
Дата 3.5.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.