如何在SQL Server Reporting Services中更改订阅的所有者

时间:2009-01-13 03:06:59

标签: reporting-services

此前的DBA设置了一些SQL Server Reporting Services报告以自动运行并通过电子邮件将报告发送给用户。当他离开他的帐户时被禁用,现在他们不工作。订阅状态显示为:

  

发送邮件失败:授予用户的权限   'OURDOMAIN \ old_DBA_Username'不足以执行此操作   操作

是否有一种简单的方法可以更改所有者,我在订阅表中的RS数据库中找到了所有者字段,但是只是更改了它,但是不想破坏我们的生产报告服务?

另一种选择当然是创建一个新的订阅并删除旧的,但是有一种更好的方式。

9 个答案:

答案 0 :(得分:9)

发布的解决方案here为我做了诀窍。基本上,您可以通过运行以下脚本直接修改SSRS数据库上的订阅所有者。

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

答案 1 :(得分:5)

之前我遇到过这个问题,并在Jeremiah Clark博客的article中找到答案。

关于它的问题是,您正在使用新的更新 ReportServer 数据库的订阅表中的所有者字段用户。

无论如何,为我工作。

答案 2 :(得分:5)

您也可以在C#中的Visual Studio中执行此操作。在报表服务器上创建ReportService2010.asmx的Web引用,与此一致。

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);
        }
    }
}

}

答案 3 :(得分:1)

从SRSS 2008 R2开始,您可以programmatically change the owner通过ChangeSubscriptionOwner网络服务的ReportingService2010方法{/ 3}}。

您可以通过.rss脚本调用此Web服务。例如

' 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"

答案 4 :(得分:0)

答案 5 :(得分:0)

我不得不面对同样的问题,并使用反射器来找出问题所在。我在ReportingServicesServer.dll中显示了.Net代码,它会在下面的帖子中抛出此异常。

http://easybi.wordpress.com/2011/01/22/microsoft-reportingservices-diagnostics-utilities-unknownusernameexception-the-user-or-group-name-is-not-recognized/

正如briang所说,Jerimiah Clark提供的解决方案有效。我的帖子详细介绍了幕后发生的事情。

答案 6 :(得分:0)

您可以使用附加的存储过程: 您需要提供要为其分配订阅的新用户 以及订阅的报告名称

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

答案 7 :(得分:0)

从SQL 2016开始,用户界面中具有替换订阅所有者的功能。唯一的缺点是您必须分别编辑每个订阅。如果只有1个,这不是问题,但是如果有数十个,则可以改用其他建议之一。

This image shows the Owner field that you can edit

来源:https://www.sqlshack.com/report-subscription-changes-sql-server-reporting-services-2016/

答案 8 :(得分:0)

ntombela的解决方案在SSRS 2016上为我们工作,除了我们还必须更新ModifiedByID。如果没有,则无法禁用/启用订阅。我们出现一个弹出窗口,指示未找到现在禁用的ID。所有者显示正确的用户名,但“修改者”条目仍显示旧ID。

我不会认为这很重要,但是对我们而言似乎如此。从好的方面来看,我们不再看到SSRS日志文件错误,例如:

错误:抛出Microsoft.ReportingServices.Diagnostics.Utilities.UnknownUserNameException:Microsoft.ReportingServices.Diagnostics.Utilities.UnknownUserNameException:用户或组名“ AD域\ olddisabledusername ”无法识别。 / p>