Сообщение 7321 уровень 16 состояние 2

Обновлено: 03.05.2024

Сервер: MSG 7357, Level 16, состояние 2, строка 1 не может обработать объект "Update testlinked Set SSN = SSN". Поставщик OLE DB "SQLOLEDB" для связанного сервера "ИмяСервера" указывает на то, что у объекта нет столбцов или у текущего пользователя нет разрешений на доступ к этому объекту.

Причина

Для применения OPENQUERY требуется возвращаемый набор результатов, но инструкции UPDATE, DELETE и INSERT, используемые с OPENQUERY , не возвращают результирующий набор.

Обходное решение

Эту проблему можно обойти следующими способами:

Для выполнения операций вставки, обновления и удаления используются имена из четырех частей (linked_server_name. catalog. Schema. object_name).

Как описано в книге SQL Server Books Online, создайте ссылку на функцию OPENQUERY как целевую таблицу инструкции INSERT, UPDATE или DELETE в соответствии с возможностями поставщика OLE DB. В следующих запросах показано правильное использование поставщика OLE DB для SQL Server:

Примечание. В инструкции INSERT используется предикат WHERE 1 = 0, чтобы исключить получение данных с удаленного сервера, что может привести к снижению производительности. Кроме того, для операций обновления и удаления существуют особые требования к индексам; подробные сведения приведены в разделе "Дополнительные сведения".

Дополнительная информация

Требование уникального индекса

Это применимо как к OPENQUERY , так и к четырем операциям Update и Delete из четырех частей. Проблему можно устранить, добавив уникальный индекс в удаленной таблице.

Динамическое выполнение с помощью OpenQuery

Иногда желательно использовать динамический запрос для достижения того же эффекта с помощью OPENQUERY, как показано в следующем примере:

После попытки установки очередного апдейта просграммы она ругнулась на базу с вот такой ошибкой

[Microsoft][ODBC SQL Server Driver][SQL Server]SQL Server обнаружил логическую ошибку
ввода-вывода, связанную с согласованностью: неверная контрольная сумма (ожидаемая
0x5428a3bc; фактическая 0x4b67e4cf). Она произошла при прочитать страницы (1:73248
) в базе данных с идентификатором 7 по смещению 0x00000023c40000 файла "D:\BASES\sklad.DAT". Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных
событий. Это серьезная ошибка, которая угрожает целостности базы данных и должна
быть немедленно исправлена. Выполните полную проверку базы данных на согласованность
(DBCC CHECKDB). Эта ошибка может быть вызвана многими причинами; дополнительные сведения
см. в электронной документации по SQL Server.

Проверка отменена. В процессе сбора фактов была обнаружена ошибка. Возможно, база данных tempdb достигла предела памяти, или системная таблица не согласована. Проверьте предыдущие ошибки.

Не удалось получить набор строк схемы поставщика OLE DB "SQLNCLI10" связанного сервера "(null)"

Среда: SqlServer2008 x64 + SqlServer2000 x86.

При соединении SqlServer2000 x86 с SqlServer2008 x64 появляется следующая ошибка.

Обновите Sql2000 до SP4, затем найдите Instcat.sql этот файл, откройте его, скопируйте содержимое в анализатор запросов и выполните.

Интеллектуальная рекомендация


Тема ------ Thread Dead Block Причина, метод Discovery Line Dead Lock, как избежать резьбы мертвого блокировки

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


CSS --- Настройки стиля полосы прокрутки


Используйте pip install в блокноте Jupyter для установки сторонних пакетов Python (возьмите в качестве примера matplotlib)

В одном предложении дается краткое описание установки ноутбука Jupyter (подходит для более озабоченных читателей) Как использовать: вpip install -[Package]Добавить один перед!Просто, например, если вы.


Изучение задач, связанных с программированием баз данных на платформе MS SQL Server.

суббота, 30 августа 2014 г.

Особенности в работе функции openrowset

Как известно для запросов к Excel-файлам можно использовать функцию openrowset. Проверим работу этой функции на примере. Создадим файл 1.xlsx с таким содержанием:



Сохраним файл на рабочем столе. Убедимся в том, что сервер видит его:
exec xp_fileexist 'C:\Users\В\Desktop\1.xlsx'


Теперь попробуем сделать к нему запрос:

Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)" сообщил об ошибке. Поставщик не предоставил данных об ошибке.

Не удалось получить строку от поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)".

Разберемся с причиной ошибки. Изначально я подключился к серверу на основе своей учетной записи Windows. При этом вхожу в роль sysadmin. Теперь подключимся на основе учетной SQL Server, под логином sa. Запускаем запрос и он успешно возвращает данные:



Оказывается, когда мы запускаем запрос то его результаты сохраняются в файле, который находится в директории переменной окружения temp или tmp. Посмотрим что это за директория. Для этого откроем список переменных среды:



Откроем папку C:\Users\В\AppData\Local\Temp и отсортируем ее содержимое по дате модификации. Сверху есть файл с именем tmp3BED.tmp. Откроем его при помощи Notepad:


В нем как раз результаты нашего запроса. Теперь можно сделать вывод, что при запуске openrowset с провайдером ACE под учетной записью Windows доступ к этой директории осуществляется именно при помощи учетной записи Windows. Если же мы подключаемся к серверу под учетной записью SQL Server, то доступ в Temp выполняется под учетной записью службы сервера. Если у учетной записи не хватает прав на работу с файлами, содержащими результаты работы запросов, то возникает ошибка.

понедельник, 25 августа 2014 г.

Получить состояние таблицы на определенное время

В MS SQL 2008 появилось новое средство слежения за данными: cdc, change data capture - отслеживание измененных данных. Этот механизм позволяет логировать изменения в таблице. Наибольший интерес представляет лог операций insert, update, delete. Однако кроме этого можно отслеживать и изменения в структуре таблицы. Рассмотрим на примере какие возможности есть у cdc и как с их помощью можно получить снэпшот таблицы на любой момент времени. Создадим для тестирования отдельную базу данных:

Создадим таблицу, которую мы наполним тестовыми данными:

Для включения cdc сперва требуется разрешить его на уровне всей базы. Для этого запускаем такой код:
exec sys . sp_cdc_enable_db

Теперь можно проверить, что для базы данных включено cdc:

where name = db_name ()

Следующим шагом нужно включить cdc на уровне таблицы:

@captured_column_list = 'i, k'

Когда процедура завершает работу, то для таблицы dbo.Logg создается специальная системная таблица, в которой фиксируются изменения от операций dml. Эта таблица содержится в создаваемой также схеме cdc. В этой схеме есть также таблица ddl_history для учета изменений в структуре таблицы. Также в схеме есть различные системные функции для просмотра информации об изменениях в таблице. Лучше пользоваться ими вместо запросов к системным таблицам.
Автоматически создается и роль (параметр @role_name), члены которой имеют доступ на просмотр информации об изменениях.
Параметр @filegroup_name отвечает за то, в какой файловой группе будет храниться лог изменений. В параметре @captured_column_list задается перечень столбцов, изменения в которых будут отслеживаться (по умолчанию null, то есть отслеживаются все столбцы).

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

Можно найти все таблицы, для которых включено cdc с помощью такого запроса:

where is_tracked_by_cdc = 1

Когда cdc включается для базы, то в SQL Agent создаются два задания: cdc.Watcher_capture, cdc.Watcher_cleanup. Первый следит за журналом транзакций для логирования изменений, второй - выполняет периодически очистку данных логов. По умолчанию история изменений хранится трое суток. При необходимости очистку можно выполнять самостоятельно с удобной для Вас прериодичностью. Для этого можно воспользоваться хранимой процедурой sys.sp_cdc_cleanup_change_table. Например, можно сделать такой вызов:
exec sys . sp_cdc_cleanup_change_table @capture_instance = 'Watcher' , @low_water_mark = 0x00000035000000A00006

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

Читайте также: