Машинопись: Что такое тип URL?

Попробуйте изменить LIKE на ALIKE и ваши подстановочные знаки от * до %.

Механизм базы данных доступа (Jet, ACE, любой) имеет два запроса ANSI Режимы , каждый из которых использует разные подстановочные знаки для LIKE:

  • Режим запроса ANSI-89 использует *
  • Режим запроса ANSI-92 использует %

OLE DB всегда использует ANSI-92 Query Mode. DAO всегда использует режим запросов ANSI-89. Пользовательский интерфейс доступа может быть настроен на использование того или другого.

Однако при использовании ключевого слова ALIKE символ подстановки всегда % независимо от режима запросов ANSI.

Рассмотрим бизнес-правило, которое содержит элемент данных, должно состоять из ровно восьми числовых символов. Скажем, я применил правило следующим образом:

CREATE TABLE MyStuff 
(
 ID CHAR(8) NOT NULL, 
 CHECK (ID NOT LIKE '%[!0-9]%')
);

Неизбежно, что я использовал бы % в качестве подстановочного символа, потому что ограничения типа данных CHAR Access [] и CHECK могут быть созданы только в ANSI -92 Режим запроса.

Однако кто-то может получить доступ к базе данных с помощью DAO, который всегда использует режим запросов ANS-89, а символ % будет считаться буквальным, а не «специальным» символом, и следующий код может быть выполнен:

INSERT INTO MyStuff (ID) VALUES ('%[!0-9]%');

вставка будет успешной и моя целостность данных будет снята: (

То же самое можно сказать, используя LIKE и * в правиле проверки, созданном в режиме запросов ANSI-89, и тем, кто подключается с использованием ADO, который всегда использует режим запросов ANSI-92, а INSERT - символ *, где символ * не должен быть.

Насколько я знаю, нет способа установить, какой режим запроса ANSI используется для доступа к базе данных Access. Поэтому я считаю, что весь SQL должен кодироваться, чтобы вести себя независимо от ANSI Query M ode, выбранный пользователем.

Обратите внимание, что это не слишком сложно для кода для использования с использованием LIKE с приведенным выше примером, например.

CHECK (
       ID NOT LIKE '%[!0-9]%'
       AND ID NOT LIKE '*[!0-9]*'
      )

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

CHECK (ID LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

Однако использование ALIKE приведет к уменьшению количества подробного кода, то есть более легкого для читателя, и, следовательно, его легче поддерживать.

Кроме того, когда придет время на порт для SQL-продукта, соответствующего стандартам SQL, ALIKE порты тоже, т. е. преобразование ключевого слова ALIKE в LIKE - это все, что требуется. При анализе заданного предиката SQL гораздо легче найти одно ключевое слово LIKE, чем найти все несколько экземпляров символа * в текстовых литералах. Помните, что «портативный» не означает, что «код будет работать» как есть »; скорее, это показатель того, насколько легко переносить код между платформами (и помнить, что перемещение между версиями одного и того же продукта является портом, например, Jet 4.0 для ACE является портом, поскольку безопасность уровня пользователя больше не функционирует, DECIMAL значения сортируются по-разному и т. д.).

19
задан user130685 5 July 2016 в 07:00
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: