2009-04-21 1 views
2

У меня есть приложение Access 2003, которое подключается к SQL Server 2000.Каков наилучший способ постоянно отмечать запись как доступную только для чтения?

У меня есть таблица, в которой мне нужно зафиксировать запись вместе со всеми связанными записями в разных таблицах. Под «блокировкой» я имею в виду отметить их как только для чтения, чтобы ни один клиент не мог редактировать эти записи, если администратор не разблокирует их.

Любые идеи?

+1

Что вы подразумеваете под «блокировкой вниз»? Постоянно препятствовать его изменениям? Или не позволяйте кому-либо другому меняться в течение короткого периода времени, пока вы делаете операцию на нем? –

+1

Больше постоянного замка. Конечный пользователь не должен иметь возможность редактировать записи после блокировки. Тем не менее, у администратора должен быть способ разблокировать его. В настоящее время у меня есть скрытое поле бит в моей основной таблице, которое устанавливается, когда запись заблокирована, но у меня возникают проблемы с определением наилучшего способа блокировки связанных записей. – DoubleJ92

+0

Я отредактировал вопрос, чтобы было ясно, что вы имеете в виду постоянный замок. Некоторые люди, читающие это, предположили, что вы имели в виду временную блокировку на уровне строк. Надеюсь, это поможет вам получить лучшие ответы. – JosephStyons

ответ

3

Скорее всего, нет «элегантного» способа сделать это на уровне базы данных. Но есть несколько путей, которые вы могли бы сделать.

  1. Добавить «заблокированное» поле бит в каждую таблицу и «блокировать» родительское каскадное это значение.
  2. В сочетании с # 1 добавьте триггер при обновлении и удалении, если флаг установлен, вы можете отменить обновление или удалить.

Это единственный реальный простой способ обеспечить его соблюдение на уровне дБ, о котором я могу думать.

0

Предполагая, что ваши данные находятся на SQL Server, я бы использовал, по возможности, безопасность SQL Server. Обычно мы не разрешаем доступ к таблицам, а затем контролируем их через SP. У SP может быть более сложная логика, чтобы определить, должна ли проходить конкретная операция.

Если это не вариант, вы всегда можете использовать триггеры, проверять строки и отказывать в обновлении или удалять этот путь.

Существует много способов кожи этой кошки.

0

Еще один вариант, чтобы бросить там:

  • Добавить last_updated столбец в таблицу, которая обновляется с помощью обновления спускового
  • Создать таблицу, Locked_Widgets (или любой другой), который просто рК базовой таблицы и LAST_UPDATED колонки и весь набор столбцов составляют PK в Locked_Widgets
  • Помещенный не-каскадный внешний ключ из базовой таблицы в Locked_Widgets

Если кто-то попытается обновить строку, триггер попытается обновить последний_описанный столбец, а ограничение внешнего ключа приведет к сбою обновления.

Смежные вопросы