В нескольких знакомых мне компаниях такая ситуация: очень старая версия iScala и ещё более древняя версия SQL сервера — SQL Server 2000. А у некоторых ситуация ещё круче, у них Scala 5.1, а не iScala. По разным причинам они не переходят на новую версию iScala, хотя имеют право получить её бесплатно. Одно из препятствий — необходимость обновления всего компьютерного парка. Так или иначе, установить компонент Reporting Services не представляется возможным, так как до появления SQL Server 2005 этот компонент не входил в комплект поставки SQL Server 2000 и его нужно было получать отдельно. В своё время его не получили, а сейчас и не известно, возможно ли это даже теоретически.
Разумеется, можно было бы использовать более новую версию SQL сервера, но покупать его отдельно никто не хочет, хочется использовать бесплатную версию с дополнительными компонентами:
Но вот незадача, Reporting Services в бесплатной экспресс версии с дополнительными компонентами не умеет работать с «чужими» серверами, т.е. вы не можете просто установить на соседний сервер бесплатную версию SQL Server Express Advanced Edition в качестве сервера отчетов и создать источник данных, обращающийся на соседний сервер, выдаётся сообщение об ошибке: «Для используемого выпуска служб Reporting Services необходимо, чтобы для источников данных отчетов и базы данных сервера отчётов применялись локальные реляционные базы данных SQL Server»:
Это ограничение бесплатной Express версии.
Означает ли это, что мы не можем её использовать? Нет, не означает. Ниже я попытаюсь описать, что можно сделать, чтобы заставить экспресс версию работать с данными из базы данных основного SQL сервера (со старой версией).
Сначала попытаемся в базе данных SQL Server Express Advanced Edition (т.е. на новом сервере с бесплатной версией SQL, которую мы хотим использовать в качестве сервера отчётности) создать Linked Server. Проблема эта нетривиальная, т.к. моя версия SQL, т.е. SQL Server 2012 Express Advanced Edition по умолчанию использует компонент, который не умеет подключаться к 2000 SQL серверу. Но это можно сделать с помощью SQL запроса примерно такого содержания:
EXEC sp_dropserver @server=N'W2003R2Q2000', @droplogins='droplogins' GO EXEC sp_addlinkedserver @server = N'W2003R2Q2000', @srvproduct=N'MSDASQL', @provider=N'MSDASQL', @provstr=N'DRIVER={SQL Server};SERVER=W2003R2Q2000;Trusted_Connection=no;' EXEC sp_addlinkedsrvlogin @rmtsrvname=N'W2003R2Q2000', @useself=N'False', @locallogin=NULL, @rmtuser=N'sa', @rmtpassword=N'xxxxxxxxx' GO
В результате в разделе Linked Servers появится ссылка на сервер со старой версией SQL — т.е. на сервер, где хранятся базы данных Scala/iScala:
Теперь мы можем на сервере с SQL 2012 в качестве теста создать хранимую процедуру, выводящую список складов с нашего основного сервера (с SQL 2000):
Создадим тестовый отчёт и опубликуем его на сервере, чтобы проверить, будет ли это работать:
Работает! А раз это работает у меня, то может работать и у вас 🙂