none
Resource Governor RRS feed

  • Pergunta

  • Boa Tarde

    Estou implementando o resource governor em meu ambiente de produção, gostaria de saber se alguém sabe como faço para verificar na função de classificação a role que cada usuario está vinculado, sem que eu tenha que fazer uma comparação por usuario, eu implementei uma função, só que não é permitido o comando execute em função, alguma luz??

    tenho o script abaixo
    CREATE FUNCTION fn_resource_governor()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    begin
    DECLARE @Banco sysname = (SELECT DB_NAME())
    DECLARE @User sysname = (SELECT SUSER_NAME());
    DECLARE @SQL NVARCHAR(max);
    DECLARE @Role sysname;
    DECLARE @RoleUser TABLE (NameRole sysname);
    SET @SQL = N'
    INSERT INTO @RoleUser (NameRole)
    SELECT  ISNULL(USER_NAME(mem.role_principal_id), '''')
    FROM    '+@Banco+'.sys.database_principals prin
    LEFT OUTER JOIN '+@Banco+'.sys.database_role_members mem ON prin.principal_id = mem.member_principal_id
    WHERE   prin.name = @User_0
    AND ISNULL(USER_NAME(mem.role_principal_id), '''') LIKE ''ROLE%'''
    EXEC sp_executesql @SQL, N'@User_0 sysname', @User_0 = @User
    IF @@ROWCOUNT = 0
    BEGIN
    DELETE @RoleUser;
    SET @SQL = N'INSERT INTO @RoleUser (NameRole)
    SELECT CASE WHEN SSPs2.name IS NULL THEN ''Public''
       ELSE SSPs2.name
       END
    FROM '+@Banco+'.sys.server_principals SSPs 
    LEFT JOIN '+@Banco+'.sys.server_role_members SSRM ON SSPs.principal_id  = SSRM.member_principal_id
    LEFT JOIN '+@Banco+'.sys.server_principals SSPs2 ON SSRM.role_principal_id = SSPs2.principal_id
    WHERE SSPs.name = @User_0
    AND SSPs.is_disabled = 0'
    EXEC sp_executesql @SQL, N'@User_0 sysname', @User_0 = @User
    END
    SELECT @Role=NameRole FROM @RoleUser
    RETURN @Role

    end

    Uma função de classificação para a implementação de Resource Governor, porém não é permitido usar exec nas function o que eu posso fazer, mensagem que dá
    Mensagem 4516, Nível 16, Estado 1, Procedimento fn_resource_governor, Linha 43
    Não é possível associar a função 'fn_resource_governor' a esquema porque ela contém uma instrução EXECUTE.

    Att.,

    Leonardo

    segunda-feira, 15 de junho de 2015 16:53

Todas as Respostas

  • Leonardo,

    Baseado em seu script T-SQL, não há necessidade de utilizar a procedure de sistema "sp_executesql".

    Segue abaixo uma adaptação de sua FUNCTION para que você possa customizar posteriormente de acordo com sua necessidade:

    CREATE FUNCTION fn_resource_governor()
    RETURNS @RoleUser TABLE (NameRole	varchar(50) )
    AS
    BEGIN
    	DECLARE @Banco varchar(50) = DB_NAME()
    	DECLARE @User sysname = SUSER_NAME()
    	DECLARE @Role sysname;
    
    	INSERT INTO @RoleUser (NameRole)
    	SELECT ISNULL(USER_NAME(mem.role_principal_id), '')
    	FROM    sys.database_principals prin
    	LEFT OUTER JOIN sys.database_role_members mem ON prin.principal_id = mem.member_principal_id
    	WHERE   prin.name = @User
    	AND ISNULL(USER_NAME(mem.role_principal_id), '') LIKE 'ROLE%'
    
    	IF @@ROWCOUNT = 0
    	BEGIN
    		DELETE @RoleUser;
    
    		INSERT INTO @RoleUser (NameRole)
    		SELECT CASE WHEN SSPs2.name IS NULL THEN 'Public'
    		   ELSE SSPs2.name
    		   END
    		FROM sys.server_principals SSPs 
    		LEFT JOIN sys.server_role_members SSRM ON SSPs.principal_id  = SSRM.member_principal_id
    		LEFT JOIN sys.server_principals SSPs2 ON SSRM.role_principal_id = SSPs2.principal_id
    		WHERE SSPs.name = @User
    		AND SSPs.is_disabled = 0
    
    	END
    	
    		RETURN;
    END
    GO
    
    SELECT * FROM dbo.fn_resource_governor();
    GO

    Segue abaixo um print-screen como Evidência de Teste:

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms186755.aspx

    https://msdn.microsoft.com/pt-br/library/ms191320.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 15 de junho de 2015 17:21