reporting-services - configurar - enviar reporte por correo reporting services
¿Cómo cambio el propietario de una suscripción en SQL Server Reporting Services? (7)
¿No puedes modificar la suscripción?
El DBA anterior aquí configura algunos Informes de SQL Server Reporting Services para que se ejecuten automáticamente y envíe el informe por correo electrónico a los usuarios. Cuando dejó su accao, se deshabilitó y ahora no funcionan. El estado en la suscripción dice:
Error al enviar el correo: los permisos otorgados al usuario ''NUESTRODOMINIO / viejo_nombreUsuario_DBA'' no son suficientes para realizar esta operación.
¿Hay alguna manera fácil de cambiar el propietario, he encontrado el campo Propietario en la base de datos de RS en la tabla de suscripciones y tengo pensado cambiar eso, pero no quiero romper nuestro servicio de informes de producción?
La otra opción, por supuesto, es crear una nueva suscripción y eliminar la anterior, pero hay una manera mejor.
Me encontré con este problema antes y encontré la respuesta en este artículo en el blog de Jeremiah Clark.
La esencia es que tienes razón para actualizar el campo Propietario en la tabla Suscripciones de la base de datos de ReportServer con el nuevo usuario.
Trabajó para mí, de todos modos.
Tuve que enfrentar el mismo problema y utilicé el reflector para descubrir cuál era el problema. He mostrado el código .Net dentro de ReportingServicesServer.dll que arroja esta excepción en la publicación a continuación.
Como sugiere briang anteriormente, la solución provista por Jerimiah Clark funciona. Mi publicación detalla lo que sucede detrás de escena.
A partir de SRSS 2008 R2, puede cambiar el propietario mediante programación mediante el método ChangeSubscriptionOwner del servicio web ReportingService2010 .
Puede llamar a este servicio web a través de un script .rss. p.ej.
'' 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
Y ejecute esto usando la herramienta rs.exe como esta:
rs.exe -i ChangeSubscriptionOwner.rss -s http://localhost/reportserver -e Mgmt2010 -v NewOwner="domain/newuser" -v OldOwner="domain/olduser"
La solución publicada aquí hizo el truco para mí. Básicamente, usted midifica el propietario de la suscripción en la base de datos de SSRS directamente ejecutando el script a continuación.
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
Puede usar el procedimiento almacenado adjunto: debe proporcionar el nuevo usuario al que desea asignar la suscripción y el nombre del informe que está suscrito.
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
También puedes hacer esto en Visual Studio en C #. Cree una referencia web a ReportService2010.asmx en su servidor de informes, a lo largo de las líneas de esto.
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);
}
}
}
}