【问题标题】:Query to find all views/charts owned or shared with a user in Dynamics 2013查询以查找在 Dynamics 2013 中拥有或与用户共享的所有视图/图表
【发布时间】:2025-11-23 06:55:02
【问题描述】:

有没有办法在 Dynamics 2013 中查看拥有或与用户共享的所有视图/图表? (数据库查询没问题。如果需要,我可以访问基表。

【问题讨论】:

    标签: dynamics-crm crm microsoft-dynamics dynamics-crm-2013


    【解决方案1】:

    @Ryan 的解决方案对我有很大帮助,但转录起来很痛苦。这是更可用格式的解决方案(稍作修改):

    DECLARE @userid varchar(100)
    SELECT @userid = 'domain\user'
    
    -- Get team membership for the user
    IF OBJECT_ID(N'tempdb.dbo.#UserAndTeams') IS NOT NULL DROP TABLE #UserAndTeams
    
    SELECT DISTINCT t.TeamId TeamOrUserId, t.[Name]
    INTO #UserAndTeams
    FROM
     TeamBase t
      INNER JOIN TeamMembership tm ON t.TeamId = tm.TeamId
      INNER JOIN SystemUserBase su ON su.SystemUserId = tm.SystemUserId
    WHERE
     su.DomainName = @userid
    
    INSERT INTO #UserAndTeams(TeamOrUserId, [Name])
    SELECT su.SystemUserId, su.Firstname + ' ' + su.Lastname [Name]
    FROM SystemUserBase su WHERE su.DomainName = @userid
    
    -- Get a union of all teams and this user
    IF OBJECT_ID(N'tempdb.dbo.#AllUsersAndTeams') IS NOT NULL DROP TABLE #AllUsersAndTeams
    
    SELECT t.TeamId TeamOrUserId, t.[Name] 
    INTO #AllUsersAndTeams
    FROM TeamBase t
    
    INSERT INTO #AllUsersAndTeams(TeamOrUserId, [Name])
    SELECT su.SystemUserId, su.Firstname + ' ' + su.Lastname [Name]
    FROM SystemUserBase su
    
    -- Extract share info from POA for selected entity types
    SELECT DISTINCT su.[Name] SharedWith, objectIds.[Type], objectIds.[Name] Objectname, aut.[Name] Ownername
    FROM
     PrincipalobjectAccess poa WITH (NOLOCK)
      INNER JOIN #UserAndTeams su WITH (NOLOCK) ON poa.PrincipalId = su.TeamOrUserId
      INNER JOIN
        (
          SELECT 'Chart' [Type], UserQueryVisualizationId id, [Name], OwnerId FROM UserQueryVisualizationBase WITH (NOLOCK)
          UNION SELECT 'View', UserQueryId id, [Name], OwnerId FROM UserQueryBase WITH (NOLOCK)
          UNION SELECT 'Report', ReportId, [Name], OwnerId FROM Report WITH (NOLOCK)
          UNION SELECT 'Dashboard', uf.userFormId id, [Name], OwnerId FROM UserForm uf WITH (NOLOCK) WHERE uf.[Type] = 0
        ) objectIds ON poa.ObjectId = objectIds.id
      INNER JOIN #AllUsersAndTeams aut ON objectIds.OwnerId = aut.TeamOrUserId
    ORDER BY
     objectIds.[Type], objectIds.[Name]
    

    【讨论】:

      【解决方案2】:

      我想出了这个程序:

      这适用于视图/仪表板和图表。如果用户可以通过团队成员访问项目,则会显示团队名称;如果直接与用户共享,则显示用户名。

      它需要为有权访问基表的用户运行。

      (我无法将完整的 SQL 发布到 Stack Overflow!它包含在附图中。)

      【讨论】:

        【解决方案3】:

        这实际上比你想象的要复杂——关于共享视图的信息包含在数据库的 principalobjectaccess 表中。

        此表包含正在共享的对象、共享对象以及他们对该对象的权限。

        困难的部分是包含要共享的对象的 guid 也没有指定要共享的对象类型。可以创建一个查询,将 POA 表连接到创建的视图,然后为该特定用户放入 where 子句......但要小心,不要在生产系统上运行它(如果你有确保在 POA 表上使用(nolock)。)

        抱歉,我无法提供更多帮助,但我没有使用 On-prem 并且无法测试查询。

        【讨论】:

        • POA 表确实在“ObjectTypeCode”列中包含目标对象类型。但POA只与观点分享有关,不查原主是谁