Что сделать чтобы пользователь не подвесил бд
Перейти к содержимому

Что сделать чтобы пользователь не подвесил бд

  • автор:

MySQL: Как избежать того, чтобы пользователь даже видел, что у меня есть другие БД, и предоставить выборочный доступ к одному представлению в одной БД?

У меня на моем сервере несколько БД, и мне нужно разрешить одному пользователю выбирать записи из представления в одном из БД. Но мне нужно, чтобы этот пользователь даже не видел, что есть другая БД, и не вижу, что в базе данных есть другие таблицы. Это возможно?

У меня была учетная запись с хостинговой компанией, учетной записью с общим хостингом, и я мог видеть только свою БД, когда я обращался к ней через phpmyadmin. Это похоже на то, что мне нужно. Спасибо за помощь.

2 ответа

Я нашел обзор, содержащийся в этой статье, еще более полезным, чем фактическая документация MySQL для описания общей картины того, как предоставлены или запрещены привилегии MySQL.

Суть обзорной статьи заключается в том, что привилегии контролируются рядом все более тонких таблиц разрешений в базе данных mysql : mysql.user , mysql.db , mysql.host , mysql.tables_priv , mysql.columns_priv , mysql.procs_priv . Общее правило заключается в том, что значение «Y» для привилегии в более мелкозернистой таблице перекрывает значение «N» в более крупнозернистой таблице. Поэтому рекомендуемая стратегия заключается в том, чтобы отказаться от большинства привилегий в user таблице (которая дает самый грубый контроль), а затем сделать только определенные переопределения, которые вы хотите, в более мелкозернистых таблицах.

В частности, существует привилегия SHOW_DATABASES, которая определяется Show_db_priv в таблице mysql.user ; вы должны установить это значение «N» для данного пользователя (и, как описано выше, вы можете установить большинство других разрешений в таблице пользователя на «N»), а затем предоставить только привилегии, которые пользователь на самом деле нужно в mysql.db или mysql.tables_priv или в любом случае, подходящем для вашего конкретного случая.

Вы должны добавить пользователя в базу данных, используя привилегии гранта.

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

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

Блокировка доступа к данным в SQL Server

Иногда возникает необходимость ограничения доступа ряду сотрудников к определенной информации, хранящейся в базе банных. Я предлагаю познакомиться с одной из функций SQL Server, которая позволяет контролировать доступ к уровню строк в таблице базы данных в зависимости от пользователя, выполняющего запрос.

Безопасность на уровне строк (Row-Level Security, RLS) ограничивает пользователей таким образом, чтобы они могли работать исключительно с теми данными, к которым у них имеется доступ. Кроме того, данная функция не дает возможности пользователям вставлять, обновлять или удалять данные, доступ к которым запрещен.

Давайте рассмотрим, как можно использовать функцию Row-Level Security на примере условной таблицы, назовем ее ObjectCheck, в которой отражена информация об объектах аудита, сроках начала и завершения проверок и т.д.

Перед нами поставлена задача: каждый пользователь базы данных должен получить доступ к данным, относящимся только к нему, без доступа к проверкам, назначенным другим сотрудникам.

Для выполнения примера создадим трех пользователей базы данных:

предоставим доступ select к таблице ObjectCheck для этих пользователей:

Кроме того, желательно создать отдельную схему для объектов базы данных Row-Level Security:

Ограничение доступа к данным с использованием Row-Level Security достигается путем определения предиката безопасности (Security predicate) как функции, которая ограничивает строки на основе логики фильтрации, которая вызывается и применяется политикой безопасности (Security Policy), созданной с помощью T-SQL оператора create security policy, и работает как контейнер предикатов.

Давайте выполним настройку функции безопасности на уровне строк для таблицы ObjectCheck.

Создаем функцию, зависящую от пользователей, вошедших в систему, чтобы была возможность фильтровать пользователей и проверять их доступы к данным:

Создадим политику безопасности в таблице ObjectCheck, используя ранее созданную функцию предиката:

Теперь защита на уровне строк настроена и готова к фильтрации доступа к данным в таблице ObjectCheck.

Так, если выполнить запрос, указав пользователя Ivanovii:

то запрос вернет только две записи, связанные с пользователем Ivanovii:

Аналогичный результат будет возвращен при запросе данных из таблицы ObjectCheck пользователями PetrovPP и SidorovSS:

Из приведенных примеров видно, что функция безопасности на уровне строк может использоваться для фильтрации данных, которые может видеть каждый пользователь, в зависимости от критериев фильтрации, определенных в функции предиката.

Если необходимо прекратить использование функции безопасности rs.fn_SecureData, то можно отключить политику безопасности Object_Check с помощью инструкции ALTER security policy:

Затем выполнить запрос DROP для удаления функции и политики безопасности:

Теперь безопасность на уровне строк полностью удалена из таблицы Object_Check.

Можно легко добавлять предикаты и критерии фильтрации, подходящие для определенных ситуаций, однако, слишком сложные предикаты ухудшают производительность базы данных, поскольку предикат будет проверяться каждый раз при выполнении доступа к данным. Более подробно ознакомиться с Row-Level Security можно на сайте Microsoft.

Схемы блокировок в Базах Данных

При работе с Базами Данных в многопользовательском режиме возникают ситуации, когда необходимо ограничить число обращающихся пользователей к данным. Это делается для того, чтобы предотвратить одновременное обновление одной и той же записи, при глобальном обновленим данных или при техническом обслуживания самой Базы Данных.

Процессор Баз Данных обеспечивает три уровня блокировок:

* Блокировка Базы Данных. На этом уровне блокировки к Базе Данных может обращаться только один пользователь. Такой уровень блокировки применяется для глобального изменения или обновления данных или при техническом обслуживании Базы Данных- сжатии;
* Блокировка Таблицы. На этом уровне блокировки к таблице может обращаться только один пользователь. Такой уровень блокировки применяется в тех случаях, когда необходимо обработать сразу несколько записей таблицы.
* Блокировка страницы. На этом уровне к заблокированной странице может обращаться только один пользователь. Это самый нижний уровень блокировки.

Блокировка Базы Данных

Блокиривка на уровне Базы Данных осуществляется присвоением свойству exclusive, при открытии БД, значения true. При использовании вами элемента управления data, в его свойствах установите exclusive = true . Если же вы используете объект dao, то при присвоении значения объекту db установите в true значение второго параметра метода opendatabase:

Когда База Данных заблокирована таким образом, тодругие пользователи не смогут ее открыть. При попытке обращения к заблокированной Базе Данных вы получите сообщение:

Одновременно с этим генерируется перехватываемая ошибка – 3045, используя которую вы можете завершить программу, которая обращается к заблокированной Базе Данных, т.к. после возникновения ошибки программа продолжает выполняться, хотя База Данных так и не была открыта.
При использовании элемента управления data в обработчик события error вставляется следующий код:

При использовании объекта dao в той процедуре, где будет стоять код открытия Базы Данных, вставляется обработчик ошибок:

Блокировка Таблицы

Блокировка на уровне таблицы применяется при глобальных изменениях в отдельно взятой таблице. После того как вы проведете ваши изменения и закроете эту таблицу, толкко тогда к ней получат доступ другие пользователи. . При использовании вами элемента управления data, в его свойствах установите exclusive = false, для того, чтобы пользователи имели доступ к Базе Данных, а свойствu option присвойте значение 3. Это приведет к томы, что выбранная вами таблица (к примеру authors) будет открыта с параметрами denywrite(1) и denyread(2), что запрещает другим пользователям открывать эту таблицу во время действия вашей программы. При попытке обращения к заблокированной таблице вы получите сообщение:
“couldn’t lock table ‘authors’;currently in use by user ‘admin’ on machine ‘user-0000011660’ “
“Невозможно зблокировать таблицу ‘authors’ , т.к. она используется администратором машины ‘user-0000011660’ “

Одновременно с этим генерируется перехватываемая ошибка – 3265, используя которую вы можете завершить программу, которая обращается к заблокированной таблице, т.к. после возникновения ошибки программа продолжает выполняться, хотя таблица так и не была открыта. При использовании элемента управления data в обработчик события error вставляется следующий код, но предварительно дополняя предыдущий:

Если же вы используете объект dao, то при присвоении значения объекту db установите в false значение второго параметра метода opendatabase:
set db = dbengine.opendatabase(“c:biblio.mdb”, false)
а, при присвоении значении объекту recordset:
set rs = db.openrecordset(“authors”, dbopentable, dbdenyread + dbdenywrite)

Для перехвата возникающей ошибки опять ставте код:

Здесь указан только обработчик ошибки открытия блокированной таблицы, т.к. Базу Данных вы можете открыть в другой процедуре , в отличае от элемента data.
Внимание! Если вы откроете приложении access в то время, когда у вас стоит блокировка таблицы (во время работы вашей программы), то данная таблица открывается без извещения вас диалоговым окном о том, что таблица заблокирована. Но, при всем желании вы не сможете сделать запись или произвести редактирование какой либо записи.

Блокировка страницы

Самым нижнем уровнем блокировки является уровень таблицы. Процессор microsoft jet автоматически устанавливает блокировку страницы и не может контролироваться вашей программой. Страница данных может содержатьнесколько записей, размер его равен 26 кб. Блокировка страницы означает блокировкувсех записей, находящейся на этой странице. Если длина записи – 512 байтов, то будет заблокированно 4 записи, а если 50 байтов то 40 записей. Точное число записей нельзя заранее ни определить ни задать, т.к. таблица может содержать удаленные записи (которые удаляются только во время уплотнения). Но, не смотря на это объект recordset имеет свойство lockedits, которое позволяетуправлять страничной блокировкой из программы.
Блокировка на уровне таблицы имеетдва режима – пессимистический (lockedits ю true) и оптимистический (lockedits = false). По умолчанию устанавливается пессимистическая блокировка.
Пессимистическая блокировка блокирует страницу при вызове методов edit и addnew, и остается заблокированной до тех пор пока не будетвыполнен метод update или cancelupdate. В течении всего времени ни одна программа не имеет доступа к забликированной странице.
Преимущества. Обеспечивается максимально возможныйуровень целостности данных.
Недостатки. Страница может быть заблокирована в течении продолжительного времени.
Оптимистическая блокировка блокирует страницу только при вызове метода update. Это означает, что пользователь вызывает методы edit и addnew, производит действия с дсанными, и только в момент сохранения обновления процессор microsoft jet пытается заблокировать страницу. Если все проходит успешно, то запись попадает в таблицу, но если обнаружится, что эта запись уже была отредактированна, то обновление отменяется и пользователь получаетсообщение о том, что данные были уже кем-то изменены.
Преимущества. Страница блокируется на минимально возвожное время, тен самым уменьшаетсячисло сообщений о блокировках.
Недостатки. Может привести к ошибкам блокировки при одновременном редактировании записи двумя пользователями, когда они будут проводить обновление.
Програмно это осуществляется следующим образом:

* для элемента data — data1.recordset.lockedits = true (или false);
* для объекта dao – rs.lockedits = true (или false);

При работе с пессиместической и оптимистической блокировкой используется вызов idle. Этот метод приостанавливает выполнение программы на visual basic на время обнавления динамических и статических наборов, которые были открыты этой программой. Вызов этого метода гарантирует, что в вашу программу попадут самые последние изменения в наборе данных.
Програмно это осуществляется следующим образом:

Защита от редактирования записей/полей таблиц в Access

Защита таблиц от редактирования от пользователей
У меня есть форма с авторизацией, где пользователь и администратор входят и должны вести пароль.

Защита базы данных Microsoft Access и её таблиц
— Защита базы данных Microsoft Access и её таблиц, запросов, форм, отчетов и макросов средствами.

Запрос на удаление из полей нескольких таблиц не пустых записей
Пробовал составить правильно данный запрос (каскадное удаление включено. так-что должны.

Автоматическое создание таблиц из наименований таблиц, имен полей, типов полей
Форумчане, доброго времени суток! Есть таблица в которую автоматом выгрузили имена всех таблиц.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *