Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Приложение должно работать следующим образом. Если один пользователь открыл форму для работы с таблицей test, то никакой другой пользователь не должен иметь к ней доступа, даже на чтение. Когда пользователь закрывает форму, то таблица вновь должна стать доступна для редактирования и просмотра. Я работаю с базой через ADO на VB. Вопрос такой: Есть-ли встроенная возможность блокировки таблицы (перевод в монопольное использование) в MSSQL 2000? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2001, 14:10 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
>Когда пользователь закрывает форму, то таблица вновь должна стать доступна для редактирования и просмотра. А если он ее не закроет и уедет в командировку? Тогда что? Хана всем остальным пользователям? Или хана администратору, который замучается ловить за руку несознательных юзеров? Нельзя так делать приложение. Блокировки должны быть по продолжительности во времени как можно более короткими. Иначе с твоей программой больше двух юзеров работать не смогут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2001, 15:59 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
>Иначе с твоей программой больше двух юзеров работать не смогут. Неа, с такой программой не сможет работать более одного юзера остальные ждут-с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 05:30 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
А чем собственно вызвана необходимость "мертвой" блокировки таблицы? Плохо себе представляю ситуацию требующую этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 07:27 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
>А чем собственно вызвана необходимость "мертвой" блокировки таблицы? Разрабатывается Автоматизированная Система Управления Технологическим Процессом(АСУТП). Основные задачи, которые осуществляют управление системой работают на промышленных контроллерах. Необходимо разработать рабочее место настройщика системы, который должен динамически настраивать задачи на контроллере. Когда настройщик производит изменение конфигурации, то его программа должна автоматически занести изменения в БД. Эта База будет использоваться для статического конфигурирования задач в контроллере в случае перезапуска контроллера. Критичность к искажению информации такая: если два пользователя возьмутся редактировать одну запись в таблице, то может произойти следующее: Первый изменит в записи - значение одного поля, UPDATE test SET Field1 = 1 WHERE ID = 100 а Второй изменит - значение другого поля. UPDATE test SET Field2 = 2 WHERE ID = 100 Причем второй изменения первого видеть не будет. В результате получившаяся запись в таблице может повесить задачу в контроллере в случае статического конфигурирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 07:58 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
2 Alexander Почитайте внимательно в BOL об уровнях изоляции в MS SQL, описанная ситуация невозможна. Первый изменит в записи - значение одного поля, UPDATE test SET Field1 = 1 WHERE ID = 100 а Второй изменит - значение другого поля. UPDATE test SET Field2 = 2 WHERE ID = 100 P.S. Блокировка на уровне полей кто нибудь мечтает об этом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 08:21 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Наверное всё-таки это возможно, если действия выполняются в течении короткого промежутка времени, но последовательно. Но есть возможность обеспечить что бы "второй увидел изменения первого". Для этого существует поле типа timestamp, которое изменяется при каждом изменении записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 10:08 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Genady, насколько я понимаю, речь идет о следующей ситуации (если что не так, пусть меня поправит Alexander). Изменения, вносимые каждым из настройщиков, корректны с точки зрения сиквела и с точки зрения каждого из них (поскольку на момент редактирования они не видят измененные соседом данные). Оба update'а пройдут без ошибок и прекрасно сохранятся в базе, но получившаяся запись будет _семантически_ некорректна для контроллера. У меня тогда еще вопрос к Alexander - а если настройщик сам допустит ошибку и в базе сформируется запись, которая будет приводить все к тому же зависанию, как решается эта проблема ? Или вы закладываетесь на то, что человек, видя все данные, не сможет сделать некорректные изменения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 10:13 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
2 SergSuper 2 GreenSunrise Насколько я понял, речь шла как раз об одновременно обновляемой записи, а что бы избежать ситуации описанной SergSuper я и советовал почитать об уровнях изоляции, Repeatable read скорее всего поможет (я надеюсь юзера в данной ситуации работают с данными не в асинхронном режиме). А если бы вопрошающий подробнее описал задачу, так может там и вовсе триггерами можно обойтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 10:21 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
To GreenSunrise Вы абсолютно правильно поняли проблему. Мы действительно закладываемся на то, что настройщик, который видит все поля записи - не произведет ошибок. В случае ошибочной конфигурации задача на контроллере будет вести себя некорректно и проблемы неизбежны. Это не обязательно приведет к зависанию контроллера, но управление тех. процессом может сильно нарушиться. To Genady Я посмотрел уровни изоляции, но это работает только в рамках транзакции. А у меня ситуация иная. Может быть хранить дополнительную информацию - кто и какую таблицу открыл? Однако, как поступать в таком случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 11:46 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Предложение следующее: создать таблицу current_actions(table_name, userid) с primary key по полю table_name. При открытии формы для редактирования первой строчкой делаете insert into current_actions('mytable', myuserid). При закрытии формы соответственно delete from current_actions where... Этим простым действием Вы добиваетесь монопольной работы с данными, поскольку если первый insert не проходит, то ясно, что таблица находится под редактированием. Да к тому же сразу видно, кто занял таблицу. В принципе, тот же механизм можно применить и для запрещения на чтение данных, но я не вижу смысла в таком запрещении. Может, поясните ? Приведенный метод мне кажется довольно удачным, поскольку он не блокирует ресурсы на уровне сиквела - так чтобы потом приходилось принудительно убивать коннекты, снимать блокировки и т.д. Он несет именно семантическую нагрузку - как и задача, которую он решает. P.S. У меня за плечами 2 года работы в АСУТП ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 12:08 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
>Мы действительно закладываемся на то, что настройщик, который видит все поля записи - не произведет ошибок. По другому никак? >Я посмотрел уровни изоляции, но это работает только в рамках транзакции. А у меня ситуация иная В каком смысле иная? Транзакций нет что ли Нда.... Вопрос 1 Что это за таблица, что в ней хранится? Вопрос 2 У Вас что, значение одного поля зависит от значения другого? (нормализовать не хотите?) P.S. Управлять техпроцессом закладываясь на то что оператор не ошибется... мда... интересно что это за техпроцесс такой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 12:11 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
To GreenSunrise Благодарю за совет. Чтение запрещать действительно не имеет смысла. To Genady >В каком смысле иная? Транзакций нет что ли Я имел ввиду, что блокировать данные хочется не на уровне транзакций. Выбрал запись для редактирования - первая транзакция началась и закончилась. Отредактировал значения в форме. Нажал "обновить" - вторая транзакция началась и закончилась. Мне нужно заблокировать данные именно между первой и второй транзакциями. По вопросам: Тех. процесс - Обогащение гуды. Опишу фрагмент базы: Первая таблица "Переменные" - хранит имена всех переменных системы (входные - показания датчиков,выходные - управляющие воздействия и расчетные переменные). Имена переменных в системе уникальны. Переменные могут быть аналоговые и дискретные. Параметры переменных хранятся в отдельных таблицах, одна таблица - для переменных одного типа.(AnalogInput,AnalogOutput,AnalogMemory,DiscreteInput,DiscreteOutput и т.п.) Пареметры переменной: текущее значение, границы изменения, задание и много еще чего. Вторая таблица "Регуляторы" - хранит всю информацию о регуляторах. Один регулятор - одна запись. Параметры регулятора: имя переменной регулируемого параметра(FK) поле переменной регулируемого параметра имя переменной задания(FK) поле переменной задания имя переменной управляющего параметра(FK) поле переменной управляющего параметра алгоритм регулирования и параметры относящиеся к алгоритму регулирования. В контроллере работает ряд задач. Одна из них - "главный Регулятор". Программа "главный Регулятор" - это циклическая программа, которая хранит в памяти таблицу всех регуляторов и обрабатывает их последовательно в бесконечном цикле. Цель программы - пытаться привести значение "регулируемого параметра" к значению "задания" используя "управляющий параметр" для каждого регулятора, определенного в таблице. Таким образом, данные в таблице регуляторов, определяют алгоритм работы программы "главный Регулятор". Искренне старался написать понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 13:40 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Не всегда можно семантику данных впихнуть в структуру данных. Насчет контроллеров могу чуть-чуть рассказать, хотя ко мне они только левым боком относились - программирование контроллеров - это фактически задание электрической схемы, по которой происходит управление механизмами. Как она хранится в базе, не знаю. Да и не важно это. Ну, запихаешь ты в базу по всем правилам науки и техники эту электрическую схему, идеально нормализованную по правилам Бойеса-Кодда (интересно, а это как будет выглядеть ? ). Только кто сказал, что она заработает ? Перепутал настройщик какую-нибудь мелочь - и транспортер поехал не в ту сторону, задал неправильное время выдержки - и смесь сгорела вместо того, чтобы нагреться до нужной температуры. Ну, может, дурацкие примеры, но суть они отображают правильно. Эту семантику не засунешь в базу. А управление контроллером сводится к простейшей операции - записать в нужный регистр из набора доступных тебе нужное число. Вот и все. Проверить правильность созданного рабочего потока можно только на практике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 13:41 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 13:45 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Ну что ж чуть понятней, но вопросы остались. 1. Непонятно зачем параметры переменных хрянятся в отдельных таблицах? 2. Таблица Регуляторы денормализована, почему? 3. Что именно правят операторы? P.S. Здается мне, GreenSunrise дело говорит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 13:53 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
To GreenSunrise Возможно вы работали с другими контроллерами? Контроллеры, которые мы используем - производства фирмы PEP. В них операционна система OS9. Программировать под них можно на C,C++ и в специализированной среде IsaGraph. В контроллерах есть Flash-память, Ethernet-интерфейс и существует возможность подключения жесткого диска. Программное обеспечение АСУТП системы проедставляет из себя: 1. программы в контроллере("Первичная Переработка Информации","главный Регулятор","задача связи с сервером ввода/вывода" и др.), 2. сервер ввода/вывода(программа на PC, которая занимается передачей данных клиентам(на АРМ-ы операторов и в БД) и вниз - задачам в контроллер), 3. АРМ-ы операторов(для разработки используются Scada-системы, которые работают с "переменными") Для программиста на Scada системе ВСЕ ЕСТЬ - "переменная". Изменил значение переменной, которая является управляющим воздействием и задвижка закрылась. Связал текстовое поле с "переменной"(показание датчика) - значение этого поля будет постоянно обновляться сервером ввода/вывода. 4. БД IndustrialSQL Server( надстройка на MS SQL 7.0), который предназначен для потоковой записи данных. вот вроде и все. Я тут немного порекламировал наши средства разработки. Моя задача - конфигурирование системы. Поскольку много различных программ, то решили делать централизованную БД для хранения конфигурации компонентов системы. В свете этой задачи и был мой вопрос. А ошибки - это будет проблема. Хорошо, что тех. процесс достаточно инерционный и в случае аварии можно остановить конвейер руками, а потом разгребать навалившуюся руду лопатами. При существующей системе они делают это довольно часто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 14:38 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Мы работали с Modicon и Siemens, насколько я помню. Смысл программирования, я думаю, не меняется от марки к марке. SCADA-системы обычно понимают некоторый набор устройств и предлагают единый интерфейс для них всех. Да, как Вы и пишете, все строится на переменных; переменная - это и есть ячейка данных(регистр, бит регистра). Выставил 1 в нужном месте - лампочка загорелась, выставил 10 в другом - мотор на 10 сек. включился и т.д. У нас, кстати, такая же была общая схема - программы в контроллерах <-> сервер на PC <-> рабочее место оператора. Да ладно, эти наши обсуждения неинтересны подавляющему большинству читающих (а кроме нас и Genady сюда еще кто-нибудь забрел?). Мне хотелось только показать, что данный класс задач не решается изменением структуры БД, а требует клиентских действий, вот и все. А блокировками на уровне сиквела осторожнее балуйтесь, с оглядкой. Особенно с монопольными на таблицу целиком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 14:59 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
To Genady >1. Непонятно зачем параметры переменных хранятся в отдельных таблицах? У каждого типа переменных - параметры разные. Например у дискретных DI,DO,DM - нет границ, а у аналоговых (AI,AO,AM) они есть. У дискретных есть "признак инвертирования" - у аналоговых нет. и т.п. >2. Таблица Регуляторы денормализована, почему? Наши программисты говорят, что, например, “заданием” для регулятора может быть переменная или переменная и ее поле, поэтому параметры регулятора идут парами. “имя переменной …” “поле переменной …” Возможно, это не правильно, но полной логикой их программ не располагаю. >3. Что именно правят операторы? Операторы могут править например параметр переменной "задание". Этот параметр является заданием для какого-то регулятора, в таблице регуляторов. Таким образом они смогут повлиять на тех. процесс. Настройщики могут делать что-угодно: добавлять новые регуляторы в систему, изменять существующие. Например уровень жидкости регулировался одним клапаном, а теперь будет регулироваться другим. Genady, я думаю тема исчерпана. Однако, если хотите, могу привести скрипт основной части базы, тогда можно будет говорить о денормализации подробней. Спасибо всем, кто участвовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2001, 16:32 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
>Genady, я думаю тема исчерпана Странно, а зачем тогда вообще вопрос задавал? >Однако, если хотите, могу привести скрипт основной части базы, тогда можно будет говорить о денормализации подробней. Неа, не хочу. Не хочу разбираться в Вашей задаче, хочу только сказать, что Вы вероятно что то недопонимаете в проектировании БД, для каких бы целей она не строилась. Может я глуповат, но вот я не понимаю некоторых вещей, которые на мой взгляд мешают Вам. 1. Нельзя закладываться на то что оператор не ошибется, нельзя закладываться на это вообще, а при управлении техпроцессом тем более. 2. Вы по моему не представляете что такое целостность БД и что такое транзакция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2001, 05:13 |
|
||
|
Как заблокировать доступ к таблице?
|
|||
|---|---|---|---|
|
#18+
Знакомая задача. В области учета тоже есть схожая. Необходимо ввести либо откорректировать накладную, содержащую множество товарных позиций, которые только в полной совокупности образуют корректно оформленный документ. До момента завершения ввода всех строк накладной документ не должен влиять на состояние базы данных. Это решается просто. Вводится понятие черновик/беловик. Реализуется одним из двух способов. В таблицах, где все хранится заводится дополнительное поле (SPID коннекта пользователя). Если в нем Null - значит эта запись беловая. Если какой-нибудь SPID, значит запись находится в составе чернового документа, редактируемого в настоящий момент юзером с соответствующим SPID. Можно вместо дополнительного поля завести вспомогательную талицу, в которой формируется черновик а после завершения формирования в рпамках одной короткой транзакции переписывается в основную таблицу. Все дальнейшие соображения - по вкусу разработчика. Можно сделать так, что беловой документ будет превращаться в черновик перед его модификацией и исчезать из состава беловиков. Можно сделать так, чтобы он не исчезал из состава беловиков. Можно сделать так, что у разных пользователей может быть своя редактируемая версия черновика одного и того же документа. Можно сделать так, что до превращения имеющегося черновика в беловик (либо уничтожения черновика) второй экземпляр черновика будет создать невозможно. Можно сделать так, чтобы новый вариант документа можно было сохранить не только как новый вариант прежнего беловика, но и как просто новый беловик, созданный на базе другого беловика (с изменениями и дополнениями). Короче, бери идею и твори в меру своей фантазии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2001, 10:36 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32011732&tid=1825876]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 442ms |

| 0 / 0 |
