Permissão para visualizar o relatório de execução no Catálogo SSIS

8

Atualmente, estamos usando o SSIS 2012. Existe alguma maneira para um usuário exibir relatórios de execução no Catálogo SSIS sem ser ssis_admin ou sysadmin?

Isso é para o ambiente de produção e não queremos que as pessoas manipulem os projetos do Catálogo SSIS.

Obrigado!

Joann.B
fonte

Respostas:

11

Aqui está a nossa solução (acredite, funcionará perfeitamente!)

Após investigar o procedimento sobre como os relatórios de execução são armazenados, descobrimos que toda vez que um trabalho é executado, a tabela internal.executions no SSISDB é atualizada. E para visualizar o relatório de execução dessa execução, precisamos executar algo como abaixo:

EXEC SSISDB.catalog.grant_permission 
    @object_type = 4, 
    @object_id = @execution_id, 
    @principal_ID =  13, 
    @permission_type = 1;

Este procedimento armazenado concederá a uma função / usuário um certo acesso a um objeto no banco de dados. @object_type significa em qual tipo de objeto você precisa de permissão (4 significa operação); @object_id significa o objeto específico ao qual queremos acessar; @principal_ID significa quem deseja obter o acesso; permission_type significa que tipo de acesso queremos ter (1 significa somente leitura). Para obter mais informações, consulte catalog.grant_permission (banco de dados SSISDB)

Nosso objetivo é criar um gatilho que sempre que um trabalho for executado - ou seja, a tabela internal.executions for inserida - usando o SP acima para conceder a uma função a permissão para obter as informações dessa operação.

Em seguida, siga as etapas abaixo para configurar as permissões de exibição de relatórios de execução:

  1. Crie um usuário com o qual o gatilho será executado. Esse usuário deve poder executar um gatilho no SSISDB e ter acesso ao Catálogo SSIS. No nosso caso, atribuímos a ela db_owner role e ssis_admin no SSISDB.

    USE [master]
    GO
    CREATE LOGIN [ssis_job_viewer] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
    GO
    USE [SSISDB]
    GO
    CREATE USER [ssis_job_viewer] FOR LOGIN [ssis_job_viewer]
    GO
    USE [SSISDB]
    GO
    ALTER ROLE [db_owner] ADD MEMBER [ssis_job_viewer]
    GO
    USE [SSISDB]
    GO
    ALTER ROLE [ssis_admin] ADD MEMBER [ssis_job_viewer]
    GO
    
  2. Crie uma função [package_execution_viewer]. Essa função será usada no procedimento armazenado que mencionamos acima.

    USE [SSISDB]
    GO
    CREATE ROLE [package_execution_viewer]
    GO
    
  3. Adicionar usuários ao [package_execution_viewer]

    USE [SSISDB]
    GO
    ALTER ROLE [package_execution_viewer] ADD MEMBER [user1]
    GO
    USE [SSISDB]
    GO
    ALTER ROLE [package_execution_viewer] ADD MEMBER [user2]
    GO
    
  4. Obtenha o princípio_id da função package_execution_viewer. Esse ID também será usado no SP acima.

    SELECT * from sys.database_principals
    GO
    
  5. Criar gatilho para conceder permissão para package_execution_viewer

    USE [SSISDB]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER [internal].[update_viewer_perms]
    ON [internal].[executions]
    WITH EXECUTE AS 'ssis_job_viewer'
    AFTER INSERT
    AS
    declare @execution_id bigint
    BEGIN
    select @execution_id = execution_id from inserted
    EXEC SSISDB.catalog.grant_permission 
        @object_type = 4, 
        @object_id = @execution_id, 
        @principal_ID =  13, 
        @permission_type = 1   **--Note the principal_id needs to be changed**
    END
    GO
    

Tudo pronto. Dessa forma, podemos permitir que as pessoas acessem os relatórios de execução sem torná-los como ssis_admin. Experimente e compartilhe seus pensamentos sobre este post!

Joann.B
fonte
9

Com a ressalva de que eu não sou uma pessoa de segurança ...

Não há outra função de banco de dados predefinida ssis_adminque seja especial para o SSISDB. Isso permite fazer todas as coisas do SSIS, mas é claramente mais poder do que uma pessoa de suporte deveria ter.

Existem dois esquemas, internale catalog. O catálogo é para nós, usuários finais, para interagir com o SSISDB enquanto interno é, para citar um ótimo manual

IST NICHT FÜR DER GEFINGERPOKEN UND MITTENGRABEN!

Acionei o criador de perfil e observei enquanto clicava nos relatórios de execução e nos sub-relatórios. Todas as consultas são consultas in-line no catalogesquema. Todos os procs e funções que estão no catalogesquema parecem estar relacionados à manutenção e administração dos pacotes; portanto, se você criou uma função que

Você pode executar a resposta de Martin para conceder acesso a todas as visualizações baseadas em catálogo, mas como sou preguiçoso,

Eu tentaria algo assim. Crie uma função chamada LookIt, inclua meus membros e conceda a eles a permissão SELECT para todo o esquema do catálogo

USE [SSISDB]
GO
CREATE ROLE [LookIt]
GO
USE [SSISDB]
GO
ALTER ROLE [LookIt] ADD MEMBER [MyPeople]
GO
use [SSISDB]
GO
GRANT SELECT ON SCHEMA::[catalog] TO [LookIt]
GO

Editar 08-10-2015

Regozije-se, para aqueles que olham para o SQL Server 2016. Há uma nova função do SSIS que permitirá que usuários não privilegiados possam usar as ferramentas de relatório nativas. Essa função é chamada ssis_logreaderConcessão de associação a essa função permitirá que os usuários acessem todos os relatórios sem conceder a eles a capacidade de administrar a instância do SSIS ou o servidor inteiro.

billinkc
fonte
3

Muito simplesmente ... Comente a WHEREcláusula nessas duas visualizações:

SSISDB.catalog.executions
SSISDB.catalog.event_messages

Feito.

Mude a visualização catalog.event_messagescomentando a WHEREcláusula:

--WHERE opmsg.[operation_id] in (SELECT [id] FROM [internal]. 
--[current_user_readable_operations]) OR (IS_MEMBER('ssis_admin') = 1) OR 
--(IS_SRVROLEMEMBER('sysadmin') = 1)

Faça o mesmo com a vista Catalog.executions.

Ainda não encontrei nenhum efeito colateral e o sinto há 3 meses nos ambientes PROD e QA.

Doug
fonte
3

Comentando a WHEREcláusula nessas visualizações do SSISDB:

  • SSISDB.catalog.executions
  • SSISDB.catalog.event_messages
  • SSISDB.Catalog.folders

e forneça o DB_READERacesso ao usuário / grupo no SSISDB. Validado / Verificado no SQL 2012/2014

Balaji Rajaram
fonte
1

Portanto, este é um problema que encontrei nos últimos dias e devo dizer que este post definitivamente ajudou, embora nenhuma resposta tenha sido exatamente o que ajudou.

Assim como esta postagem indica, eu queria dar acesso para visualizar os relatórios do Catálogo dos Serviços de Integração, sem precisar conceder a função SSIS_admin em um ambiente em que não é necessário. E obrigado à billinkc por me ajudar a encontrar a resposta. Como ele disse, eles corrigiram esse problema no SQL 2016 adicionando uma função de banco de dados que permite que você faça o que queremos. Isso me deu a ideia de copiar apenas o que o SQL 2016 fez nas versões anteriores. Então, aqui está o que você deve fazer:

  • Crie uma função de banco de dados dentro do SSISDB. Eu nomeei meu ssis_logreader por consistência.
  • Altere a lógica das seguintes exibições SSISDB para conter OR (IS_MEMBER('ssis_logreader') = 1)na cláusula where.
  • [catálogo]. [operações]

    [catalog]. [operation_messages]

    [catalog]. [event_message_context]

    [catalog]. [event_messages]

    [catalog]. [executable_statistics]

    [catálogo]. [executáveis]

    [catalog]. [Execution_component_phases]

    [catalog]. [execução_data_statistics]

    [catálogo]. [execução_dados_taps]

    [catalog]. [Execution_parameter_values]

    [catalog]. [Execution_property_override_values]

    [catálogo]. [execuções]

    [catalog]. [extended_operation_info]

    [catalog]. [operation_messages]

    [catálogo]. [operações]

    [catálogo]. [pacotes]

    [catálogo]. [projetos]

    [catálogo]. [validações]

  • Em seguida, adicione o usuário e / ou grupos de usuários a essa função de banco de dados.

Depois de fazer isso, ele deve cuidar dos seus problemas.

Também anexei um script que fará tudo, menos a última etapa. Esteja avisado, porém, tem quase 700 linhas

Obrigado.

USE SSISDB
GO


CREATE ROLE [ssis_logreader]
GO


----------------------------------------------------------------------------------------------
USE [SSISDB]
GO

/****** Object:  View [catalog].[operations]    Script Date: 10/5/2016 8:38:56 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER VIEW [catalog].[operations]
AS
SELECT     [operation_id], 
           [operation_type], 
           [created_time],
           [object_type],
           [object_id],
           [object_name],
           [status], 
           [start_time], 
           [end_time], 
           [caller_sid], 
           [caller_name], 
           [process_id],
           [stopped_by_sid],
           [stopped_by_name],
           [server_name],
           [machine_name]
FROM       internal.[operations]
WHERE      [operation_id] in (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO

-----------------------------------------------------------------------------------------------------------
USE [SSISDB]
GO

/****** Object:  View [catalog].[operation_messages]    Script Date: 10/5/2016 8:38:32 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER VIEW [catalog].[operation_messages]
AS
SELECT     [operation_message_id], 
           [operation_id], 
           [message_time],
           [message_type],  
           [message_source_type], 
           [message], 
           [extended_info_id]
FROM       [internal].[operation_messages] 
WHERE      [operation_id] in (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO
-----------------------------------------------------------------------------------------------------------------------


USE [SSISDB]
GO

/****** Object:  View [catalog].[event_message_context]    Script Date: 10/5/2016 8:12:27 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[event_message_context]
AS
SELECT     [context_id],
           [event_message_id],
           [context_depth],
           [package_path],
           [context_type],
           [context_source_name],
           [context_source_id],
           [property_name],
           [property_value]
FROM       [internal].[event_message_context]
WHERE      [operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO


-----------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[event_messages]    Script Date: 10/5/2016 8:13:44 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[event_messages]
AS
SELECT     opmsg.[operation_message_id] AS [event_message_id],
           opmsg.[operation_id], 
           opmsg.[message_time],
           opmsg.[message_type],
           opmsg.[message_source_type],  
           opmsg.[message], 
           opmsg.[extended_info_id],
           eventmsg.[package_name],
           eventmsg.[event_name],

           message_source_name = 
                      CASE 
                        WHEN (opmsg.message_source_type = 10) THEN 'ISServerExec' 
                        WHEN (opmsg.message_source_type = 20) THEN 'Transact-SQL stored procedure'
                        ELSE eventmsg.message_source_name
                    END,
           eventmsg.[message_source_id],
           eventmsg.[subcomponent_name],
           eventmsg.[package_path],
           eventmsg.[execution_path],
           eventmsg.[threadID],
           eventmsg.[message_code]
FROM       [internal].[operation_messages] opmsg LEFT JOIN [internal].[event_messages] eventmsg
           ON opmsg.[operation_message_id] = eventmsg.[event_message_id]
WHERE      opmsg.[operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO


----------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[executable_statistics]    Script Date: 10/5/2016 8:14:02 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[executable_statistics]
AS
SELECT     [statistics_id], 
           [execution_id],
           [executable_id], 
           [execution_path], 
           [start_time],
           [end_time],
           [execution_duration], 
           [execution_result],
           [execution_value]
FROM       [internal].[executable_statistics]
WHERE      [execution_id] IN (SELECT id FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)



GO


----------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[executables]    Script Date: 10/5/2016 8:14:22 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[executables]
AS
SELECT DISTINCT    
           execl.[executable_id], 
           execs.[execution_id], 
           execl.[executable_name], 
           execl.[executable_guid],
           execl.[package_name],
           execl.[package_path]
FROM       ([internal].[executions] execs INNER JOIN [internal].[executable_statistics] stat 
           ON execs.[execution_id] = stat.[execution_id]) INNER JOIN [internal].[executables] execl
           ON stat.[executable_id] = execl.[executable_id] 
WHERE      execs.[execution_id] IN (SELECT id FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO

-------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[execution_component_phases]    Script Date: 10/5/2016 8:24:40 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER VIEW [catalog].[execution_component_phases]
AS
SELECT   startPhase.[phase_stats_id] AS [phase_stats_id],
         startPhase.[execution_id] AS [execution_id],
         startPhase.[package_name] AS [package_name],
         startPhase.[task_name] AS [task_name],
         startPhase.[subcomponent_name] AS [subcomponent_name],
         startPhase.[phase] AS [phase],
         startPhase.[phase_time] AS [start_time],
         endPhase.[phase_time] AS [end_time],
         startPhase.[execution_path] AS [execution_path]
FROM     [internal].[execution_component_phases] startPhase LEFT JOIN [internal].[execution_component_phases] endPhase
         ON startPhase.[phase_stats_id] != endPhase.[phase_stats_id]
         AND startPhase.[execution_id] = endPhase.[execution_id]
         AND startPhase.[sequence_id] = endPhase.[sequence_id]
WHERE    startPhase.[is_start] = 'True' AND (endPhase.[is_start] = 'False' OR endPhase.[is_start] IS NULL)
         AND (startPhase.[execution_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
         OR (IS_MEMBER('ssis_admin') = 1)
         OR (IS_SRVROLEMEMBER('sysadmin') = 1))
         OR (IS_MEMBER('ssis_logreader') = 1)

GO

--------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[execution_data_statistics]    Script Date: 10/5/2016 8:25:01 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER VIEW [catalog].[execution_data_statistics]
AS
SELECT    [data_stats_id],
          [execution_id],
          [package_name],
          [task_name],
          [dataflow_path_id_string],
          [dataflow_path_name],
          [source_component_name],
          [destination_component_name],
          [rows_sent],
          [created_time],
          [execution_path]
FROM      [internal].[execution_data_statistics]
WHERE     [execution_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
          OR (IS_MEMBER('ssis_admin') = 1)
          OR (IS_SRVROLEMEMBER('sysadmin') = 1)
          OR (IS_MEMBER('ssis_logreader') = 1)

GO

----------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[execution_data_taps]    Script Date: 10/5/2016 8:25:36 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER VIEW [catalog].[execution_data_taps]
AS
SELECT    [data_tap_id],
          [execution_id],
          [package_path],
          [dataflow_path_id_string],
          [dataflow_task_guid],
          [max_rows],
          [filename]
FROM      [internal].[execution_data_taps]
WHERE     [execution_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
          OR (IS_MEMBER('ssis_admin') = 1)
          OR (IS_SRVROLEMEMBER('sysadmin') = 1)
          OR (IS_MEMBER('ssis_logreader') = 1)

GO

--------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[execution_parameter_values]    Script Date: 10/5/2016 8:26:01 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[execution_parameter_values]
AS
SELECT     [execution_parameter_id], 
           [execution_id],
           [object_type], 
           [parameter_data_type], 
           [parameter_name], 
           [parameter_value], 
           [sensitive],
           [required],
           [value_set], 
           [runtime_override]
FROM       [internal].[execution_parameter_values]
WHERE      [execution_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[execution_property_override_values]    Script Date: 10/5/2016 8:26:24 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[execution_property_override_values]
AS
SELECT     [property_id], 
           [execution_id],
           [property_path], 
           [property_value], 
           [sensitive]
FROM       [internal].[execution_property_override_values]
WHERE      [execution_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

--------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[executions]    Script Date: 10/5/2016 8:26:52 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO




ALTER VIEW [catalog].[executions]
AS
SELECT     execs.[execution_id], 
           execs.[folder_name], 
           execs.[project_name], 
           execs.[package_name],
           execs.[reference_id],
           execs.[reference_type], 
           execs.[environment_folder_name], 
           execs.[environment_name], 
           execs.[project_lsn], 
           execs.[executed_as_sid], 
           execs.[executed_as_name], 
           execs.[use32bitruntime],  
           opers.[operation_type], 
           opers.[created_time],  
           opers.[object_type], 
           opers.[object_id],
           opers.[status], 
           opers.[start_time], 
           opers.[end_time],  
           opers.[caller_sid], 
           opers.[caller_name], 
           opers.[process_id], 
           opers.[stopped_by_sid], 
           opers.[stopped_by_name],
           opers.[operation_guid] AS [dump_id],
           opers.[server_name],
           opers.[machine_name],
           ossysinfos.[total_physical_memory_kb],
           ossysinfos.[available_physical_memory_kb],
           ossysinfos.[total_page_file_kb],
           ossysinfos.[available_page_file_kb],
           ossysinfos.[cpu_count]
FROM       [internal].[executions] execs INNER JOIN [internal].[operations] opers 
           ON execs.[execution_id]= opers.[operation_id]
           LEFT JOIN [internal].[operation_os_sys_info] ossysinfos
           ON ossysinfos.[operation_id]= execs.[execution_id]
WHERE      opers.[operation_id] IN (SELECT id FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

--------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[extended_operation_info]    Script Date: 10/5/2016 8:27:45 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[extended_operation_info]
AS
SELECT     [info_id], 
           [operation_id], 
           [object_name], 
           [object_type],
           [reference_id],
           [status], 
           [start_time], 
           [end_time]
FROM       [internal].[extended_operation_info]
WHERE      [operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)


GO

--------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[operation_messages]    Script Date: 10/5/2016 8:29:30 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[operation_messages]
AS
SELECT     [operation_message_id], 
           [operation_id], 
           [message_time],
           [message_type],  
           [message_source_type], 
           [message], 
           [extended_info_id]
FROM       [internal].[operation_messages] 
WHERE      [operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

-------------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[operations]    Script Date: 10/5/2016 8:29:55 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[operations]
AS
SELECT     [operation_id], 
           [operation_type], 
           [created_time],
           [object_type],
           [object_id],
           [object_name],
           [status], 
           [start_time], 
           [end_time], 
           [caller_sid], 
           [caller_name], 
           [process_id],
           [stopped_by_sid],
           [stopped_by_name],
           [server_name],
           [machine_name]
FROM       internal.[operations]
WHERE      [operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

----------------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[packages]    Script Date: 10/5/2016 8:31:07 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[packages]
AS
SELECT     pkgs.[package_id], 
           pkgs.[name], 
           pkgs.[package_guid], 
           pkgs.[description],
           pkgs.[package_format_version], 
           pkgs.[version_major],  
           pkgs.[version_minor], 
           pkgs.[version_build], 
           pkgs.[version_comments], 
           pkgs.[version_guid], 
           pkgs.[project_id],
           pkgs.[entry_point],
           pkgs.[validation_status],
           pkgs.[last_validation_time]
FROM       [internal].[packages] pkgs INNER JOIN [internal].[projects] proj ON 
           (pkgs.[project_version_lsn] = proj.[object_version_lsn] 
           AND pkgs.[project_id] = proj.[project_id]) INNER JOIN
           [internal].[object_versions] vers ON ( vers.[object_type] =20 AND
           vers.[object_id] = proj.[project_id] 
           AND vers.[object_version_lsn] = proj.[object_version_lsn])

WHERE      pkgs.[project_id] IN (SELECT [id] FROM [internal].[current_user_readable_projects])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

-------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[projects]    Script Date: 10/5/2016 8:31:31 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[projects]
AS
SELECT     proj.[project_id],
           [internal].[folders].[folder_id],
           proj.[name],
           proj.[description],
           proj.[project_format_version], 
           proj.[deployed_by_sid], 
           proj.[deployed_by_name], 
           proj.[last_deployed_time], 
           proj.[created_time],
           proj.[object_version_lsn],  
           proj.[validation_status], 
           proj.[last_validation_time]

FROM       [internal].[object_versions] ver INNER JOIN
           [internal].[projects] proj ON (ver.[object_id] = proj.[project_id]
           AND ver.[object_version_lsn] = proj.[object_version_lsn]) INNER JOIN
           [internal].[folders] ON proj.[folder_id] = [internal].[folders].[folder_id]
WHERE      (ver.[object_status] = 'C') 
           AND (ver.[object_type]= 20) 
           AND (
                  proj.[project_id] IN (SELECT [id] FROM [internal].[current_user_readable_projects])
                  OR (IS_MEMBER('ssis_admin') = 1)
                  OR (IS_SRVROLEMEMBER('sysadmin') = 1)
                  OR (IS_MEMBER('ssis_logreader') = 1)
                )


GO
-------------------------------------------------------------------------------------------------------------------

USE [SSISDB]
GO

/****** Object:  View [catalog].[validations]    Script Date: 10/5/2016 8:31:54 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER VIEW [catalog].[validations]
AS
SELECT     vals.[validation_id], 
           vals.[environment_scope], 
           vals.[validate_type],
           vals.[folder_name],
           vals.[project_name],         
           vals.[project_lsn],
           vals.[use32bitruntime],
           vals.[reference_id], 
           opers.[operation_type],
           opers.[object_name],  
           opers.[object_type], 
           opers.[object_id], 
           opers.[start_time], 
           opers.[end_time], 
           opers.[status], 
           opers.[caller_sid], 
           opers.[caller_name], 
           opers.[process_id],
           opers.[stopped_by_sid], 
           opers.[stopped_by_name],
           opers.[operation_guid] AS [dump_id],
           opers.[server_name],
           opers.[machine_name]
FROM       [internal].[validations] vals INNER JOIN [internal].[operations] opers 
           ON vals.[validation_id] = opers.[operation_id]
WHERE      opers.[operation_id] IN (SELECT [id] FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)
           OR (IS_MEMBER('ssis_logreader') = 1)

GO

-------------------------------------------------------------------------------------------------------------------
Chap Wolff
fonte
Isso é muito legal. Também optei por criar o papel de consistência com a forma como abordarei isso quando mudarmos para 2016. Obrigado pelo script.
Jason
Você é bem vindo. E, na realidade, você pode nomear o papel que quiser, eu fui com ssis_logreader para a consistência com versões posteriores
Chap Wolff
1

Eu tive o mesmo problema. Depois de examinar a consulta sublinhada com o foco na cláusula where ..

    WHERE      opmsg.[operation_id] in (SELECT [id] FROM [internal].   [current_user_readable_operations])
       OR (IS_MEMBER('ssis_admin') = 1)
       OR (IS_SRVROLEMEMBER('sysadmin') = 1)

Enquanto a consulta verifica a associação à função ssis_admin. Decidi conceder minha função report_reader à função de banco de dados ssis_admin.

Ao executar a consulta independente, recebi um erro de permissão de seleção. Por isso, concedi à função as permissões de seleção para o catálogo e esquemas internos.

GRANT SELECT ON SCHEMA::[catalog] TO ssis_admin;
GRANT SELECT ON SCHEMA::[internal] TO ssis_admin;

Espero que isso ajude alguém.

petemill66
fonte
1

No SQL Server 2014

Parece haver uma solução mais simples.

  1. Na pasta Segurança, crie um logon (Usuário ou Grupo AD).
  2. Defina as funções de servidor como "Público"
  3. Defina o mapeamento do usuário como "SSISDB"
  4. Nos Catálogos do Integration Services, navegue até a pasta que contém os pacotes nos quais você deseja executar relatórios
  5. Clique com o botão direito e selecione "Propriedades"
  6. Selecione "Permissões"
  7. Selecione "Procurar"
  8. Selecione o novo usuário / grupo que foi criado na etapa 1
  9. Conceda as permissões "Ler" e "Ler objetos".

Você Terminou.

Nota: Eu testei isso no SQL Server 2014 e funciona. Estou certo de que funcionará a partir de 2012.

J Weezy
fonte
0

Isso corrigiu meu problema. Recebi a correção de Petemill66, então obrigado

use SSISDB

CONCESSÃO SELECIONAR NO ESQUEMA :: [catalog] TO ssis_admin;

GRANT SELECT NO ESQUEMA :: [interno] TO ssis_admin;

GRANT update ON SCHEMA :: [catalog] TO ssis_admin;

GRANT update ON SCHEMA :: [internal] TO ssis_admin;

Duane Lawrence
fonte