Microsoft Dynamics CRM Unique Nonclustered Indexes - dynamics-crm

I've inherited a Dynamics CRM system at work, running: Version 1612 (8.2.2.112) (DB 8.2.2.112) on-premises.
We're in a situation where duplication seems to be happening intermittently via failed form submissions, with a subsequent re-submission. We've internally released a document explaining this behaviour and expressed how important it is to check first if some or all of the transaction actually succeeded. But humans will be humans, and often forget...
With that said, as a DBA, my first instinct was to create a unique constraint/index. However, it's not clear to me how to best accomplish this in the scope of Dynamics. I'm not confident in the application-level Duplication Detection that's available built-in, and Alternate Keys don't work for us since many of our unique constraints require the inclusion of a DATE field or two.
From what I can tell, adding indexes to the CRM base tables is a supported DML action, but indicates that it prevents upgrades. Does this mean that we can't upgrade in the future? Or simply that the indexes will not be migrated during the upgrade?
Are there better solutions that I'm missing, which offer database-level consistency and don't impede upgrades?

With on-premise CRM you can add indexes, and it does not specify that this does not extend to clustered indexes. I very strongly recommend indexing CRM databases for performance. Per the developers guide:
For Microsoft Dynamics 365 on-premises deployments, adding indexes is
supported per the guidelines in the Deploying and administering
Microsoft Dynamics CRM documentation. This applies to all Microsoft
Dynamics 365 databases and the Microsoft Dynamics 365 for Outlook
local database.
(I don't actually see anything related to indexes in the documentation mentioned above)
I am not sure which documentation you are referencing regarding upgrades not supporting these indexes, I have never experienced any difficulty upgrading CRM orgs with databases I indexed. However, there are apparently issues with upgrading to v9 related to full text indexes:
https://community.dynamics.com/crm/f/117/t/242951
Also if you ever move to CRM online, this entire approach will no longer work.
The approach which IS supported with all CRM environments is to write a synchronous pre-operation plugin which checks your uniqueness condition, and throws an InvalidPluginExecutionException. This exception can include a user friendly message which the user will receive in the standard error pop up window when they try to create a duplicate. This is guaranteed to be nicer experience than whatever happens when the application violates an index constraint.
I enforce contact email address uniqueness using this method and it works very nicely. I have a duplicate detection rule set up, and if the user ignores the duplicate warning and creates the contact anyway, they receive a message that duplicate email addresses are not allowed.

Related

Am I "Allowed" to add a default constraint directly to DB in Dynamics 365?

Wondering if anyone can help a total newbie to Dynamics 365. Have started working on an existing implementation of Dynamics 365 (on premise) and am told by current developers that under no circumstances can I amend a column in a table for one of our entities directly on the DB. I am simply wanting to default an INT column to value 1.
They tell me "Dynamics is a black box and you will be breaking the law if you amend directly". This can't be true can it?
Thanks for any advice you can offer.
Building on what Josh said, it is true that the Dynamics SQL database is a black box. Everything must be done through the API with the exception of creating custom indexes on tables and reading from the "Filtered" views.
(And with the new T-SQL endpoint in preview for the online product, you're able to run SQL select queries against an online org.)
The reason for this that all events in Dynamics go through the "platform" via messages. For example, you might have plugin or workflow automation that triggers on the Update of an Account. When the platform receives the "Update" message for an Account, it searches for subscribers to that event and runs any subscribed processes. If you write a change directly to an Account record in SQL, you deprive the platform of the opportunity to run its processes for that event.
And it is good to note that Microsoft uses the same event framework for internal events. So, if you say, "Well, I have no custom plugins or workflows running on the Update message for Accounts so I can edit Accounts directly in SQL." By doing so you'd still risk breaking an internal Microsoft process that triggers on that event.
In a nutshell the platform's need to process ALL events is why direct updates to the database are unsupported. If you do them, Microsoft will refuse to support your system.
Another consideration is that if you ever want to move to the Dynamics Online, writing to the database isn't even possible, so you'd have to redo any automation that relied on that. This is another reason why everyone generally accepts the need to customize their system in the supported way.
Do people occasionally do unsupported things, with good justification? Yes, perhaps most commonly in making unsupported changes to the UI. Even so, writing directly to the database is among the highest offenses to be avoided.
Back to your scenario... it can be jarring to discover that the SQL database is off limits for any direct writing or schema changes. Fortunately Dynamics provides many other automation "hooks" including client-side JavaScript, Business Rules, Power Automate Flows, workflows, and plugins (synchronous and asynchronous).
To set a default value in the UI, the options include a Business Rule and JavaScript. To set a default value in the database, a synchronous workflow or plugin would do the trick.
The Developer Guide is a good place to start.
This would be considered an “unsupported” customization by Microsoft. If it breaks something in the logic of the app, Microsoft won’t help you fix it. If you ever move to Online instead of On-premise, you won’t have this ability. The current developers are battle-hardened and are trying to help you. This is a very bad idea - better would be to create a plug-in on Create of that entity that sets up default values for null fields. This way your logic is in the app with all the other custom logic and is supported.

How to delete a user out of multiple instances of CRM Dynamics?

Need help with deleting a user out of 15 different instances of MS CRM Dynamics. Is there a faster way of doing this rather than deleting the person out one instance at a time?
Whether it is crm onpremise or online, deleting systemuser is not possible (atleast by supported way) & not recommended to do in unsupported way (like SQL Delete in onpremise).
You can remove all the security roles & teams she/he is part of (take care of all WF, records they own)
Only you can disable by doing so in onpremise or by revoking license in O365 portal to replicate in crmol
If the AD account is removed/disabled it should replicate in Dynamics
No way to do in bulk across organizations anyway
Edit:
Based on comments, C# Console application can be developed, to iterate through multiple CRM connection strings & issue a sdk Service call to target system user record in each instance.

Dynamics 365 - Monitor instance for Customization changes

We have a business requirement (more financial compliance requirement) to monitor our production instance for any updates/releases/changes. This is to meet audit obligations so that we can prove that all changes were performed only inside of established release processes ie. no one is making changes to the CRM instance outside of this.
To be clear we already have an established release management process, but the question is being asked if there was a way to monitor the CRM instance to prove that indeed no changes are being made outside of release management. We have a Dynamics 365 online instance. I've searched for something suitable but am not able to find anything so the question here is posed to get pointers / ideas on potential solutions to this problem or even pointers to where I could begin my research into potential solutions.
As a background, the CRM application has financial data and hence we have 'over the top' financial controls/legal obligations to meet and hence the requirement.
You can explore this Change Tracking Solution from MS Labs, basically to track all the Publish/Publish All from CRM org.
The Change Tracking solution helps in tracking down the details of changes on who updated an entity, JavaScript, assemblies and processes along with the time of update. This solution is built on Dynamics 365 and as well works on Dynamics CRM 2016 (Online/ On premises)
I never tried this, but this was from a team which I worked earlier in MS internally.
If this not fits you, you can implement a custom plugin on Publish and PublishAll messages yourself. Read more

Utilizing Workflow to Automatically Resolve a Case in Microsoft CRM (No User Input)

I have a logic question regarding the capabilities of automatically resolving Microsoft Dynamics 365 CRM (or similar platforms) cases. I utilize an Access database to create emails to send to customers with specific data, while copying my team email to keep track of communications in Microsoft CRM. This action creates a new case in my CRM, which I then need to "Work On" case, add my specific operational catalogs and affected contacts, then finish case as Resolved just to ensure tracking in the CRM system.
My team is currently testing out the capabilities of XML coding in the email which allows the CRM to automatically capture the case specifics described above, however they still need to go in and resolve each case at the end of the day.
After some research, I see that a workflow may be able to do this job of automatically Resolving cases. Is this a possible function for a workflow or plugin to do? Alternatively I have been told by my IT department that we need to have a robot built to complete this task, but I would like to keep this as efficient (and cost savvy) as possible. Any input or suggestions are greatly valued and appreciated.
Thank you!
There are two ways you can solve your problem.
If you want to close all the "CASES" by the day end you can schedule
a "System Workflow" that will execute daily at a specific time and
"Close/Resolve" all the open CASES in your system. Please find below
link on how to setup a "Schedule Workflow" in Dynamics CRM Create
Recursive or Scheduled Workflows in CRM
You can resolve specific cases on Dynamics CRM using C#. Please find below link on how to resolve case using C#.How to close cases in crm 2011 programmatically
Yes. Workflows can be used to close Case records in CRM
If you have the resources (staff) available to write CRM code, you can do it via Code (C#) as well

Visualise the Dynamics CRM database

I an new to both Dynamics CRM (Hosted) and LINQ, so please forgive my ignorance with this question...
I need to access some data stored in the CRM, but have no idea how to get at it. Normally I would open my SQL Management software and look around for the data, but I cant do that with the Hosted CRM data.
So.... My question is, is there anyway to visualise the 'database' to find the data I need to recal ???
Thanks in advance.
If you want manipulate the data of a CRM 2011 instance is necessary to follow some rules.
For CRUD and business operations you need use the CRM 2011 web services (also in combination with LINQ)
Is also possible (if you can connect to the DB) to read the data from Filtered Views, a Filtered View is a view mapped on a standard CRM entity (for example to read the data from the entity Account you can use the view FilteredAccount)
Read or modify the data directly from the tables is not supported.
If you want to know the structure of the entities you can use the Customization area inside CRM, or install the Metadata Browser (a solution available inside the CRM 2011 SDK) to see the attributes and the relationships.
A good starting point is always the CRM 2011 SDK, you can download here:
http://www.microsoft.com/en-us/download/details.aspx?id=24004
Inside you will find many examples (if you want to use LINQ check the early-bound ones) and the assemblies and tools for development.
Download the SDK and import the Metadata Browser managed solution (\sdk\tools\metadatabrowser\metadatabrowser_2_0_0_0_managed.zip) into your CRM Live instance.
You could also try downloading the database schema for the out-of-the-box database setup. Not really optimal but it might work for you.
You could also install a local version of Dynamics CRM (say in a virtual machine) for testing (either via MSDN or the free trial download.) This will give you SQL access to the database.
I recommend going with the Metadata Browser, which will probably get you the information that you need. Since the Metadata Browser is a managed solution you can install and remove it without impacting the Default Solution or any other solution in the organization.
Actually it turns out it is possible to work with the Dynamics CRM Online 'database' in much the same way as you can with any number of SQL Manager tools.
Linqpad4 - allows you to work with a number of environments and write your queries in VB, C# and even SQL.
It looks like a great tool, and has already helped me greatly, it certainly makes the Dynamics / LINQ scenario much easier to explore and learn about.
LinqPad4 can be downloaded here: [http://www.linqpad.net/]
and the driver(s) for Dynamics CRM can be downloaded here: [http://archive.msdn.microsoft.com/crmlinqpad]
I strongly recommend it.

Resources