【问题标题】:Deleting users in CRM Dynamics 2011在 CRM Dynamics 2011 中删除用户
【发布时间】:2013-06-13 04:32:41
【问题描述】:

我完全清楚 Microsoft 不支持在 CRM Dynamics 2011 中删除用户(SystemUser 实体)。

不过,我们目前正在开发一种工具来支持我们的用户配置需求。为了能够为这个工具编写集成测试,之后似乎有必要能够删除用户,这样我们就可以将我们的测试环境回滚到原始状态。
目前,我们通过从 SQL 备份中恢复组织来实现这一点,但这对于每次测试运行来说都太耗时了。

更新

到目前为止,我们最好的解决方案是在集成测试中创建一个用户,断言我们需要断言的所有内容,然后通过禁用用户并删除其 AD 凭据来“清理”它,这样我们就可以重新- 使用这些凭据进行下一次测试。

但是,由于我们只是在寻找测试环境的解决方案,我真的很想有一个解决方案来正确清理所有内容:删除 SQL 中的记录似乎是可行的方法。但是,由于数据库结构复杂,我希望有人可以为此提供脚本。

更新2

我们已创建脚本以从 SQL 中手动删除用户(请参阅已接受的答案)。这是不支持,因此请仅在测试环境中使用它,前提是您知道自己在做什么。

【问题讨论】:

  • 为什么不直接禁用用户?
  • @GuidoPreite 因为我们正在测试围绕插入新用户构建的软件。如果我们禁用它们,我们仍然无法重新使用用户帐户来再次插入它。

标签: c# dynamics-crm-2011 dynamics-crm integration-testing microsoft-dynamics


【解决方案1】:

不支持,但是直接从 SQL 中删除记录怎么样?

我自己从未尝试过,我也不想在生产环境中进行,但如果只是为了测试/开发,最糟糕的情况就是你破坏了开发环境。

【讨论】:

  • 确实,我已经想到这可能是最简单的方法。但是:我希望有人以前做过,并且可以提供 SQL 脚本来执行此操作,因为这将是一个复杂的脚本。
【解决方案2】:

也许你可以试试这个解决方法。不要只是禁用它们,而是将活动目录名称更改为其他名称,然后禁用记录。

例如,您的脚本可能如下所示(假设 AD 身份验证):

创建 AD 用户 msmithbmillerjdoe

执行测试和验证。

msmith 更新为 testuser1
更新 bmillertestuser2
jdoe 更新为 testuser3

停用 testuser1testuser2testuser3

下一个测试需要用到testuser4testuser5testuser6,这意味着你需要创建不少虚拟账户,但这样做可能比弄乱 CRM SQL 数据库更容易。

对于我需要用户的单元测试,我实际上模拟了仅针对 SystemUser 请求的 IOrganizationService 调用,并返回一个模拟的 SystemUser 实体,而它实际上并没有触及 CRM。我也建议这样做,但听起来您正在尝试实际测试系统用户的创建,所以在这种情况下可能不是一个选项。

【讨论】:

  • 非常感谢您的回复。你的工作听起来确实可行。但是,这将要求我们记录我们已经创建了多少用户,并且它将使我们的 CRM 集成测试环境真正被旧的测试用户弄得一团糟。所以绝对是一个选择,但我认为并不理想。
  • 关于模拟用户:这种方法确实不是这个特定请求的选项,因为我们想测试 SystemUser 的创建。
  • @JorisVanRegemortel - 你不需要计算你已经创建了多少用户,你可以做一个查询,然后搜索最伟大的 testuser(可能想把他们命名为 testuser00001用于排序)。但同样,这可能是治疗比疾病更糟糕的情况(即,找出清理用户帐户所需的 SQL 比创建所有这些用户帐户更容易)
  • 同意最大用户数的查询,这将是最简单的方法。然而,这仍然留下了混乱的集成测试环境。 SQL 删除听起来仍然是一个更好的选择——尽管它不受支持。非常感谢您到目前为止的回复!
【解决方案3】:

您可以使用完全不受支持的方式通过 SQL 删除它们。
只要您在集成测试环境中执行此操作,我认为危害会相对较低。

要查找添加用户时数据库中发生的更改,您可以

  • 复制当前数据库
  • 添加用户
  • 将新的数据库状态与之前的状态进行比较(例如:redgate 的 SQL 比较)

每次汇总都可能发生这种变化,因此请确保不要将其用于任何关键或生产代码。

【讨论】:

  • 我也得出了同样的结论。但是,我不敢相信以前没有人这样做过。在我自己创建 SQL 之前,我会再给它一点时间 :)
【解决方案4】:

Microsoft 不支持以下脚本。使用它可能会损害、破坏、破坏或破坏您的 CRM 组织、部署、服务器和职业。
永远不要使用这个。
永远。

话虽如此,我们使用了它,并且它可以很好地用于我们的目的:在运行 AddSystemUser 测试后清理我们的测试环境。

需要记住的其他一些事项:

  • 我们正在使用 CRM Dynamics 2011 UR10 On-Premises
  • 我们的测试用户没有任何相关记录,只是一个孤立的用户
  • 我们正在使用 AD 身份验证
USE OrganizationName_MSCRM
BEGIN TRANSACTION
DECLARE @username AS VARCHAR(50)

-- CHANGE THIS -- 
SET @username = 'domain\username'
-- DONT CHANGE ANYTHING AFTER THIS --

DECLARE @userId AS UNIQUEIDENTIFIER
SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)

DECLARE @orgid AS UNIQUEIDENTIFIER
SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)

DECLARE @userEmail AS VARCHAR(MAX)
SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)

DECLARE @userfullname AS VARCHAR(max)
SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)

DECLARE @queueid AS UNIQUEIDENTIFIER
SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)

DECLARE @ownerid AS UNIQUEIDENTIFIER
SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)

DELETE FROM dbo.SystemUserExtensionBase WHERE SystemUserId = @userId
DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId
DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId
DELETE FROM dbo.SystemUserPrincipals WHERE systemuserid = @userId
DELETE FROM dbo.SystemUserRoles WHERE systemuserid = @userId
DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid
DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid
DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId
DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid
DELETE FROM dbo.QueueBase WHERE QueueId = @queueid
DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid
DELETE FROM dbo.PrincipalObjectAccess WHERE principalid = @ownerid
DELETE FROM dbo.OwnerBase WHERE ownerid = @ownerid
DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail
DELETE FROM dbo.ResourceBase WHERE name = @userfullname
DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)
DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId
DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId

DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid

COMMIT

【讨论】:

  • 我必须在您的脚本中添加两行。非常感谢顺便说一句!从 dbo.UserQueryBase 中删除 OwnerId = \@userid 从 dbo.SystemUserProfiles 中删除 SystemUserId = \@userId
【解决方案5】:

这是我在 CRM 2015 中基于 Joris 代码所做的工作

USED ORGANIZATIONNAME_MSCRM

BEGIN TRANSACTION

DECLARE @username AS VARCHAR(50)



-- CHANGE THIS --

SET @username = 'AD\USERNAME'

-- DONT CHANGE ANYTHING AFTER THIS --



DECLARE @userId AS UNIQUEIDENTIFIER

SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)



DECLARE @orgid AS UNIQUEIDENTIFIER

SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)



DECLARE @userEmail AS VARCHAR(MAX)

SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @userfullname AS VARCHAR(max)

SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)



DECLARE @queueid AS UNIQUEIDENTIFIER

SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)



DECLARE @ownerid AS UNIQUEIDENTIFIER

SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)



DECLARE @MSCRMUserID as UNIQUEIDENTIFIER

SET @MSCRMUserID = (SELECT Userid FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid)

DECLARE @authinfo as NVARCHAR(255)

SET @authinfo = (SELECT Authinfo FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)

DECLARE @SUid as UNIQUEIDENTIFIER

SET @Suid = (SELECT id FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)



DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserPrincipals WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserRoles WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid

DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid

DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId

DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId



DELETE FROM dbo.QueueMembership  WHERE SystemUserId = @userId

DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid

DELETE FROM dbo.QueueBase WHERE QueueId = @queueid



DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid

DELETE FROM dbo.PrincipalObjectAccess WHERE PrincipalId = @ownerid

DELETE FROM dbo.MailboxBase WHERE OwnerId = @ownerid

DELETE FROM dbo.OwnerBase WHERE OwnerId = @ownerid

DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail

DELETE FROM dbo.ResourceBase WHERE name = @userfullname

DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)

DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId

DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId



DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid

DELETE FROM mscrm_config..SystemUserAuthentication WHERE authinfo = @authinfo

DELETE FROM mscrm_config..SystemUser WHERE id = @MSCRMUserID



rollback

--COMMIT

运行查询并确保它删除了正确的数据后,您可以取消注释 COMMIT 语句并注释 Rollback 语句

希望对你有帮助。

【讨论】:

    【解决方案6】:

    只是对 Dynamics CRM 2016(本地)进行了一些细微的修改,以允许我遇到一些常见的约束错误。同样,这完全不受支持,风险自负。 (我会在发现其他约束错误时更新。)

    BEGIN TRANSACTION
    DECLARE @username AS VARCHAR(50)
    /* CHANGE THIS LINE ONLY */
    SET @username = 'DOMAIN\USERNAME'
    /* END CHANGES */
    DECLARE @userId AS UNIQUEIDENTIFIER
    SET @userId = (SELECT SystemUserId  FROM dbo.SystemUserBase WHERE DomainName = @username)
    DECLARE @orgid AS UNIQUEIDENTIFIER
    SET @orgid = (SELECT OrganizationId FROM dbo.SystemUserBase WHERE systemuserid = @userid)
    DECLARE @userEmail AS VARCHAR(MAX)
    SET @useremail = (SELECT InternalEMailAddress FROM dbo.SystemUserBase WHERE SystemUserId = @userid)
    DECLARE @userfullname AS VARCHAR(max)
    SET @userfullname = (SELECT fullname FROM dbo.systemuserbase WHERE systemuserid = @userid)
    DECLARE @queueid AS UNIQUEIDENTIFIER
    SET @queueid = (SELECT queueid FROM dbo.SystemUserBase WHERE SystemUserId = @userid)
    DECLARE @ownerid AS UNIQUEIDENTIFIER
    SET @ownerid = (SELECT ownerid FROM dbo.OwnerBase WHERE name = @userfullname)
    DECLARE @MSCRMUserID as UNIQUEIDENTIFIER
    SET @MSCRMUserID = (SELECT Userid FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid)
    DECLARE @authinfo as NVARCHAR(255)
    SET @authinfo = (SELECT Authinfo FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)
    DECLARE @SUid as UNIQUEIDENTIFIER
    SET @Suid = (SELECT id FROM mscrm_config..SystemUserAuthentication WHERE Userid = @MSCRMUserID)
    DELETE FROM dbo.UserSettingsBase WHERE SystemUserId = @userId
    DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId
    DELETE FROM dbo.SystemUserPrincipals WHERE SystemUserId = @userId
    DELETE FROM dbo.SystemUserRoles WHERE SystemUserId = @userId
    DELETE FROM dbo.SystemUserBusinessUnitEntityMap WHERE systemuserid = @userid
    DELETE FROM dbo.UserQueryBase WHERE OwnerId = @userid
    DELETE FROM dbo.SystemUserProfiles WHERE SystemUserId = @userId
    DELETE FROM dbo.TeamMembership WHERE SystemUserId = @userId
    DELETE FROM dbo.QueueMembership  WHERE SystemUserId = @userId
    update dbo.SdkMessageFilterBase set ModifiedOnBehalfBy = NULL where ModifiedOnBehalfBy = @userid
    update dbo.SdkMessageFilterBase set CreatedOnBehalfBy = NULL where CreatedOnBehalfBy = @userid
    DELETE FROM dbo.SystemUserBase WHERE SystemUserId = @userid
    DELETE FROM dbo.CalendarRuleBase WHERE CalendarId IN (SELECT CalendarId FROM dbo.CalendarBase WHERE PrimaryUserId = @userid)
    DELETE FROM dbo.CalendarBase WHERE primaryuserid = @userId
    DELETE FROM dbo.QueueBase WHERE QueueId = @queueid
    DELETE FROM dbo.PrincipalEntityMap WHERE PrincipalId = @ownerid
    DELETE FROM dbo.PrincipalObjectAccess WHERE PrincipalId = @ownerid
    DELETE FROM dbo.UserEntityUISettingsBase WHERE OwnerID = @userid
    DELETE FROM dbo.UserApplicationMetadataBase WHERE OwnerID = @userid
    DELETE FROM dbo.PostFollowBase WHERE OwnerID = @userid
    DELETE FROM dbo.MailboxBase WHERE OwnerId = @ownerid
    DELETE FROM dbo.OwnerBase WHERE OwnerId = @ownerid
    DELETE FROM dbo.EmailSearchBase WHERE EmailAddress = @userEmail
    DELETE FROM dbo.ResourceBase WHERE name = @userfullname
    DELETE FROM dbo.InternalAddressBase WHERE parentid = @userId
    DELETE FROM mscrm_config..SystemUserOrganizations WHERE CrmUserId = @userid AND OrganizationId = @orgid
    DELETE FROM mscrm_config..SystemUserAuthentication WHERE authinfo = @authinfo
    DELETE FROM mscrm_config..SystemUser WHERE id = @MSCRMUserID
    /* rollback */
    COMMIT
    

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多