Вы не можете помешать владельцу стола сбросить триггер на нем, если вы не хотите писать для этого триггер события.
Возможно, вам следует использовать другую концепцию разрешений, в которой вы предоставляете людям только ограниченные привилегии, если вы хотите, чтобы они не сбрасывали ваши триггеры. Вместо того, чтобы позволять другим владеть таблицами, предоставьте другим привилегии на таблицы.
Первое правило состоит в том, что пользователям разрешают указать значения в SQL-выражениях, но не синтаксис SQL. Весь синтаксис запроса должен быть буквально указан Вашим кодом, не вводом данных пользователем. Значения, которые указывает пользователь, могут быть предоставлены SQL как параметры запроса. Это - самый эффективный способ ограничить риск Внедрения SQL.
Много приложений должны "создать" SQL-запросы через код, потому что, как Вы указываете, некоторые выражения, соединения таблицы, порядок по критериям, и так далее зависят от выбора пользователя. При создании части SQL-запроса частью иногда трудно гарантировать, что результатом является допустимый синтаксис SQL.
Я работал над названным классом PHP Zend_Db_Select
это обеспечивает API для помощи с этим. Если Вам нравится PHP, Вы могли бы посмотреть на тот код для идей. Это не обрабатывает вообразимого запроса, но это делает много.
Некоторые другие платформы базы данных PHP имеют аналогичные решения.
Хорошо опции должны отобразиться на что-то.
Строка SQL-запроса CONCAT
не проблема, если Вы все еще используете параметры для опций.
Хотя не общее решение, вот некоторые шаги, которые можно сделать для смягчения динамической все же безопасной проблемы запроса.
Критерии, в которых значение столбца принадлежит множества значений, кардинальность которого произвольна, не должны быть динамичными. Рассмотрите использование или функции instr или использования специальной таблицы фильтрации, в которой Вы присоединяетесь против. Этот подход может быть легко расширен на несколько столбцов, пока число столбцов известно. Фильтрация на пользователях и тегах могла легко быть обработана с этим подходом.
Когда число столбцов в критериях фильтрации будет произвольно все же маленькое, рассмотрите использование различных статических запросов для каждой возможности.
Только, когда число столбцов в критериях фильтрации произвольно, и потенциально большой должен Вы рассматривать использование динамических запросов. В этом случае...
Чтобы быть безопасной от Внедрения SQL, или создать или получить библиотеку, которая защищает от того нападения. Хотя более трудный, это не невозможная задача. Это главным образом о выходе из строковых разделителей SQL в значениях для фильтрации для.
Для сейфа от дорогих запросов рассмотрите использование представлений, которые особенно обрабатываются с этой целью и некоторая честная логика, чтобы ограничить, как те представления будут вызваны. Это является самым сложным с точки зрения времени разработчика и усилия.
Если бы Вы использовали Python для доступа к базе данных, то я предложил бы, чтобы Вы использовали систему модели Django. Существуют многие подобная пчела и для Python и для других языков (особенно в рубине на направляющих). Я экономлю так много времени путем предотвращения потребности говорить непосредственно с базой данных с SQL.
#Model definition
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __unicode__(self):
return self.name
Образцовое использование (это - эффективно оператор вставки),
from mysite.blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
Запросы становятся намного более сложными - Вы раздаете объект запроса, и можно добавить фильтры / элементы вида к нему. Когда Вы наконец готовы использовать запрос, Django создает SQL statment, который отражает все способы, которыми Вы скорректировали объект запроса. Я думаю, что это является очень милым.
Другие преимущества этой абстракции