Какие символы допустимы в имени базы данных SQL Server? - PullRequest
48 голосов
/ 17 ноября 2010

Мы собираемся предоставить нашим клиентам инструмент, который (среди прочего) создает новую базу данных SQL Server, и я хочу иметь возможность выполнять базовую проверку имени базы данных, которое они предоставляют.Документация по SQL Server объясняет, какие символы допустимы в имени базы данных.Однако документация явно неверна, поскольку я могу успешно создавать базы данных, имена которых нарушают документированные правила.

В соответствии с документацией SQL Server для CREATE DATABASE , имена баз данных должны соответствовать правилам дляидентификаторы;и правила для идентификаторов зависят от уровня совместимости базы данных.Когда уровень совместимости равен 100 (что, согласно SQL Server Management Studio, означает «SQL Server 2008»), имя должно начинаться с буквы Unicode, _, @ или #;за которыми следуют одна или несколько букв, цифр, @, $, # или _.В документации четко указано, что встроенные пробелы или специальные символы недопустимы.

Это противоречит имеющимся доказательствам, поскольку я могу использовать SQL Server Management Studio для создания базы данных с именем This & That | "Other" -который не только содержит встроенные пробелы (явно запрещенные), но и содержит специальные символы (|, "), которые даже не допустимы в имени файла.Я проверил, и уровень совместимости базы данных действительно равен «SQL Server 2008 (100)», хотя на этом уровне совместимости задокументировано, что его имя недопустимо.

Черт, я даже могу сделать CREATE DATABASE " " (да(это один пробел), который доказывает, что первый символ не должен быть буквой, подчеркиванием, знаком или знаком фунта.

Так что я думаю, что мой вопрос в том, чтосимволы допустимы в имени базы данных SQL Server?Существуют ли документированные правила, которые соответствуют фактическому поведению SQL Server?

Ответы [ 4 ]

28 голосов
/ 17 ноября 2010

правила для идентификаторов состояние в конце:

Когда идентификаторы используются в инструкциях Transact-SQL, идентификаторы, которые не соответствуют этим правилам, должны быть разделеныдвойные кавычки или скобки.

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

Если соблюдаются правила для обычных идентификаторов, вы можете использовать имя вашей базы данных без кавычек / скобок.

Следующие инструкции в порядке

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

, но не

CREATE DATABASE This & That | "Other"

РЕДАКТИРОВАТЬ:

Я согласен, что это не так, как можно понять связанные документы: Что означает должны соответствовать правилам для идентификаторов означает, что правила больше не применяются каккак только идентификатор приложен?Вопрос о включении несоответствующих идентификаторов должен быть частью правил.

10 голосов
/ 17 ноября 2010

Существует разница между обычными идентификаторами и идентификаторами с разделителями. Обычный идентификатор связан с упомянутыми вами ограничениями, в то время как идентификатор с разделителями может содержать любые символы (кроме разделителя).

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

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

create database db_name

С разделителями вы можете использовать практически все:

create database "That's a funny name, isn't it?"

create database [)(/%Q)/#&%¤)Q/#)!]
7 голосов
/ 17 ноября 2010

Лично я бы ограничил их алфавитом и цифрами и ничем иным (ну, возможно, также _). Без пробелов, без забавных символов, без возврата каретки и т. Д. Это самое безопасное, что вы можете сделать.

4 голосов
/ 15 ноября 2013

Имена с разделителями, заключенные в квадратные скобки или двойные кавычки (если для QUOTED_IDENTIFIER установлено значение ON), могут содержать в основном все, кроме самих разделителей. Можно даже использовать разделители в имени с некоторой логикой escape. Обратите внимание, что экранировать должен только закрывающий escape-символ. В первом примере, приведенном ниже, единственный экземпляр открывающего escape-символа в имени не нужно экранировать, тогда как закрывающий escape-символ необходимо экранировать (заменяя единственный экземпляр двумя). Я предполагаю, что логика здесь в том, что любой код, который анализирует эти операторы, ищет закрывающий escape-символ и не заинтересован во вложенных открывающих escape-символах.

  • [Тест [Тест] -> Тест [Тест
  • [Тест]] Тест] -> Тест] Тест

Ниже приведено описание правил, связанных с именами идентификаторов без разделителей (без кавычек) в SQL Server 2012. Это выдержка из документа Руководство по переходу с MySQL на SQL Server 2012 .

Имена объектов схемы

В SQL Server 2012 имя объекта может содержать до 128 символов.

Имена без кавычек должны соответствовать следующим правилам:

  • Первый символ должен быть буквенно-цифровым, подчеркиванием (_), знаком at (@) или знаком числа (#).
  • Последующие символы могут включать буквенно-цифровые символы, знак подчеркивания, знак at (@), знак числа или знак доллара.
  • Идентификатор не должен быть зарезервированным словом Transact-SQL. Руководство по переходу с MySQL на SQL Server 2012 8
  • Встроенные пробелы или специальные символы недопустимы.

Идентификаторы, начинающиеся с символа @ или числа, имеют специальные значения. Идентификаторы, начинающиеся с @, являются именами локальных переменных. Те, которые начинают со знаком числа являются временными именами таблиц.

Чтобы заключить имя идентификатора в Transact-SQL, вы должны использовать квадрат скобки ([]).

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