Подтвердить что ты не робот

Как изменить владельца подписки в службах отчетов SQL Server

В предыдущем администраторе баз данных были созданы некоторые отчеты служб отчетов SQL Server для автоматического запуска и отправки отчета по электронной почте пользователям. Когда он покинул свой счет, он был отключен, и теперь они не работают. Статус подписки:

Отказ от отправки почты: разрешения, предоставленные пользователю "OURDOMAIN\old_DBA_Username" недостаточно для выполнения этого операции.

Есть ли простой способ изменить владельца, я нашел поле "Владелец" в базе данных RS в таблице подписки и хотя бы что-то изменил, но не хочу разорвать нашу службу производственного отчета?

Другой вариант, конечно, состоит в том, чтобы создать новую подписку и удалить старый, но наглый - лучший способ.

4b9b3361

Ответ 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);
        }
    }
}

}

Ответ 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