4

我收到以下消息:azure 不支持以下 sp_helpuser 和 sp_send_dbmail。

解决此问题的推荐方法是什么?

这里是使用这些 sp 的地方:

CREATE PROCEDURE [dbo].[aspnet_Setup_RemoveAllRoleMembers]
    @name   sysname
    AS
    BEGIN
    CREATE TABLE #aspnet_RoleMembers
(
    Group_name      sysname,
    Group_id        smallint,
    Users_in_group  sysname,
    User_id         smallint
)

INSERT INTO #aspnet_RoleMembers
EXEC sp_helpuser @name <--here it is

DECLARE @user_id smallint
DECLARE @cmd nvarchar(500)
DECLARE c1 cursor FORWARD_ONLY FOR
    SELECT User_id FROM #aspnet_RoleMembers

OPEN c1

FETCH c1 INTO @user_id
WHILE (@@fetch_status = 0)
BEGIN
    SET @cmd = 'EXEC sp_droprolemember ' + '''' + @name + ''', ''' + USER_NAME(@user_id) + ''''
    EXEC (@cmd)
    FETCH c1 INTO @user_id
END

CLOSE c1
DEALLOCATE c1
END
GO

而另一个sp:

CREATE PROCEDURE [dbo].[spSendMail]
@To VARCHAR(200),
@Subject VARCHAR(200),
@Body VARCHAR(MAX) = '',
@From VARCHAR(50) = 'info.pt@consultaclick.com',
@format VARCHAR(20) = 'HTML' --HTML
 AS

DECLARE
@profile VARCHAR(50)

select @profile = P.DBMailProfile from tblPaises P INNER JOIN tblParametros PR On P.Codigo = PR.Pais


EXEC MSDB..sp_send_dbmail @profile_name = @profile,
        @recipients =  'someone@somewhere.pt;someon@somehwere.pt',
        --@recipients =  @To,
        --@from_address = @From,
        @subject = @Subject,
        @Body = @Body,
        @body_format = @format
GO
4

2 回答 2

4

是的,SQL Azure 不支持“sp_helpuser”,所以如果你想模拟另一个用户,你可以使用“EXECUTE AS USER”。更多细节在这里

SQL Azure 也不支持“msdb.dbo.sp_send_dbmail”,但是这里有一个为您提供解决方案的博客。也可能有其他解决方案,但您肯定可以考虑使用最重要的解决方案。

于 2012-06-01T22:21:42.850 回答
0

我们刚刚遇到了同样的问题/感谢到目前为止回复的所有人为我们指明了正确的方向。我已经完成了一个快速修复,将sp_helpuser函数替换为脚本以获取给定角色的所有成员。注意:我没有重新创建sp_hepuser自己,因为可以从其他范围调用;但已修改aspnet_Setup_RemoveAllRoleMembers为直接查询基础表,而不是调用sp_helpuser.

ALTER PROCEDURE [dbo].[aspnet_Setup_RemoveAllRoleMembers]
    @name   sysname
    AS
BEGIN
    CREATE TABLE #aspnet_RoleMembers
    (
        Group_name      sysname,
        Group_id        smallint,
        Users_in_group  sysname,
        User_id         smallint
    )

    INSERT INTO #aspnet_RoleMembers (Group_name, Group_id, Users_in_group, User_id)
    --begin code to replace sp_helpuser
    select roles.name Role_name
    , roles.principal_id Role_id
    , members.name Users_in_role
    , members.principal_id Userid
    from sys.database_principals roles
    inner join sys.database_role_members link on link.role_principal_id = roles.principal_id
    inner join sys.database_principals members on members.principal_id = link.member_principal_id
    where roles.type = 'R'
    and roles.name = @name
    --end code to replace sp_helpuser

    DECLARE @user_id smallint
    DECLARE @cmd nvarchar(500)
    DECLARE c1 cursor FORWARD_ONLY FOR
        SELECT User_id FROM #aspnet_RoleMembers
    OPEN c1
        FETCH c1 INTO @user_id
        WHILE (@@fetch_status = 0)
        BEGIN
            SET @cmd = 'EXEC sp_droprolemember ' + '''' + @name + ''', ''' + USER_NAME(@user_id) + ''''
            EXEC (@cmd)
            FETCH c1 INTO @user_id
        END
    CLOSE c1
    DEALLOCATE c1
END
GO

我们还没有测试过这个解决方案;所以使用风险自负......希望它有所帮助......

于 2021-05-19T11:35:16.750 回答