此前的DBA设置了一些SQL Server Reporting Services报告以自动运行并通过电子邮件将报告发送给用户。当他离开他的帐户时被禁用,现在他们不工作。订阅状态显示为:
发送邮件失败:授予用户的权限 'OURDOMAIN \ old_DBA_Username'不足以执行此操作 操作
是否有一种简单的方法可以更改所有者,我在订阅表中的RS数据库中找到了所有者字段,但是只是更改了它,但是不想破坏我们的生产报告服务?
另一种选择当然是创建一个新的订阅并删除旧的,但是有一种更好的方式。
答案 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代码,它会在下面的帖子中抛出此异常。
正如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个,这不是问题,但是如果有数十个,则可以改用其他建议之一。
来源: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>