Ошибка SQL Server в Docker CREATE INDEX, поскольку следующие параметры SET имеют неправильные настройки: ‘QUOTED_IDENTIFIER’ - PullRequest
0 голосов
/ 06 июля 2018

У меня есть файл Docker SQL Server с моим import-data.sh, который импортирует *.sql файлы из папки sql-data. Все работает, если я запускаю файлы *.sql из такого инструмента, как Datagrip, но импорт завершается неудачно с этим сообщением об ошибке, когда он запускается автоматически.

Сообщение об ошибке:

Сообщение 1934 г., уровень 16, состояние 1, строка 4
Не удалось создать CREATE INDEX, поскольку следующие параметры SET имеют неправильные настройки: «QUOTED_IDENTIFIER». Убедитесь, что параметры SET являются правильными для использования с индексированными представлениями и / или индексами для вычисляемых столбцов и / или отфильтрованных индексов и / или уведомлений о запросах, и / или методов типа данных XML, и / или операций с пространственным индексом.

Dockerfile

FROM microsoft/mssql-server-linux:2017-latest

RUN mkdir /sql-data/
EXPOSE 1433

COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh

COPY import-data.sh /usr/src/app/
RUN chmod +x /usr/src/app/import-data.sh

# Copy SQL Scripts to sql-data for processing
COPY ./sql-data/*.sql /sql-data/

CMD /bin/bash /usr/local/bin/entrypoint.sh

entrypoint.sh

#!/bin/bash

#start SQL Server, start the script to create the DB and import the data, start the app
/usr/src/app/import-data.sh & /opt/mssql/bin/sqlservr

import-data.sh

#!/bin/bash
# wait for the SQL Server to come up https://github.com/twright-msft/mssql-node-docker-demo-app/issues/11
while [ ! -f /var/opt/mssql/log/errorlog ]
do
  sleep 2
done

## tail the error log for the startup dll and then quit
tail -f /var/opt/mssql/log/errorlog | while read LOGLINE
do
   [[ "${LOGLINE}" == *"Using 'xpstar.dll' version"* ]] && pkill -P $$ tail
done

echo "Running SQL Scripts"
# Scan for SQL files and load them in
for file in /sql-data/*.sql; do
    echo $file
    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -i $file 
done

/ SQL-данные / setup.sql

IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = 'Products')
BEGIN
    CREATE DATABASE Products;
END
GO

USE Products;
GO

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Утилита SQLCMD, к сожалению, по умолчанию имеет значение QUOTED_IDENTIFIER OFF по причинам обратной совместимости. Укажите аргумент -I, чтобы использовать QUOTED_IDENTIFIER ON.

/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -i $file -I
0 голосов
/ 06 июля 2018

В таких инструментах, как SQL Server Management Studio и Datagrip, по умолчанию включен цитируемый идентификатор. Вы должны вручную включить его в SQLCMD, изменив свои сценарии SQL на SET QUOTED_IDENTIFIER ON

Вы бы изменили свой скрипт setup.sql следующим образом:

/ SQL-данные / setup.sql

SET QUOTED_IDENTIFIER ON
IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = 'Products')
BEGIN
    CREATE DATABASE Products;
END
GO

USE Products;
GO
...