Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье перечислены известные ограничения и ограничения драйвера go-mssqldb .
LastInsertId не поддерживается
go-mssqldb Драйвер не поддерживает этот database/sqlResult.LastInsertId() метод. Вызов даёт ошибку:
LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.
Обходной путь: используйте OUTPUT клаузу в INSERT операторе или запросе SCOPE_IDENTITY() отдельно.
Множественные активные наборы результатов (MARS) не поддерживаются
Драйвер не поддерживает MARS. Каждое соединение может иметь только один активный запрос или оператор одновременно. Если нужно запускать параллельные запросы, используйте отдельные соединения от пула.
Временная область применения таблицы с пулом соединений
Поведение временной таблицы следует правилам SQL Server, но пул соединений меняет то, как это поведение проявляется в коде приложения:
- Локальные временные таблицы (
#name) ограничены одной сессией (соединением). - Глобальные временные таблицы (
##name) видны другим сессиям, пока сессия создания остаётся открытой.
С database/sql, разделяют db.Exec и db.Query вызывают могут использовать разные пуловые соединения. Локальная временная таблица, созданная в одном вызове, не видна в следующем, когда этот вызов выполняется по другому соединению.
Для глобальных временных таблиц видимость между соединениями работает как ожидалось, но жизненный цикл и коллизии имен всё равно требуют внимания при одновременной нагрузке.
Рекомендации: используйте db.Conn(ctx) для закрепления связанных операций с одним соединением или обёртки операций в транзакции. Глобальные временные таблицы используйте только тогда, когда требуется видимость между сессиями.
Для шаблонов реализации см. Временные таблицы и хранящиеся процедуры, Пул соединений и Временная таблица не найдена.
Всегда зашифрованные ограничения
- Массовое копирование с зашифрованными столбцами: Драйвер не поддерживает операции массового копирования таблиц с всегда зашифрованными столбцами.
- Защищённые анклавы: драйвер не поддерживает Always Encrypted с защищёнными энклавыми.
-
Регистрация провайдера: необходимо импортировать пакет ключевого провайдера (
localcert,akv) как импорт побочных эффектов. Без него драйвер не сможет расшифровать данные. -
Точное сопоставление типов параметров: Зашифрованные параметры должны точно совпадать с типом столбца SQL Server. По умолчанию Go
stringстановитсяnvarchar, что может не работать против более специфических зашифрованных типов параметров. -
Зашифрованные
charиvarcharтекстовые данные: вставки и обновления по зашифрованиюcharилиvarcharколонкам в настоящее время ограничены. Предпочитайте зашифрованныеncharилиnvarcharстолбцы, если для текстовых данных нужен Always Encrypted.
Старые версии SQL Server и TLS
Старые, не поддерживающие версии SQL Server могут не поддерживать TLS 1.2 или более поздние. При подключении к этим версиям с encrypt=true, соединение может прерваться, если сервер не сможет договориться о совместимой версии TLS.
Обходной путь: используйте encrypt=false или обновите до поддерживаемой версии SQL Server.
Устаревшее имя драйвера mssql
Имя mssql водителя (используемое с sql.Open("mssql", ...)) устарело. Используйте sqlserver вместо этого:
// Deprecated
db, err := sql.Open("mssql", connString)
// Recommended
db, err := sql.Open("sqlserver", connString)
Имя mssql драйвера выполняет замену токенов параметров, преобразуя ? заглушки в @p1, @p2и аналогичные порядковые имена. Имя sqlserver драйвера требует явных именованных параметров и обеспечивает более предсказуемое поведение.
Если вам нужно использовать на sql.OpenDB основе коннектора и временно сохранять поведение переписки текста с устаревшим запросом, используйте NewConnectorWithProcessQueryText. Для нового кода предпочитайте sqlserver имя драйвера и явные параметры.
Столбцы уникального идентификатора
Драйвер по умолчанию возвращает uniqueidentifier значения столбцов в виде сырых []byte массивов. Используйте mssql.UniqueIdentifier как пункт сканирования для получения стандартных строк в формате GUID.
Нет совместимости с ODBC
Драйвер — чисто реализация Go и не использует и не зависит от UnixODBC, FreeTDS или драйвера Microsoft ODBC. Специфичные для ODBC функции (конфигурация DSN, трассировка ODBC) недоступны.
Именованные трубопроводные соединения
Именованные соединения труб могут требовать определённых разрешений файловой системы на конечной точке трубы. В Linux SMB-клиент должен быть настроен для доступа по именованому каналу.
Точность поплавков
Тип Го float64 содержит примерно 15–16 значимых десятичных знаков. SQL Server decimal и numeric типы могут представлять до 38 цифр точности. При сканировании decimal/numericстолбцов в float64, может происходить потеря точности для значений с более чем 15 значимыми цифрами.
Обходной путь: сканируйте decimal/numeric столбцы и string используйте стороннюю десятичную библиотеку, такую shopspring/decimal как (github.com/shopspring/decimal) или cockroachdb/apd (github.com/cockroachdb/apd), для точной арифметики. Для паттернов см. Отображения типов данных.