Showing posts with label MS SQL. Show all posts
Showing posts with label MS SQL. Show all posts

Monday, October 5, 2015

MS SQL Server. Ошибка OLE DB provider SQLNCLI11 for linked server unable to begin a distributed transaction

​Проблема:
Есть два SQL сервера. На одном из них (local) настроен Linked Server на другой сервер (remote). На local сервере создали триггер для таблицы. И в этом триггере есть запрос через Linked Server на remote SQL сервер. При попытке вызова триггера выдается ошибка "The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "<linked_server>" was unable to begin a distributed transaction."
Решение:
Необходимо на обоих SQL серверах настроить службу Distributed Transaction Coordinator. Инструкция по настройке и рекомендуемые параметры для Windows Server 2008 описаны в статье Microsoft Technet Enable Network DTC Access

MS SQL Server. Настройка Windows аутетификации для linked серверов

​
  1. Для примера возьмем ситуацию. Есть такая схема: <клиентский ПК> - <SQL Server 1> - <SQL Server 2>
    SQL Server 2 - это linked сервер для SQL Server 1
    Нужно настроить Windows аутентификацию между SQL Server 1 и SQL Server 2.
  2. Обязательные условия:
    • службы SQL Server-а должны быть запущены от имени доменной учетной записи
    • учетные записи, которые будут работать с linked сервером должны быть зарегистрированы на обоих SQL серверах и им должны быть выданы соответствующие права
  3. Тестовая конфигурация выглядит так:
    SQL Server 1: hostname - sqlsrv1.domain.com   service account - domain\srv_sqlsrv1
    SQL Server 2: hostname - sqlsrv2.domain.com   service account - domain\srv_sqlsrv2
  4. Заходим на контролер домена и проверяем есть ли SPN записи для учетных записей srv_sqlsrv1 и srv_sqlsrv2
    setspn -L  domain\srv_sqlsrv1
    setspn -L  domain\srv_sqlsrv2
  5. Должны быть созданы SPN записи для службы MSSQLSvc. Если их нет, создаем для обоих серверов:
    setspn -A MSSQLSvc/sqlsrv1.domain.com domain\srv_sqlsrv1
    setspn -A MSSQLSvc/sqlsrv1.domain.com:1433 domain\srv_sqlsrv1
    setspn -A MSSQLSvc/sqlsrv2.domain.com domain\srv_sqlsrv2
    setspn -A MSSQLSvc/sqlsrv2.domain.com:1433 domain\srv_sqlsrv2
  6. Заходим в консоль Active Directory Users and Computers и находим учетные записи обоих сервров и их сервисных учетных записей. Для них необходимо:
    • проверить, что опция "Account is sensitive and cannot be delegated" на вкладке Account отключена для обоих сервисных учетных записей
    • установить опцию "Trust this user for delegation to any service (Kerberos only)" на вкладке Delegation для сервисных учетных записей
    • установить опцию "Trust this computer for delegation to any service (Kerberos only)" на вкладке Delegation для учетных записей серверов
  7. Теперь можно создавать и настраивать linked сервер.
    • Вариант 1.
      В свойсвах linked сервера на вкладке Security кликаем Add и выбираем логин на SQL сервере, который будет подключаться к удаленному SQL серверу. И устанавливаем птичку Impersonate.
    • Вариант 2.
      В свойсвах linked сервера на вкладке Security внизу выбиравем вариант "Be made using the login's current security context". Теперь все обращения к удаленному SQL серверу будут автоматически выполняться от имени доменного пользователя, который иницировал запрос.

Tuesday, November 27, 2012

How-to access to Acces or Excel file from MS SQL Server 64bit

  1. Install Microsoft Access Database Engine 2010 64bit and Service Pack 1 for Microsoft Access Database Engine 2010 64bit
  2. Run this SQL command
    exec master..xp_enum_oledb_providers
    In result you will see "Microsoft.ACE.OLEDB.12.0"
  3. Set SQL Server parameter "ad hoc distributed queries" to 1 with this script
    sp_configure 'show advanced options', 1;
    go
    reconfigure;
    go
    sp_configure 'Ad Hoc Distributed Queries', 1;
    go
    reconfigure;
    go
    You can read about parameter "ad hoc distributed queries" in this article ad hoc distributed queries Server Configuration Option
  4. If you get an error "Ad hoc update to system catalogs is not supported." run this SQL command
    sp_configure 'allow updates', 0;
    go
    reconfigure;
    go
  5. Set options "AllowInProcess" and "DynamicParameters" for  Microsoft.ACE.OLEDB.12.0  provider to 1. Run this SQL script
    use [master]
    go
    exec master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
    go
    exec master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1
    go
  6. MDB file should be in local folder in SQL Server.
  7. After all you can use this SQL command like this
    SELECT CustomerID, CompanyName
          FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0',
                'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
                'admin';'',Customers)