|
|
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevМне вот интересно, а как быть (в случае когда доступом рулит БД), если требуется доступ только к определённым записям в таблице, а не ко всей таблице ? Например, чтобы пользователь 1 мог удалять только свои записи, просматривать записи пользователя 2, но не видел записей пользователя 3 и 4 ?А это зависит от СУБД. У большинства для этого есть специальные модули, которые стоят специальные деньги. Ну и универсальный бесплатный способ: всю работу с базой вести исключительно через хранимые процедуры. В них и делать все что нужно для определения есть у этого юзера доступ к этой записи или нет. Другой вариант: делаешь view (обновляемый если нужно) и в нем уже даешь доступ к определенной записи для юзера по нужным правилам и заставляешь всех юзеров работать с этими представлениями (просто отбираешь доступ к таблице, разрешаешь к представлению). Собственно говоря, "решения из коробки", те самые дополнительные модули для СУБД, именно так и делают. Но они не создают отдельное представление, а подменяют обращение к реальной таблице на обращение к виртуальному представлению. Ты определяешь правила доступа к записи, а сервер уже будет на каждое обращение к записи проверять этот набор правил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:05 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Интересный вариант :). Особенно если пользователей не один десяток. Представляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять. А уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:29 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevИнтересный вариант :). Особенно если пользователей не один десяток. Представляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.Не вижу проблем. Каждая запись имеет "признак принадлежности". Это может быть и имя юзера (если доступ надо делать персонализированным) или код отдела/филиала/группы/итп. А потом просто Код: sql 1. 2. или Код: sql 1. 2. И все. Dmitry EliseevА уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ?Ну а это то какие сложности у тебя вызывает? Триггера в школе не проходили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 01:37 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
[quot White Owl]Dmitry Eliseev А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять. Dmitry EliseevА уж вести логирование бизнес дейстивий... видимо тоже с помощью хранимых процедур ?Ну а это то какие сложности у тебя вызывает? Триггера в школе не проходили? Проходили конечно, только хочется чтобы в логе было записано: Код: sql 1. , а не сотню строк типа Код: sql 1. 2. 3. потом такие же действия со связанными таблицами, и наконец: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 02:09 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
[quot Dmitry Eliseev]White Owlпропущено... Проходили конечно, только хочется чтобы в логе было записано: Код: sql 1. , а не сотню строк типа Код: sql 1. 2. 3. потом такие же действия со связанными таблицами, и наконец: Код: sql 1. Ну во первых, лично я за такие текстовые логи увольняю на месте. Подобные текстовые записи в логах удобны только на первый взгляд. Но если тебе понадобиться узнать что происходило с расписанием "Новое". Тебе придется заниматься извращенным сексом с регулярными выражениями и при этом без уверенности в успехе. Когда люди делают текстовые логи, они не склонны придерживаться шаблонов, зато склонны соблюдать грамматику. И в итоге получается: - расписание Новое создала Света - Изменение в расписании <<Новое>> сдал Боря - Иванов Иван Иванович удалил информацию о расписании "Новое" А через год попытайся собрать историю этого расписания и ты скорее свихнешься чем добьешься успеха. А во вторых, запись с полями типа (user_id, type_of_items, action_code, item_id) всегда можно будет расшифровать в текст любого из форматов которые я уже показал, и в тысячи других форматов которые ты можешь придумать. И в третьих, ну и какие сложности ты видишь чтобы создать текст "Иванов Иван Иванович удалил информацию о расписании "Новое" " из триггера или хранимой процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 05:57 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПредставляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 08:34 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Неважно в текстовый лог идёт запись или в лог со специфическим форматом. На основной вопрос так и нет ответа. Как сделать логирование БИЗНЕС процесса, когда этот процесс меняет содержимое нескольких таблиц (от трёх до десяти). Куда вешать триггер? rockclimberDmitry EliseevПредставляю себе размер хранимых процедур. А как наверное весело реализовывать динамическую раздачу прав. Чтобы админ (роль приложения, а не СУБД) мог самостоятельно разруливать какие действия и с какими записями какой пользователь мог осуществлять.1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. Там описано для случая, когда пользователями/правами/ролями управляют на уровне приложения. Мне интересно как это сделать на уровне СУБД. Кстати, использование хранимых процедур ничем не отличается от написание того же кода в приложении. Т.е. фактически только место исполнения кода разное. В пользу кода в приложении говорит переносимость между СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 10:24 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevНеважно в текстовый лог идёт запись или в лог со специфическим форматом. На основной вопрос так и нет ответа. Как сделать логирование БИЗНЕС процесса, когда этот процесс меняет содержимое нескольких таблиц (от трёх до десяти). Куда вешать триггер?Хотите самостоятельно логировать изменения в каждой отдельной таблице? Тогда на каждую из логируемых таблиц создаете триггер и "парную" ей таблицу для логирования изменений. Разворачивание таблиц-логов для "разбора полетов" - отдельная, достаточно "веселая" задача... Dmitry Eliseevrockclimberпропущено... 1 SQL-запрос и три таблицы. И, между прочим, на первой странице топика все это уже описано. Там описано для случая, когда пользователями/правами/ролями управляют на уровне приложения. Мне интересно как это сделать на уровне СУБД.Принцип тот же самый. Только в одном случае это нужно делать "ручками", а в другом случае - фича базы данных. Например, в Oracle это что-то типа "fine-grained access control" или "virtual private database". В общих чертах там это работает как прозрачное (и невидимое) для пользователя включение дополнительного условия фильтрации (с учетом пользователя и его ограничений) в любую DML-команду. Dmitry EliseevКстати, использование хранимых процедур ничем не отличается от написание того же кода в приложении. Т.е. фактически только место исполнения кода разное. В пользу кода в приложении говорит переносимость между СУБД.Переносимость между разными СУБД актуальна только когда стоимость переноса равна нулю - а такого не бывает даже при переезде между разными "бесплатными" СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 13:01 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevВ пользу кода в приложении говорит переносимость между СУБД.Переносимость между СУБД? Ха-ха-ха. Это все сказки и фантазии людей ни разу не выходивших за рамки студенческих курсовых. В реальности, если ты решишься переходить с одной СУБД на другую, то только по причине гигантской разницы между СУБД. Вот с FoxPro/Clipper на какую-нибудь SQL-based СУБД переходят запросто (при этом полностью все переписывая естественно). Это экономически оправданно. Переход между разными SQL-based DBMS экономически не оправдан почти никогда. Переход с одной базы на другую (с MySQL на Oracle) я в жизни видел всего один раз. У несчестной конторы сменился начальник который очень любил ораклятину и ему было плевать на затраты. Переход шел около двух лет и за это время контора практически полностью потеряла всех своих контрагентов (в том числе и нас) потому что нам тоже пришлось выкидывать весь наработанный софт которым мы общались с ними и писать его заново. А для этого уже нам пришлось бы нанимать ораклистов. Мы подумали, поприкидывали и ушли от той конторы к ее конкурентам. Те обещали более удобное API для своих баз и большие скидки на услуги. Сейчас несчастные вроде-бы снова поднимаются, но почти четыре года они сидели в глубокой экономической яме. Старые клиенты на них плевались, а новые косились. А все потому что Большому Боссу не нравилась "бесплатность" используемой СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2013, 17:28 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Перенос между разными SQL-ными СУБД вполне возможен и по экономическим причинам. Например с Oracle, на PostgresQL, чтобы продать решение без навязывания покупки Оракла, или исходя из удобства/неудобства использования диалекта SQL. Весьма распространена ситуация когда у заказчика используется Oracle, разработчику удобнее использовать Postgres, а тесты гоняются на H2. При этом liquibase обеспечивает единство баз под всеми этими платформами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2013, 23:02 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПеренос между разными SQL-ными СУБД вполне возможен и по экономическим причинам.Я такое только про "коробки" слышал - про продукцию 1С и Atlassian (Jira, Confluence и пр.) например. Еще ЦФТ пыжится что-то такое родить, но, судя по слухам, есть большой шанс, что надорвется... Во всех остальных случаях без живых цифр на руках или известных примеров лучше даже не заикайтесь про это. Даже просто переход на следующую версию той же СУБД не всегда гладко проходит (опять же, видел краем глаза, как ЦФТшную АБС готовили к переходу с 9-го оракла на 11-й - процесс планировали чуть ли не за год), многие до сих пор сидят на 9-м или 10-м оракле, хотя уже 12 скоро выйдет, а вы сразу на другую СУБД перескочить хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 08:31 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry EliseevПеренос между разными SQL-ными СУБД вполне возможен и по экономическим причинам. Например с Oracle, на PostgresQL, чтобы продать решение без навязывания покупки Оракла, или исходя из удобства/неудобства использования диалекта SQL.Приводить "экономические причины" не серьезно - аргумент "для очень бедных". В действительно серьезных проектах стоимость лицензий никогда не составляет сколь-либо значимую долю расходов. Получается, типа, "мы тут замутили проЭкт на 100500 мульенов денег, но купить лицензионный софт нам капусты не хватает"... И не забываем, что ни один "бесплатный продукт" никогда не был бесплатным в обслуживании - вплоть до того, что обслуживание (иногда) обходится гораздо дороже, чем для "платных"... Ну, а "удобство/неудобство диалекта SQL" - вообще смешно... Dmitry EliseevВесьма распространена ситуация когда у заказчика используется Oracle , разработчику удобнее использовать Postgres , а тесты гоняются на H2 . При этом liquibase обеспечивает единство баз под всеми этими платформами.Вы лучше расскажите (потенциальным заказчикам), ГДЕ практикуется подход разработки с ТАКИМ "зоопарком" - сугубо "во избежание"... Заодно попытайтесь озвучить аргументы, по которым разработку (в частности, под Oracle) нужно (и возможно) использовать совершенно "перпендикулярные" средства... Очень надеюсь, что Вы (хотя бы теоретически) подозреваете, что при "зоопарк-подходе" Вы НИКОГДА не сможете использовать сколь-нибудь значимую часть реальных возможностей целевой платформы заказчика. Для SQL-серверов это (в лучшем случае) будет ограничено "базовыми" SQL-командами (select/insert/update/delete) c крайне упрощенным синтаксисом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 11:33 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
смешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 17:12 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...И это - все претензии?! Ну, что тут сказать... Поплачьте... Уж сколько работаю с разными СУБД, но какой-то принципиальной необходимости в типе данных TIME ни разу не испытывал - это при том, что последние несколько лет работаю в разработках для телекома... И мне ОЧЕНЬ хочется посмотреть, как Вы свой проект, который вели на платформе, где есть и автоинкреммент, и TIME перенесете туда, где "в-лоб" такого не наблюдается физически... Особенно - если Вы на них "насмерть" завязаны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 17:41 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
Dmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...Это у кого нет типа TIME??? (СУБД уровня "неуловимый Джо" не рассматриваем). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2013, 20:12 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberDmitry Eliseevсмешно, когда у СУБД нет автоинкрементных полей и типа TIME, так смешно, что плакать хочется...Это у кого нет типа TIME??? (СУБД уровня "неуловимый Джо" не рассматриваем).У очень многих на самом деле. Даже Sybase ASE вплоть до 12-ой версии считал что одного datetime хватит и для дат и для времени. Правда в15-ой версии одумались :) MS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой. Ну а SQLite в принципе не имеет никаких специальных типов для даты-времени. Там обходяться хранением целых и/или текстов и кучкой функций для конвертации этих типов в дату-время. Тем не менее SQLite является самой популярной встраиваемой базой на сегодня (да и самой лучшей пожалуй). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 07:06 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
White OwlMS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой.Жесть какая. Вроде, даже в аксессе есть тип даты, я думал, что уж в MS SQL-то точно должно быть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 09:47 |
|
||
|
Проектирование базы данных
|
|||
|---|---|---|---|
|
#18+
rockclimberWhite OwlMS SQL всю жизнь шел у Sybase ASE на поводу и тоже не имел отдельных типов date и time вплоть до 2005-ой версии. Их сделали только в 2008-ой.Жесть какая. Вроде, даже в аксессе есть тип даты, я думал, что уж в MS SQL-то точно должно быть...Вместо даты там datetime, округлённый до суток :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 10:15 |
|
||
|
|

start [/forum/topic.php?fid=16&startmsg=38275684&tid=1341793]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
456ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 790ms |

| 0 / 0 |
