Как изменить владельца подписки в службах отчетов SQL Server
В предыдущем администраторе баз данных были созданы некоторые отчеты служб отчетов SQL Server для автоматического запуска и отправки отчета по электронной почте пользователям. Когда он покинул свой счет, он был отключен, и теперь они не работают. Статус подписки:
Отказ от отправки почты: разрешения, предоставленные пользователю "OURDOMAIN\old_DBA_Username" недостаточно для выполнения этого операции.
Есть ли простой способ изменить владельца, я нашел поле "Владелец" в базе данных RS в таблице подписки и хотя бы что-то изменил, но не хочу разорвать нашу службу производственного отчета?
Другой вариант, конечно, состоит в том, чтобы создать новую подписку и удалить старый, но наглый - лучший способ.
Ответы
Ответ 1
Я столкнулся с этим вопросом раньше и нашел ответ в этой статье в блоге Джереми Кларк.
Суть в том, что вы правы в обновлении поля "Владелец" в таблице "Подписки" базы данных ReportServer с новым пользователем.
Работал для меня, во всяком случае.
Ответ 2
Решение, размещенное здесь, сделало трюк для меня. В принципе, вы сами выравниваете владельца подписки в базе данных SSRS, запуская script ниже.
DECLARE @OldUserID uniqueidentifier
DECLARE @NewUserID uniqueidentifier
SELECT @OldUserID = UserID FROM dbo.Users WHERE UserName = 'DOMAINA\OldUser'
SELECT @NewUserID = UserID FROM dbo.Users WHERE UserName = 'DOMAINA\NewUser'
UPDATE dbo.Subscriptions SET OwnerID = @NewUserID WHERE OwnerID = @OldUserID
Ответ 3
Вы можете сделать это и в Visual Studio на С#. Создайте веб-ссылку на ReportService2010.asmx на сервере отчетов, как и в строках этого.
public class ChangeOwner
{
public string OldOwner { get; set; }
public string NewOwner { get; set; }
public ChangeOwner()
{
}
public void ChangeReportOwner()
{
ReportingService2010 rs = new ReportingService2010();
//set the URL to your report server
rs.Url = "http://youserver/ReportServer/ReportService2010.asmx";
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
Subscription[] items = rs.ListSubscriptions("/");
foreach(Subscription item in items)
{
if(item.Owner.ToUpper() == this.OldOwner.ToUpper())
{
Console.WriteLine("Updating report " + item.Path + " " + item.Owner);
rs.ChangeSubscriptionOwner(item.SubscriptionID, this.NewOwner);
}
}
}
}
Ответ 4
Вы не можете изменить подписку?
http://technet.microsoft.com/en-us/library/ms157343.aspx
Ответ 5
Мне пришлось столкнуться с той же проблемой и использовать рефлектор, чтобы узнать, в чем проблема. Я показал код .Net в ReportingServicesServer.dll, который выдает это исключение в сообщении ниже.
http://easybi.wordpress.com/2011/01/22/microsoft-reportingservices-diagnostics-utilities-unknownusernameexception-the-user-or-group-name-is-not-recognized/
Как указывает выше, предлагаемое Джеримией Кларком решение. Мой пост рассказывает о том, что происходит за кулисами.
Ответ 6
Начиная с SRSS 2008 R2, вы можете программно изменить владельца через ChangeSubscriptionOwner веб-службы ReportingService2010.
Вы можете вызвать этот веб-сервис через .rss script. например.
' OldOwner - username of owner to replace
' NewOwner - username of new owner
Public Sub Main()
Dim items() As Subscription
items = rs.ListSubscriptions("/")
Dim item as Subscription
For Each item in Items
If (item.Owner.ToUpper() = OldOwner.ToUpper()) Then
Console.WriteLine("Updating report " & item.Path & " " & item.Owner)
rs.ChangeSubscriptionOwner(item.SubscriptionID, newOwner)
End If
Next item
End Sub
И запустите это с помощью rs.exe, например:
rs.exe -i ChangeSubscriptionOwner.rss -s http://localhost/reportserver -e Mgmt2010 -v NewOwner="domain\newuser" -v OldOwner="domain\olduser"
Ответ 7
Вы можете использовать прилагаемую хранимую процедуру:
Вам необходимо предоставить нового пользователя, которому вы хотите назначить подписку, чтобы
и имя отчета, подписанное
CREATE PROCEDURE [dbo].[SP_ChangeSubscriptionOwner]
(
@userName nvarchar(260),
@ReportName nvarchar(425)
)
/*
Example:
EXEC SP_ChangeSubscriptionOwner '<New user Name>' , '<Report Name>'
The procedure changes the Owner of a subscription to the user enterd as parameter to the procedure
*/
AS
BEGIN
SET NOCOUNT ON
DECLARE @MSG VARCHAR(1000)
IF NOT EXISTS
(
SELECT 1
FROM Users where UserName = @userName
)
SET @MSG = 'User: '+'"'+ @userName + '"'+' doesn''t exist in Users table.'
ELSE
SET @MSG = 'No subscriptions were found to report: '+'"' + @ReportName + '"'+' ,Or the User: '+'"'+ @userName + '"'+' is already the owner of the report subscription.'
update S
set S.OwnerID = U.UserID
FROM Subscriptions S
JOIN Catalog c
on s.Report_OID = c.ItemID
JOIN Users U
ON U.UserName = @userName
where C.Name = @ReportName
AND U.UserID != S.OwnerID
if @@ROWCOUNT = 0
raiserror (@MSG,16,1)
END