Показаны сообщения с ярлыком MS SQL. Показать все сообщения
Показаны сообщения с ярлыком MS SQL. Показать все сообщения

четверг, 7 июня 2018 г.

How to grant anonymous access to SSRS reports. Предоставление анонимного доступа к SSRS отчетам

Начиная с SQL 2005, анонимный доступ к SSRS перестал быть поддерживаемой опцией и предоставление его является задачей нетривиальной и небезопасной. Различные ресурсы (например, этот https://blogs.msdn.microsoft.com/jameswu/2008/07/15/anonymous-access-in-sql-rs-2008/ ) описывают модификацию SSRS инстанса с целью выключить любую аутентификацию, кроме анонимной (включая компиляцию собственного authentication extension), однако это, во первых, оверкилл, а во вторых - предоставит доступ ко всем вашим репортам, а не только, например, к определенной папке.
Однако, легкий способ сделать это - написать простой reverse proxy server, который бы принимал анонимные запросы и транслировал бы их в SSRS. Этот прокси вполне можно развернуть на том же сервере, что SSIS и гибко настроить его для предоставления доступа к строго определенной папке.

Как это сделать?
1. Скомпилировать прокси сервер и развернуть его на том же сервере, что и SSRS, например в папку Default Web Site/SSRSANON;
2. Поменять web.config под ваши нужды;
2. Настроить Application Pool для этого приложения: он должен быть не менее версии 4.0, classic и ApplicationPoolIdentity = аккаунт, который имеет доступ к папке с репортами;
3. Обратиться к репорту, используя URL типа http://YourReportServer/Report=MyReport,par1=val1,par2=val2..../

Прокси-сервер основан на коде, описанном в этой статье:
https://www.codeproject.com/Articles/7135/Simple-HTTP-Reverse-Proxy-with-ASP-NET-and-IIS#_comments


четверг, 8 июня 2017 г.

Danger of copying SSIS script components. Об опасности копирования SSIS script components.

Будьте внимательны каждый раз, когда вы копируете SSIS Script components из одного Data flow task в другой. Assembly names для таких компонентов остаются теми же самыми, что производит весьма интересные и неожиданные эффекты, подобные описанным тут:

https://kohera.be/blog/sql-server/the-dangers-of-copying-script-components-in-ssis/


В этой же статье предлагается способ решения: скопировать этот компонент в совершенно новый SSIS package, а затем скопировать его обратно, однако, начиная с SSDT 2008 этот способ не работает, оба компонента всё равно будут иметь те же самые Assembly names.

Решение: если неохота создавать компонент с нуля, заново прописывая inputs, outputs и код, можно поредактировать напрямую XML, однако, конечно, не оригинальный package. Создайте новый пустой package, внутри пустой Data flow task, туда скопируйте компонент, у которого надо поменять имя и откройте весь файл в XML. Дальше - find+replace - и счастье, можно копировать компонент обратно в основной package.

понедельник, 1 июля 2013 г.

SQL 2012 Always on step-by-step (пошаговая инструкция по конфигурированию Always on)

SQL 2012 Always on - удобное решение, обеспечивающее отказоустойчивость и распределение нагрузки (для приложений, которые это поддерживают) без необходимости иметь shared storage (хотя, для еще большей отказоустойчивости, можно объединить несколько SQL Failover clusters в Always on реплики). Конфигурировать это решение достаточно просто и удобно (я делал это на Windows Server 2008 R2 + SQL 2012 в домене Active Directory).

вторник, 25 июня 2013 г.

OPTION (OPTIMIZE FOR ( @xColumns = NULL )) значительно повышает производительность XML query

Случайно наткнулся на

select ColumnNames.value('.', 'nvarchar(300)') name
from @xColumns.nodes('/columns/name') T1(ColumnNames)
OPTION (OPTIMIZE FOR ( @xColumns = NULL ))
добавление последней строчки уменьшило время выполнения аналогичного запроса в моем случае аж на 25% (10мс). Нашел тут:
http://stackoverflow.com/

среда, 26 сентября 2012 г.

CRL in SQL - Data access. Доступ к данным из CRL объектов в SQL

Для доступа к данным в контексте текущего соединения, можно делаеть так:


Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient.SqlConnection
Public Class CRLFunctions

Public Shared Function Whatever(...)....
 Using connection As New System.Data.SqlClient.SqlConnection("context connection=true")
connection.Open
'используем соединение тут
End Using
End Function
End Class

Источник: http://msdn.microsoft.com/en-us/library/ms131043.aspx

вторник, 21 февраля 2012 г.

SQL Agent - Send a notification email with the error message. Как послать из SQL Agent письмо с текстом ошибки

Написал Powershell-скриптик для этого:

$JobName="название задачи из SQL Agent"
$SQL="SELECT top 1 message FROM [msdb].[dbo].[sysjobs] j join [msdb].[dbo].[sysjobhistory] h on j.job_id = h.job_id where run_status=0 and name='"+$JobName+"' order by run_time desc"
$Body=Invoke-Sqlcmd -Query $SQL
$emailFrom = "адрес отправителя"
$emailTo = "адрес получателя"
$subject = $JobName+" has failed"
$smtpServer = "адрес смтп-сервера"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body[0])

пятница, 16 сентября 2011 г.

SQL 2008 R2 Cluster installation step-by-step: пошаговая инструкция по инсталляции кластера SQL 2008 R2

Инсталляция кластера SQL 2008 R2 достаточно проста, но пропустив некоторые шаги можно потом потратить много времени и усилий на исправление, так что неплохо иметь пошаговую инструкцию по инсталляции. Подразумевается, что уже имеется как минимум один узел (node) с установленным Windows 2008 R2 и подключенный к shared storage

пятница, 19 августа 2011 г.

SQL Server 2008 R2 Utility control point - enrollment прошел без ошибок, но информация не собирается

Как выяснилось, даже если у instance с UCP есть отдельный выделенный TCP порт, с точки зрения managed instance он все равно считается named instance и пытается подключиться к нему как к SERVERNAME\INSTANCENAME. Если в сети запрещен соответствующий трафик или SQL Browser выключен, информация собираться не будет. Выход - использовать SQL Alias на managed instance.
Проверить, что все работает нормально можно, поглядев историю SQL Agent Job на managed instance для задач sysutility_mi_collect_and_upload и sysutility_mi_collect_performance.
Другие полезные советы для траблшутинга UCP connectivity доступны тут:
http://msdn.microsoft.com/en-us/library/ee210592.aspx

четверг, 4 августа 2011 г.

Миграция отчетов в SSRS (Migrate SSRS reports)

Совершенно замечательное приложение, чтобы мигрировать репорты с одного сервера на другой, выгрузить/загрузить их кучей и т.д. - RSScripter:

http://www.sqldbatips.com/showarticle.asp?ID=62

Jasper Smith, thank you!

четверг, 23 июня 2011 г.

SQL Server Integration Services (SSIS) запускает SQLDUMPER.EXE и виснет во время выполнения пакета.

Эта проблема возникла у меня почему-то только на Windows7 (на XP все работало нормально). Во время отладки SSIS package на мгновение появлялось DOS-окошко с SQLDUMPER, после чего задачи в Business Intelligence Development Studio оставались желтенькими, но никогда не завершались. Решение этой проблемы такое же странное, как и она сама - надо выключить службу SQL Server VSS Writer.

Источник: http://discussions.virtualdr.com/showthread.php?t=220983

пятница, 17 июня 2011 г.

ADODB.Recordset error '800a0e78' Operation is not allowed when the object is closed.

У меня это случилось при миграции старого веб-приложения (ASP) на новый веб и сиквел сервер. Были изменены параметры подключения (с ODBC на OLE DB). Приложение подключалось к базе данных, SQL Profiler показывал, что команды исполняются, однако часть кода

set objDBConnection = Server.CreateObject("ADODB.Connection")
Set objRs = Server.CreateObject( "ADODB.RecordSet")
objDbConnection.Open(ConnectionString)
objRs.Execute("EXEC someStoredProcedure")


возвращало закрытый объект objRs и ошибку ADODB.Recordset error '800a0e78' , чего не случалось до миграции.
Немножко поковырявшись и погуглив, нашел следующее: вызовы stored procedures, сделанные через ODBC не возвращают "(x) rows affected", а OLE DB - возвращают. Соответственно, встретив эту строчку в ответе, OLE DB неверно интерпретирует ее как отсутствие данных и закрывает объект. Починить это можно двумя способами - поставив SET NOCOUNT ON вначале кода stored procedure (более правильный способ) или включив no count глобально на уровне сервера (на уровне базы данных, к сожалению, этого не сделать).
В связи с этим приходит следующая мысль: обязательное использование SET NOCOUNT ON в начале кода stored procedure - это хороший тон.

Источник: http://tutorials.aspfaq.com/8000xxxxx-errors/why-do-i-get-800a0cc1-errors.html

четверг, 31 марта 2011 г.

SQL Server Management Studio at x64 platform ('System.OutOfMemoryException', memory leaks, etc.)

Не успел я порадоваться на свой новый лэптоп (Elitebook 8540w, 8GB RAM), как заметил, что SSMS ведет там себя очень странно - зависает, работает ощутимо медленнее, чем на моем старом лэптопе и периодически отъедает 1-2GB RAM на очень простых запросах.
Дня два копал интернет, пока не нашел следующее:
"...You may experience slow performance when you run 32-bit SQL Server tools on 64-bit operating systems..."

"...To improve performance, run these 32-bit tools on a computer that is running a 32-bit operating system. Then, connect to a 64-bit server that is running SQL Server..."
В результате получается, что мой новый лэптоп несовместим с моим основным рабочим инструментом.
Не понимаю я Microsoft - почему, несмотря на то, что все новые версии ОС объявлены x64, инструменты разработчика даже для SQL 2008 R2 все еще x32?
Источник: http://support.microsoft.com/?id=906892

вторник, 28 сентября 2010 г.

OLE DB provider 'SQLOLEDB' was unable to start a distributed transaction.

В интернете полно решений по поводу этой задачи. 99.9% из них просто перепечатывают следующую статью:
http://support.microsoft.com/kb/873160
Но что делать, если мы все вышеперечисленное сделали, а оно не работает?
Нигде я не нашел упоминания о том, что для корректной работы MS DTC требуется, чтобы все хосты, участвующие в распределенной транзакции, могли разрешать имена друг друга в NetBios. Если у них разные DNS-серверы или они в разных доменах, это может стать проблемой. В таком случае достаточно прописать имена друг друга им в host файлах или использовать любое другое аналогичное решение.

четверг, 2 сентября 2010 г.

Token-based server access validation failed with an infrastructure error. Check for previous errors. [CLIENT: ]

Опять забавные симптомы: можно подключиться к SQL серверу удаленно, но если попробовать подключиться локально - доступа нет, в event log эта ошибка. Решается просто - выключением UAC либо right click - Run as Administrator.

пятница, 15 января 2010 г.

Change database collation (by force)

Злостно снасильничать над БД и поменять Collation можно следующей последовательностью команд:

ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [DatabaseName] COLLATE [new collation name]
ALTER DATABASE [DatabaseName] SET MULTI_USER


Изменить COLLATION всех колонок:


declare @toCollation sysname

SET @toCollation = 'SQL_Latin1_General_CP1_CI_AS' -- Database default collate

SELECT 'ALTER TABLE ' + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME +
' ALTER COLUMN ' + COLUMN_NAME + ' ' + DATA_TYPE +
CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 then '(max)'
WHEN DATA_TYPE in ('text','ntext') then ''
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL
THEN '('+(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH)+')' )
ELSE isnull(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH),' ') END
+' COLLATE ' + @toCollation+ ' ' + CASE IS_NULLABLE
WHEN 'YES' THEN 'NULL'
WHEN 'No' THEN 'NOT NULL'

END
FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN INFORMATION_SCHEMA.TABLES
ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = INFORMATION_SCHEMA.TABLES.TABLE_NAME
AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA
WHERE DATA_TYPE IN ('varchar' ,'char','nvarchar','nchar','text','ntext')
AND TABLE_TYPE = 'BASE TABLE'
and COLLATION_NAME <> @toCollation


Источник: http://sqlblogcasts.com/blogs/ssqanet/archive/2008/03/12/tsql-to-change-collation-of-database-whats-new-in-sql-2008-then.aspx

среда, 11 ноября 2009 г.

Disabling or Enabling SQL Server Agent Jobs

Групповая работа с задачами SQL Server Agent:

Disable All SQL Server Agent Jobs

USE MSDB;
GO
UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE Enabled = 1;
GO

Enable All SQL Server Agent Jobs

USE MSDB;
GO
UPDATE MSDB.dbo.sysjobs
SET Enabled = 1
WHERE Enabled = 0;
GO

Disable Jobs By Job Name

USE MSDB;
GO
UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] LIKE 'Admin%';
GO

Источник: http://www.mssqltips.com/tip.asp?tip=1400

суббота, 13 июня 2009 г.

SQL-функция AVG вызывает переполнение (Arithmetic overflow error)

Такая неприятная вещь бывает даже в случае, когда надо посчитать среднее от довольно маленькой величины (например tinyint), но в большом массиве. Компания Майкрософт по этой ссылке говорит примерно следующее:
"...Мы расследовали эту проблему и даже придумали, как решить ее, но из-за нехватки ресурсов и времени мы не успеваем вставить решение в SQL 2008, так что ждите следующей версии..." - Разгильдяи, одним словом. Workaround по данной ссылке не описан.
Однако, другие умные люди нашли этот воркэраунд: предположим, что инструкция типа
SELECT AVG(bytessent)
вызывает ошибку Arithmetic overflow error. Перепишем ее как
SELECT AVG(CAST(bytessent AS bigint))
и все получится.

Источники:
http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=241543
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=75175

понедельник, 20 апреля 2009 г.

OLE/DB provider returned Timeout expired with Linked Server

Для того, чтобы удаленный запрос через Linked Server выполнялся дольше 10 минут без появления ошибок, время ожидания можно переконфигурировать:

sp_configure 'remote login timeout', 30
go
reconfigure with override
go

sp_configure 'remote query timeout', 0
go
reconfigure with override
go


Источник: http://support.microsoft.com/kb/314530