<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ToolGBRMaker</title>
    <description>The latest articles on DEV Community by ToolGBRMaker (@toolgbrmaker).</description>
    <link>https://dev.to/toolgbrmaker</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F785760%2Fce3adb17-a5b3-443f-8ac1-ac6db09d728f.png</url>
      <title>DEV Community: ToolGBRMaker</title>
      <link>https://dev.to/toolgbrmaker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/toolgbrmaker"/>
    <language>en</language>
    <item>
      <title>Table Trigger | SQL</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Sun, 21 Aug 2022 15:12:55 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/table-trigger-sql-11oa</link>
      <guid>https://dev.to/toolgbrmaker/table-trigger-sql-11oa</guid>
      <description>&lt;p&gt;Let’s continue to improve our sample database, now by adding a table trigger on one of our tables.&lt;/p&gt;

&lt;p&gt;The triggers can be either INSERT, UPDATE or DELETE clause when we speak in terms of &lt;strong&gt;D&lt;/strong&gt; ata &lt;strong&gt;M&lt;/strong&gt; anipulation &lt;strong&gt;L&lt;/strong&gt; anguage. Its execution part usually contains a store procedure or a batch.&lt;/p&gt;

&lt;p&gt;For demonstration purposes, let’s add two new columns to our customer table on our sample Database. (If you want to follow the next step and you missed the table creation, please check the following &lt;a href="https://dev.to/toolgbrmaker/create-a-table-sql-1hh4"&gt;post&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mfn9_N7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-10.png%3Fw%3D412" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mfn9_N7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-10.png%3Fw%3D412" alt="" width="412" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Current Customer’s Table schema&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ogxYA7p1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-13.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ogxYA7p1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-13.png%3Fw%3D1024" alt="" width="880" height="171"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;ALTER TABLE to add columns to Customer’s table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now that we have two new columns it’s time to add our table trigger, it will be a simple one that will update &lt;strong&gt;LastModificationDate&lt;/strong&gt; column every time an update is performed for this table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2hrshmJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-14.png%3Fw%3D931" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2hrshmJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-14.png%3Fw%3D931" alt="" width="880" height="350"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;CREATE TRIGGER statement – example&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ryFw1H2U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-4.png%3Fw%3D267" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ryFw1H2U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-4.png%3Fw%3D267" alt="" width="267" height="296"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Object Explorer View&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ll now import a few more Customers to my table by using the CSV importation already learned here in this &lt;a href="https://dev.to/toolgbrmaker/importing-data-by-csv-sql-i0k"&gt;post&lt;/a&gt;. (Please have a look if you missed that one!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_SE2MHUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-15.png%3Fw%3D706" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_SE2MHUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-15.png%3Fw%3D706" alt="" width="706" height="138"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Data belonging to the CSV file to be imported&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0fFv7VeC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-1.png%3Fw%3D694" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0fFv7VeC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-1.png%3Fw%3D694" alt="" width="694" height="264"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;All the dataset from the Customer’s table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now that we have these two new columns and our new DML trigger, let’s test it by changing something on one of our rows. I think that nowadays Portuguese president should be annoyed by my mistake on his last name and is looking forward to the correction from “Sousa” to “de Sousa”. &lt;strong&gt;( Sorry Professor :D)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--phqOFxcK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-2.png%3Fw%3D317" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--phqOFxcK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-2.png%3Fw%3D317" alt="" width="317" height="197"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;UPDATE customer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After running our column update, if we select all table rows we’ll be able to find that LastModificationDate is now updated for the update execution DateTime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q5JZ4wQ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-3.png%3Fw%3D734" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q5JZ4wQ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/08/image-3.png%3Fw%3D734" alt="" width="734" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;All the dataset from the Customer’s table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let me know if any doubt remained and stay safe!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dmltrigger</category>
      <category>sqltrigger</category>
      <category>updatestatement</category>
    </item>
    <item>
      <title>Accessing SQL Database | PowerShell</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Mon, 02 May 2022 18:03:59 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/accessing-sql-database-powershell-37g8</link>
      <guid>https://dev.to/toolgbrmaker/accessing-sql-database-powershell-37g8</guid>
      <description>&lt;p&gt;The title couldn’t be more explanatory. During this post, we’ll see how we can access the database, and select data, by PowerShell.&lt;/p&gt;

&lt;p&gt;Let me try to guess…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But why!?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, besides for pure thirst for knowledge of how we can do fancy things :D, could pass through, by using this way of access, to store data through a PowerShell script, like, log entries storage, metrics from system, display the dataset results on a html page, etc.&lt;/p&gt;

&lt;p&gt;First things first, so to be able to communicate with the aimed database we need to establish one connection, and for that, I’ll use the following lines…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SSoVavPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image.png%3Fw%3D1005" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SSoVavPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image.png%3Fw%3D1005" alt="" width="880" height="298"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Connecting to the aimed SQL database through System.Data.SqlClient DLL (.SqlConnection)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A brief explanation of what has been made so far.&lt;/p&gt;

&lt;p&gt;On the first line, I’ve built my connection string, adding my SQL server and the database that I’m trying to establish my connection. The server can be easily found by running Microsoft SQL Server Management Studio and on the view tab by selecting registered servers, or by querying the function &lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/servername-transact-sql?view=sql-server-ver15"&gt;@@ServerName&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8UxqoYK1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-1.png%3Fw%3D318" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8UxqoYK1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-1.png%3Fw%3D318" alt="" width="318" height="127"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;SELECT @@SERVERNAME AS ‘Server Name’&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Afterward, I’m starting to instantiate the DLL that will be used to perform the connection. In the above example, we are using the DLL &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection?view=dotnet-plat-ext-6.0"&gt;System.Data.SqlClient&lt;/a&gt;, after being instantiated will grab the connection string and open/close the communication.&lt;/p&gt;

&lt;p&gt;And that’s it, your connection was established and closed (if you gave it a try to run the script shared so far). Now it’s time to get something from this connection. Let’s select some data from our Database.&lt;/p&gt;

&lt;p&gt;The query that I’ll within on my PowerShell script is the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvVFrDuf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-3.png%3Fw%3D406" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvVFrDuf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-3.png%3Fw%3D406" alt="" width="406" height="133"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;SELECT * FROM customer WHERE CountryCode = ‘FR’&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Do you remember that I inserted this record in this blog &lt;a href="https://dev.to/toolgbrmaker/importing-data-by-csv-sql-i0k"&gt;post&lt;/a&gt;? Looks like I was guessing that he would be elected for the second term of France’s presidency. I’m feeling like an oracle… Do you want to know anything about your future!? &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qgur0s-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qgur0s-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Time to pass this query to our PowerShell script. For that I’ve used the following lines of code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjy8EPqA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-4.png%3Fw%3D598" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjy8EPqA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-4.png%3Fw%3D598" alt="" width="598" height="188"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Command that will run on SQL database through System.Data.SqlClient DLL (.SqlCommand)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A little bit of context of what has been made above. So, we’re still using the &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection?view=dotnet-plat-ext-6.0"&gt;System.Data.SqlClient&lt;/a&gt; but this time, rather than be establishing the connection, we’re instancing the command that will run on our pre-established connection and store the result dataset on a PowerShell object named &lt;strong&gt;$reader&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As the last step, we need to ensure that we loop our dataset and print the data returned from our SQL Command. For that I’ve used the following lines of code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--azhkuria--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-5.png%3Fw%3D630" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--azhkuria--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-5.png%3Fw%3D630" alt="" width="630" height="266"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Looping through the Data Set&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s see what our script returns after being executed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DTzRdau---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-6.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DTzRdau---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-6.png%3Fw%3D1024" alt="" width="880" height="511"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our entire script&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s pursue excellence… Let’s build a PowerShell function with the above lines, and from that point on, you’ll be able to use parameters that, for example, will get different dataset results based on filter switching. If you’ve doubts of how to do it, please jump to the following blog &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/building-a-function-powershell-12d5"&gt;post&lt;/a&gt;&lt;/strong&gt; where you’ll get useful hints of the steps to follow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WB6z9LNb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-7.png%3Fw%3D987" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WB6z9LNb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-7.png%3Fw%3D987" alt="" width="880" height="896"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our Get-CustomersFromSampleDB PowerShell function&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s invoke the function, once, without parameters, and see what we get.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qahjIAq5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-8.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qahjIAq5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-8.png%3Fw%3D1024" alt="" width="880" height="524"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Get-CustomersFromSampleDB&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And now by using a country code as a parameter…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9WNJxC7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-9.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9WNJxC7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/05/image-9.png%3Fw%3D1024" alt="" width="880" height="536"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Get-CustomersFromSampleDB -CountryCode ‘PT’&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And I’m happy with what has been achieved. A simple example of how you can connect to your database and get data from it.&lt;/p&gt;

&lt;p&gt;I hope that helped! Stay safe!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>powershell</category>
      <category>mssql</category>
      <category>sqlconnection</category>
    </item>
    <item>
      <title>Quick Tip: Establishing PowerShell Remote Session – Docker Container</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Tue, 19 Apr 2022 16:04:38 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/quick-tip-establishing-powershell-remote-session-docker-container-4d2d</link>
      <guid>https://dev.to/toolgbrmaker/quick-tip-establishing-powershell-remote-session-docker-container-4d2d</guid>
      <description>&lt;p&gt;The title is quite self-explanatory, so, if you want to establish a remote session from PowerShell, running on your host, to the PowerShell, running on your container, just follow the next steps.&lt;/p&gt;

&lt;p&gt;As the first step, we’ll need to get the Container ID, the necessary parameter to use on the cmdlet &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/enter-pssession?view=powershell-7.2"&gt;Enter-PSSession&lt;/a&gt;&lt;/strong&gt; to perform the remote session.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zFpzwdgi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/04/image.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zFpzwdgi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/04/image.png%3Fw%3D1024" alt="" width="880" height="185"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;docker ps –no-trunc&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Afterward, we need to copy-paste the ID highlighted on the above image and perform the next step to end with the remote session established.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--se5DLjAY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/04/image-1.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--se5DLjAY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/04/image-1.png%3Fw%3D1024" alt="" width="880" height="312"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Enter-PSSession -ContainerId $ContainerID -RunAsAdministrator&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And that’s it, remote session established… From this point on you’ll be able to run your cmdlets in your container from your host machine.&lt;/p&gt;

&lt;p&gt;I hope that helped! Stay safe!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>powershell</category>
      <category>container</category>
      <category>enterpssession</category>
    </item>
    <item>
      <title>Quick Tip: Importing new license – Docker Container | Business Central</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Fri, 25 Mar 2022 18:41:47 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/quick-tip-importing-new-license-docker-container-business-central-14mp</link>
      <guid>https://dev.to/toolgbrmaker/quick-tip-importing-new-license-docker-container-business-central-14mp</guid>
      <description>&lt;p&gt;A few days ago, I’ve faced the following error when I attempted to open my Business Central instance from my Docker Container:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your program license has expired.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s see what steps I’ve adopted to import the license on my Docker Container.&lt;/p&gt;

&lt;p&gt;First, I’ve copied the license, that I want to import, from my host to my Docker Container by doing the following command:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zSZkO2am--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-11.png%3Fw%3D944" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zSZkO2am--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-11.png%3Fw%3D944" alt="" width="880" height="105"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Docker cp “C:\Bruno_s Documents\Licenses\license.flf” bcsandbox17:c:\Run\license.flf&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before moving on, a quick check if the command was well succeeded…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G1Q6CHnq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-12.png%3Fw%3D748" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G1Q6CHnq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-12.png%3Fw%3D748" alt="" width="748" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that I’m sure that the license file is there, on my container, is time to import it to the aimed instance, by using the following cmdlet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--14Du_fNf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-13.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--14Du_fNf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-13.png%3Fw%3D1024" alt="" width="880" height="119"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Import-NAVServerLicense -LicenseFile “C:\Run\license.flf” -ServerInstance bc -Force&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By executing the above cmdlet you’ll end with your license imported, but to see reflected the upload in the Business Central you’ll require to restart your instance. If you don’t remind how to do it please jump until the following &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/get-service-cmdlet-continuation-powershell-59p"&gt;post&lt;/a&gt;&lt;/strong&gt; and you’ll be able to find how to do it.&lt;/p&gt;

&lt;p&gt;I hope that this helped. Stay safe!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dynamicnavbc</category>
      <category>powershell</category>
      <category>expired</category>
    </item>
    <item>
      <title>Importing data by CSV | SQL</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Mon, 14 Mar 2022 20:01:33 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/importing-data-by-csv-sql-i0k</link>
      <guid>https://dev.to/toolgbrmaker/importing-data-by-csv-sql-i0k</guid>
      <description>&lt;p&gt;Let’s continue improving our &lt;strong&gt;SampleTest&lt;/strong&gt; database, today by creating a new table and importing data to it by using a CSV file.&lt;/p&gt;

&lt;p&gt;The new table will store the country details that we will use to relate with our customer table, already created on the &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/create-a-table-sql-1hh4"&gt;post&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Schema creation…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwAm4NaN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-5.png%3Fw%3D526" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwAm4NaN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-5.png%3Fw%3D526" alt="" width="526" height="226"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Country table creation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9ZB4Abwy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-6.png%3Fw%3D402" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9ZB4Abwy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-6.png%3Fw%3D402" alt="" width="402" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, that we have our table schema, it’s time to import some data, I’ve created a CSV file with the following rows…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oTq8-42N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-2.png%3Fw%3D312" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oTq8-42N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-2.png%3Fw%3D312" alt="" width="312" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and to perform the data importation the following script:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qe5UeigW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-3.png%3Fw%3D523" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qe5UeigW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-3.png%3Fw%3D523" alt="" width="523" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above we are invoking a &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver15"&gt;Bulk Insert&lt;/a&gt;&lt;/strong&gt; for our new table Country and the data used for insertion is the one stored on our CSV file. Afterward, on our With clause we are configurating some settings to be considered during the data reading on CSV file, although I’m considering that the settings are quite easy to understand, I would like to highlight the FIRSTROW, where we are saying that due to our column headers on the file, should only considered the data from the 2nd row on.&lt;/p&gt;

&lt;p&gt;Time to see if the data ended as expected…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dzOn92hX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-4.png%3Fw%3D206" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dzOn92hX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-4.png%3Fw%3D206" alt="" width="206" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the last step, let related now this new table with our &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/create-a-table-sql-1hh4"&gt;Customer&lt;/a&gt;&lt;/strong&gt; table, by &lt;strong&gt;CountryCode&lt;/strong&gt; field. For that, we will use the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver15"&gt;ALTER TABLE&lt;/a&gt;&lt;/strong&gt; statement where we’ll add a Constraint, Foreign Key and we’ll referrer for the field we want on table Country.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T54_xc_r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-7.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T54_xc_r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-7.png%3Fw%3D1024" alt="" width="880" height="47"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Creating Relation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Time to test this new relation. I’ll now add a row with a non-existent country and see if an error is now invoked as supposed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O08X6Hfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-8.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O08X6Hfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-8.png%3Fw%3D1024" alt="" width="880" height="201"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The new relation is now blocking non-existent countries on Country table for the Customer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now a test with an existent country…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N3zEfgkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-10.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N3zEfgkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/03/image-10.png%3Fw%3D840" alt="" width="840" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s it. With the above importation, we can easily add data that can be used to relate with our existent table Customer. Time to try by yourself and let me know the results.&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>bulkinsert</category>
      <category>csv</category>
      <category>dataintegration</category>
    </item>
    <item>
      <title>Automated Testing for your scripts – Pester | PowerShell</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Tue, 15 Feb 2022 18:41:05 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/automated-testing-for-your-scripts-pester-powershell-4847</link>
      <guid>https://dev.to/toolgbrmaker/automated-testing-for-your-scripts-pester-powershell-4847</guid>
      <description>&lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt;  5.1.x&lt;/p&gt;

&lt;p&gt;This post will be fully dedicated to how you can automate tests for your PowerShell scripts. As a scenario, you have written some new code or modified some old code and now you want to test these changes, in an automated way, before putting them in the Production environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introducing &lt;a href="https://github.com/pester/Pester/wiki"&gt;Pester&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki"&gt;Pester&lt;/a&gt;&lt;/strong&gt; is one testing and mocking framework for PowerShell that’ll provide you with a framework for writing and running tests. Its a open source project that’s bundled with Windows 10 and later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we’ll test?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since we are introducing this automated testing concept and we need a script to test, why not use something already created on this blog!? Therefore, we’ll test the function created during the post &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/building-a-function-powershell-12d5"&gt;“Building a function | Powershell”&lt;/a&gt;&lt;/strong&gt; (If you didn’t read it, now its a good time for it, otherwise will be hard to understand the reason of our tests).&lt;/p&gt;

&lt;p&gt;As the first step, we need to load the Pester module and create a new text fixture to allow us test our scripts. For that we will use the following cmdlets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Import-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pester&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;testOurServiceFunction&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-Fixture&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;testOurServiceFunction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nn0E9r4f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-4.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nn0E9r4f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-4.png%3Fw%3D1024" alt="" width="880" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice, on the above image, you should end with two PowerShell script files… One for your code and the other where you’ll built your testing conditions.&lt;/p&gt;

&lt;p&gt;Let’s focus mainly on the &lt;strong&gt;Set-ServiceRunningStatus.Tests.ps1&lt;/strong&gt;. Here, if you open your file, you should have something similar to the following…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$here&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Split-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$MyInvocation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MyCommand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Path&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$sut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Split-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Leaf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$MyInvocation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MyCommand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\.Tests\.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$here&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;$sut&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Describe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Set-ServiceRunningStatus"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"does something useful"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Should&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explaining a bit of what you have on your test script… The first three commands are to link the test code with your code script. The next two sections are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/Describe"&gt;Describe&lt;/a&gt;&lt;/strong&gt; – This block is designed to contain a set of tests. Since we’re introducing this automated test concept we’ll only stick with this one, but more complex are your tests, more often will be to have multiple &lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/Describe"&gt;Describe&lt;/a&gt;&lt;/strong&gt; blocks;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/It"&gt;It&lt;/a&gt;&lt;/strong&gt; – This block represents a single test where your code will either pass or fail. A &lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/Describe"&gt;Describe&lt;/a&gt;&lt;/strong&gt; block often contains many &lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/It"&gt;It&lt;/a&gt;&lt;/strong&gt; blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How we’ll test?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First things first, we’ll start by mocking the principal “actions” from our script and are they, Restart and Start services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Mock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Mock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, we will be able to get a counter of actions triggered and we can compare with what we are testing for the moment of our &lt;strong&gt;&lt;a href="https://github.com/pester/Pester/wiki/It"&gt;It&lt;/a&gt;&lt;/strong&gt; clause.&lt;/p&gt;

&lt;p&gt;Let’s start with a basic test… Our goal will be &lt;strong&gt;“accepts and restarts one running service”&lt;/strong&gt; and the way we will achieve it will be by using the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accepts and restarts one running service"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="n"&gt;Assert-MockCalled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Exactly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the above test, we are looking for a restart on running services with Name that includes &lt;strong&gt;_W1&lt;/strong&gt; string and counting the ones that will be impacted. After that, we will invoke our function and check with the &lt;strong&gt;&lt;a href="https://pester-docs.netlify.app/docs/commands/Assert-MockCalled"&gt;Assert-MockCalled&lt;/a&gt;&lt;/strong&gt; if the number of restart are coincident with the number of Running Services with name that includes &lt;strong&gt;_W1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s execute and see the results so far…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xsg-LfUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-5.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xsg-LfUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-5.png%3Fw%3D1024" alt="" width="880" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, so far so good, 1 out of 1 passed. But how much, quantitively, I’ve covered in my script with the last test!?&lt;/p&gt;

&lt;p&gt;Let’s see by using the parameter -CodeCoverage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;invoke-pester&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-CodeCoverage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\Set-ServiceRunningStatus.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yIGFItYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-7.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yIGFItYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-7.png%3Fw%3D1024" alt="" width="880" height="724"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have half of the script, tested. As you can see, besides having the covered percentage we have also the missed commands so far. Let’s give it a try to add more tests and try to cover more amount of the script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accepts and restarts multiple running services"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Pharma*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Pharma*'&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="n"&gt;Assert-MockCalled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Exactly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accepts and restarts one running service"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Assert-MockCalled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Exactly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 

    &lt;/span&gt;&lt;span class="n"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accepts and restarts one running service on a Computer"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'PTPOPF247203'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'PTPOPF247203'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*_W1*'&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Assert-MockCalled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Exactly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;It&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a few more, like the above ones, we have been able to achieve the following coverage:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh9j21oT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-8.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh9j21oT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-8.png%3Fw%3D1024" alt="" width="880" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s it. Lightly we have been able to see how to test our PowerShell scripts and automate this annoying task… At least for me, it is an annoying one.&lt;/p&gt;

&lt;p&gt;We have also been able to see a metric of the code covered by our tests and have a guide of how to achieve better tests and inherently, better solutions with this testing framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Besides internet references, I’ve also used the learning concepts acquired in the following &lt;strong&gt;&lt;a href="https://www.amazon.com/gp/product/1617295094/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1617295094&amp;amp;linkCode=as2&amp;amp;tag=toolgbrmaker2-20&amp;amp;linkId=afa15f19fc0419a6851496e32f39b370"&gt;book&lt;/a&gt;&lt;/strong&gt;. I advise it as good reading.&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>automatedtest</category>
      <category>mock</category>
      <category>pester</category>
    </item>
    <item>
      <title>Quick Tip: OUTPUT clause – Good Policy | SQL</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Wed, 02 Feb 2022 19:20:06 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/quick-tip-output-clause-good-policy-sql-10c5</link>
      <guid>https://dev.to/toolgbrmaker/quick-tip-output-clause-good-policy-sql-10c5</guid>
      <description>&lt;p&gt;Let’s check how the OUTPUT clause can save the day if we, after an update, may want to revert what has been updated.&lt;/p&gt;

&lt;p&gt;Imagine that we have the following output from a customer table on the SQL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Fr_-ztr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image.png%3Fw%3D409" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Fr_-ztr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image.png%3Fw%3D409" alt="" width="409" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we decided to switch all the customers with the first name &lt;strong&gt;“Antonio”&lt;/strong&gt; to &lt;strong&gt;“António”&lt;/strong&gt;. A simple update query like the following could achieve what we’re looking for…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kf7VYj2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-2.png%3Fw%3D412" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kf7VYj2A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-2.png%3Fw%3D412" alt="" width="412" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, happens something completely unexpected in the TI world (or not!!!)… Well, customers are not pleased with their name change and want to get them back on our database. But which ones have been changed?&lt;/p&gt;

&lt;p&gt;Time to use the &lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15"&gt;OUTPUT&lt;/a&gt; clause on our update queries. If you use it, you’ll get an output of all the entries that have been changed and back up that information to be reused after, if needed. See the next example of how can be used on the above example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TcEoTZqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-3.png%3Fw%3D634" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TcEoTZqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/02/image-3.png%3Fw%3D634" alt="" width="634" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can copy, save, extract, etc., your result to backup file and use it whenever needed.&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>clause</category>
      <category>mssql</category>
      <category>output</category>
    </item>
    <item>
      <title>How to foresee potential lockings on your tables | Business Central</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Tue, 01 Feb 2022 17:31:04 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/how-to-foresee-potential-lockings-on-your-tables-business-central-2ep1</link>
      <guid>https://dev.to/toolgbrmaker/how-to-foresee-potential-lockings-on-your-tables-business-central-2ep1</guid>
      <description>&lt;p&gt;What a beautiful code I just finish to create… Let’s skip the tests… Put it in a Prod environment and hope for the best. &lt;strong&gt;Booommmmmmmmm&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Well, not so frequently nowadays, but, in a rush, is still happening, right!? You don’t need to answer… Even though you tend to say that it’s a lie, it still happens. I know!&lt;/p&gt;

&lt;p&gt;To get even worst, the above, it’s quite complex to anticipate the process concurrency on the SQL side when our queries are being triggered from Business Central, but let’s give you an example of how to mitigate these potential locking issues, pandemic is affecting us in so many ways :), and help you with some examples where you can avoid, or at least investigate if your code is the one increasing the locks on the Prod Environment.&lt;/p&gt;

&lt;p&gt;Business Central is a friendly environment for the developers, if you look at the queries that it generates and request to the SQL side, you’ll be able to see frequently on data consults/reads, the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15#arguments"&gt;(WITH READUNCOMMITTED)&lt;/a&gt;&lt;/strong&gt; that allows dirty reads of data, even that you are with any locking transaction affecting the table that you’re reading. The &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15#arguments"&gt;NOLOCK&lt;/a&gt;&lt;/strong&gt;, with argument, is the equivalent to the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15#arguments"&gt;READUNCOMMITTED&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s see an example of it…&lt;/p&gt;

&lt;p&gt;Imagine that I want to log some integrations executions on my business central solution and I’ve created the following table structure to store my data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---IlFvQwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-17.png%3Fw%3D736" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---IlFvQwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-17.png%3Fw%3D736" alt="" width="736" height="1023"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Table Structure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Attached to this table object, I’ve created a listing page to show the data on it, and a codeunit with some functions to manipulate the data and “imitate” common data processing on this sort of table/entity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fK9uLJt4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-18.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fK9uLJt4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-18.png%3Fw%3D1024" alt="" width="880" height="496"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Page View – with some actions&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have now my scenario prepared and I have added, through the functions attached to my page, a big combo of entries to increase my available dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potential scenario:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have this dataset and I have set a job to process these pending entries. This job will look for datasets based on Direction, Message Type, and Status fields. To simulate this potential scenario I have created the following procedure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c_3UiMGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-21.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c_3UiMGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-21.png%3Fw%3D1024" alt="" width="880" height="479"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Set All Processed – Procedure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you look carefully at my procedure, you’ll be able to see that I’ve used the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-findset-method"&gt;Findset&lt;/a&gt;&lt;/strong&gt; method with the boolean &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-findset-method#syntax"&gt;ForUpdate&lt;/a&gt;&lt;/strong&gt; parameter set as true. It’s a fact that I’m intended to update my data, so should be harmless to use, isn’t it?&lt;/p&gt;

&lt;p&gt;In all the deals, we should always pay attention to all the small letters, to avoid surprises, and even that in here they are not in small size, the letters of course, if you look carefully on the Microsoft documentation for Findset parameters you’ll find that if the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-findset-method#syntax"&gt;ForUpdate&lt;/a&gt;&lt;/strong&gt; parameter is set to true, promising us that will reach the optimal performance for our loop, but in parallel, the parameter will immediately run the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-locktable-method"&gt;LOCKTABLE&lt;/a&gt;&lt;/strong&gt; method.&lt;/p&gt;

&lt;p&gt;Now, let’s see this in action… I’ve chosen an entry and I’ve triggered for the first time the &lt;strong&gt;SetAllProcessed&lt;/strong&gt; action. Let’s see the results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L-7KuFoE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-22.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L-7KuFoE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-22.png%3Fw%3D1024" alt="" width="880" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-locktable-method"&gt;LOCKTABLE&lt;/a&gt;&lt;/strong&gt; method was active on our loop what will happen if we query our table on the SQL side in the meantime?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CRONUS&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;IntegrationLog&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;a84606c8&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7725&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;ecb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9237&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;fb9bd1bf179&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code execution will be waiting until the Business Central &lt;strong&gt;SetAllProcessed&lt;/strong&gt; action be completed because is blocked by the lock established for this table/entity. As proof of it, see the following result from &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-who-transact-sql?view=sql-server-ver15"&gt;sp_who2&lt;/a&gt;&lt;/strong&gt; SQL procedure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F4ZElI93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-23.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F4ZElI93--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-23.png%3Fw%3D1024" alt="" width="880" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is where Business Central is a friendly environment to the developer, let’s perform the same query, during &lt;strong&gt;SetAllProcessed&lt;/strong&gt; action, but this time invoked by the Business Central, or more precisely from PowerShell… I’ve used this approach to have other session requesting processes actions on the table IntegrationLog. For that, I’ve created the following procedure and the following PowerShell script.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mF9kmhOM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-25.png%3Fw%3D673" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mF9kmhOM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-25.png%3Fw%3D673" alt="" width="673" height="289"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Get All Entries On Integration Log – Procedure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fTA2wwUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-26.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fTA2wwUT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-26.png%3Fw%3D1024" alt="" width="880" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you look for the SQL query created for the above invocation you’ll find that no lock occurred because…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NSWyi9wd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-37.png%3Fw%3D833" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NSWyi9wd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-37.png%3Fw%3D833" alt="" width="833" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?redirectedfrom=MSDN&amp;amp;view=sql-server-ver15#arguments"&gt;READUNCOMMITTED&lt;/a&gt;&lt;/strong&gt; is part of your business central query.&lt;/p&gt;

&lt;p&gt;The read is tested and it is “protected” against locks, which could potentially lead to other problems, like updating different data images, of the same entries on different transactions, but there is where &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/connect/ado-net/optimistic-concurrency?view=sql-server-ver15"&gt;Optimistic Concurrency&lt;/a&gt;&lt;/strong&gt; will help the day… Another subject for another post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potential lock:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, what will happen if, instead of reading data we try to update entries during &lt;strong&gt;SetAllProcessed&lt;/strong&gt; action execution? Let’s give it a new test, this time using the following two procedures…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oRBoUH4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-29.png%3Fw%3D852" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oRBoUH4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-29.png%3Fw%3D852" alt="" width="852" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gf97-MT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-30.png%3Fw%3D507" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gf97-MT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-30.png%3Fw%3D507" alt="" width="507" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both, are quite intuitive, the first is setting all the entries, with the same Direction and Message Type of the Record passed through a parameter, as these entries are in error. The second one, getting the entry to use as a model/parameter on my &lt;strong&gt;SetAllError&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Due to my default settings, that are remaining with the query timeout on 10 seconds, I’ll get the following results after the PowerShell invocation waited my defaulted 10 seconds…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--waboiXMW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-47.png%3Fw%3D1023" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--waboiXMW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-47.png%3Fw%3D1023" alt="" width="880" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The loop request made on &lt;strong&gt;SetAllProcessed&lt;/strong&gt; is blocking any other update attempt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exploring Solutions on this hypothetical scenario…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first thing that occurs me right now is… Well, if the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-findset-method#syntax"&gt;ForUpdate&lt;/a&gt;&lt;/strong&gt; parameter on the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-findset-method"&gt;Findset&lt;/a&gt;&lt;/strong&gt; is locking the table, let’s get rid of it on my procedure. So, my new approach for the procedure can be found on the next image (if you remember earlier we saw that with the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-locktable-method"&gt;LOCKTABLE&lt;/a&gt;&lt;/strong&gt; enabled, we should expect the optimal approach, therefore, with this new way of doing the things we must expect worst efficiency)…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--csurxgCg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-33.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--csurxgCg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-33.png%3Fw%3D1024" alt="" width="880" height="590"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Set All Processed – Procedure – new approach&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s see the execution time results for this new approach…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1XU8ePIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-34.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1XU8ePIc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-34.png%3Fw%3D1024" alt="" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More than 3 times slower, if we compare with when we locked the table. But wait, I can perfectly set this routine to be performed on a background session and live with this slowness, if this resolves my locking issue. Let’s give a new trial on the above execution and also execute another update transaction from the PowerShell invocation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---5Aaf7g3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-46.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---5Aaf7g3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-46.png%3Fw%3D1024" alt="" width="880" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait, wait, wait… What the heck!? Facing the same locking issue as before!? But I’m not with &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-locktable-method"&gt;LOCKTABLE&lt;/a&gt;&lt;/strong&gt; on… How is this possible?&lt;/p&gt;

&lt;p&gt;Since my scenario is operating a quite heavy dataset, the SQL tends to escalate the LockMode, when it is operating massive records, and if it reaches the X of exclusive it’ll behave exactly as if we set the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-locktable-method"&gt;LOCKTABLE&lt;/a&gt;&lt;/strong&gt;. With the help of the following query lets check if this is the case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--#############################################&lt;/span&gt;
&lt;span class="c1"&gt;--# Transaction With LockMode Exclusive #&lt;/span&gt;
&lt;span class="c1"&gt;--#############################################&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SessionData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;spid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;RIGHT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;charindex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_mode&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;LockMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logical_reads&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;HowManyRows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;XclusiveLockForCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SessionData&lt;/span&gt;&lt;span class="p"&gt;.[&lt;/span&gt;&lt;span class="n"&gt;host_name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_tran_locks&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;
        &lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;program_name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;login_name&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;host_name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;login_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_request_end_time&lt;/span&gt;
                        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_exec_sessions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SessionData&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;SessionData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_session_id&lt;/span&gt;
        &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;blocking_session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;objectid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;logical_reads&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;
                    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_exec_requests&lt;/span&gt;
                    &lt;span class="k"&gt;CROSS&lt;/span&gt; &lt;span class="n"&gt;APPLY&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_exec_sql_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql_handle&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.[&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_session_id&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transaction_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_owner_id&lt;/span&gt;
        &lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resource_associated_entity_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;RequestsData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resource_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'OBJECT'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;tranLocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'X'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7w5mPgXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-36.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7w5mPgXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-36.png%3Fw%3D1024" alt="" width="880" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And my guess was right, the SQL server was escalating the lock until be exclusive for my first update query that was triggered by my Business Central procedure &lt;strong&gt;SetAllProcessed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What we should look for, as the next step!? Well, we should pursue two things here… Increasing performance and a way to the SQL Server manage concurrency and be able to process more than one request for the same table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Increase Performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here we can switch a little bit of the code by isolating our ExtraProcessing effort from the update, avoiding a few calls to the SQL side… See one possible suggestion:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HcdcMVWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-44.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HcdcMVWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-44.png%3Fw%3D1024" alt="" width="880" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even with this approach, we are processing everything in one transaction and only committing it at the end, ensuring that the data integrity will remain even if an error occur on one of the steps – an error and all data changes will be rollbacked.&lt;/p&gt;

&lt;p&gt;Also batching better the number of entries that are being processed, is a good way of avoiding lock escalation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helping SQL Server manage the concurrency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should be guessing by now how we can do this… by using &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/indexes-sql-1f72-temp-slug-4160922"&gt;indexes&lt;/a&gt;&lt;/strong&gt;! Are we missing any!? Well, when I’ve created my table on Business Central, I didn’t concern with the creation of other than the index automatically generated for the primary key (if you missed the &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/indexes-sql-1f72-temp-slug-4160922"&gt;post&lt;/a&gt;&lt;/strong&gt; about indexes, it is a good time to jump into it and give it a look).&lt;/p&gt;

&lt;p&gt;Let’s check, by using the following code, if the SQL execution plan suggests any missing index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equality_columns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inequality_columns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;included_columns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="k"&gt;RIGHT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;charindex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rowcnt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sysindexes&lt;/span&gt;
        &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt;
               &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2066&lt;/span&gt; &lt;span class="p"&gt;))&lt;/span&gt;
       &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rowcount&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
       &lt;span class="n"&gt;migs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_seeks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;migs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_total_user_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;migs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_user_impact&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_db_missing_index_details&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nolock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_db_missing_index_groups&lt;/span&gt; &lt;span class="n"&gt;mig&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nolock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index_handle&lt;/span&gt;
       &lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_db_missing_index_group_stats&lt;/span&gt; &lt;span class="n"&gt;migs&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nolock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index_group_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;migs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_handle&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;database_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Db_id&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;user_seeks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;avg_user_impact&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;user_seeks&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;user_scans&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;last_user_seek&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WtYn9eJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-39.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WtYn9eJH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-39.png%3Fw%3D1024" alt="" width="880" height="423"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Missing Indexes Query – Results&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Looking at the query results, we have one suggestion to be added. Let’s use the index creation suggested and add a new key for my table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yBCJgBCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-40.png%3Fw%3D888" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yBCJgBCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-40.png%3Fw%3D888" alt="" width="880" height="1015"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;My new key – as suggested by SQL query.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If we give it a look to the SQL side we’ll be able to find the index that was automatically created for this new key, as a non-clustered unique.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_ESfw0V2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-41.png%3Fw%3D887" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_ESfw0V2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-41.png%3Fw%3D887" alt="" width="880" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, what do you think will happen if I put the two concurrent processes running at the same time with this new key?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W5zG3NuY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-45.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W5zG3NuY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-45.png%3Fw%3D1024" alt="" width="880" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our locking event is gone… And at same time I was able to set with status Processed all my &lt;strong&gt;Outbound-Orders&lt;/strong&gt; entries and in error all my &lt;strong&gt;Inbound-Documents&lt;/strong&gt; entries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2M2jj3_t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-43.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2M2jj3_t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-43.png%3Fw%3D1024" alt="" width="880" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We, developers, should be careful with our code solutions and try to foresee some of the behaviors on Prod environment, to avoid a few surprises when our code is deployed. I’ve exemplified through a potential scenario of something that could escape from our radar during a development, but even if your challenge is not similar to the above one, you already have on this post some tools/ways to investigate the reason of why you’re getting some of the issues and solve them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At last but not the least…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On this quite big post, I know that became extensive, you’ve been able to see why I’ve grown my passion on studying SQL Server better and also PowerShell scripting. With all together I was able to create a route map of how to test my Integration Log approach in a way to simulate concurrency transactions context and investigate the reason of errors. I hope that was helpful!&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>dynamicnavbc</category>
      <category>powershell</category>
      <category>sql</category>
    </item>
    <item>
      <title>Quick Tip: Setting new values at NAV/BC server configuration – Docker Container | Business Central</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Thu, 20 Jan 2022 18:24:19 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/quick-tip-setting-new-values-at-navbc-server-configuration-docker-container-business-central-401o</link>
      <guid>https://dev.to/toolgbrmaker/quick-tip-setting-new-values-at-navbc-server-configuration-docker-container-business-central-401o</guid>
      <description>&lt;p&gt;The title is quite self-explanatory, so, if you want to set a new value for one of the settings on your NAV server configuration at your Docker Container you must use a PowerShell cmdlet execution to perform it.&lt;/p&gt;

&lt;p&gt;For this PowerShell setting approach, you need to know two things – which NAV server you want to modify and which of the settings will you change the value.&lt;/p&gt;

&lt;p&gt;To know which &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/dynamics-nav/microsoft-dynamics-nav-server-settings"&gt;NAV Server Instances&lt;/a&gt;&lt;/strong&gt; are running on your Docker Container you can run the following command on your docker PowerShell prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NAVServerInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hKJ_Dz83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-14.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hKJ_Dz83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-14.png%3Fw%3D1024" alt="" width="880" height="264"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The result from Get-NAVServerInstance cmdlet&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now that you have the Server Instance available on our container, let’s use this output to get the in vigor settings for the NAV Server Configuration…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NAVServerConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ServerInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;YourNAVserverInstance&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AHRAFj47--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-15.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AHRAFj47--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-15.png%3Fw%3D1024" alt="" width="880" height="480"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The result from Get-NAVServerConfiguration cmdlet&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Time to chose which one you want to switch/change… Let’s imagine that we want to enable our API services. To achieve it, we must perform the following cmdlet with the following parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-NAVServerConfiguration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;YourNAVserverInstance&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeyName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ApiServicesEnabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-KeyValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rJJiO3vR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-16.png%3Fw%3D920" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rJJiO3vR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-16.png%3Fw%3D920" alt="" width="880" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you may notice on the warning message, you must finish all your changes with a service restart. If you have doubts about how to do it, time to jump for the following &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/get-service-cmdlet-continuation-powershell-59p"&gt;post&lt;/a&gt;&lt;/strong&gt; where you can grab what you are looking for.&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dynamicnavbc</category>
      <category>powershell</category>
      <category>container</category>
    </item>
    <item>
      <title>Quick Tip: DNS lookup issue – Docker Container | Business Central</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Mon, 17 Jan 2022 17:03:09 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/quick-tip-dns-lookup-issue-docker-container-business-central-38ac</link>
      <guid>https://dev.to/toolgbrmaker/quick-tip-dns-lookup-issue-docker-container-business-central-38ac</guid>
      <description>&lt;p&gt;Recently, due to some Integration REST API tests, I faced an error during my request HTTP attempt. The error was:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An error occurred while sending the request. The remote name could not be resolved:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dUQR7zBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-10.png%3Fw%3D632" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dUQR7zBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-10.png%3Fw%3D632" alt="" width="632" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a search on some blogs I was able to correlate the error with a DNS issue and gave it a try the following commands on Container Command Prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the result of…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZqwEp-qG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-11.png%3Fw%3D652" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZqwEp-qG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-11.png%3Fw%3D652" alt="" width="652" height="68"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ping request could not find host google.com. Please check the name and try again.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the result of…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yX3xvCHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-12.png%3Fw%3D454" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yX3xvCHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-12.png%3Fw%3D454" alt="" width="454" height="210"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Success&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After been identified the issue I was able to fix it by adding the following lines on Docker Settings – Daemon configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": true,
  "experimental": true,
  "dns": [
    "8.8.8.8"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TuKlfBKO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-13.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TuKlfBKO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-13.png%3Fw%3D1024" alt="" width="880" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above solution was taken from the following blog &lt;strong&gt;&lt;a href="http://www.robertbird.co.uk/development/docker-networking-tips-and-tricks"&gt;post&lt;/a&gt;&lt;/strong&gt;. Thank you Robert Bird for sharing it!&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>dynamicnavbc</category>
      <category>api</category>
      <category>dns</category>
      <category>docker</category>
    </item>
    <item>
      <title>Indexes | SQL</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Wed, 12 Jan 2022 17:23:34 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/indexes-sql-13if</link>
      <guid>https://dev.to/toolgbrmaker/indexes-sql-13if</guid>
      <description>&lt;p&gt;Let’s talk a little bit about indexes, their relation with &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data pages&lt;/a&gt;&lt;/strong&gt;, and their importance in querying data from databases.&lt;/p&gt;

&lt;p&gt;Database indexes are used to provide faster access to relational data. An index is a separated physical data structure that enables faster access to one or multiple rows to an entity or table.&lt;/p&gt;

&lt;p&gt;Analogous, we can think of a book index or the yellow pages (phone numbers) as examples of indexes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, what it means to have or not have an index?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, let’s imagine that we have a table, with a primary key, and no index on it. To find the row(s) we want on the data pages, we’ll blindly start our search with no clue of where to find them. Thus, to ensure that we end on the aimed row(s) successfully, we must start reading sequentially from beginning to end until we find what we want. The higher is the number of rows on the table the higher will be the time consumed on this task. Image what would be to try to find a row in the middle of 1000000.&lt;/p&gt;

&lt;p&gt;Here is where indexes are useful… Since they are built in a separated physical data structure, more exactly on a &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/B%2B_tree"&gt;B+-tree&lt;/a&gt;&lt;/strong&gt; structure, will build a sort of “route map” that will perform faster access to data. On average, the operation time complexities will be faster than without indexes.&lt;/p&gt;

&lt;p&gt;We can have two types of indexes on our tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-ver15#clustered-index-architecture"&gt;Clustered&lt;/a&gt;&lt;/strong&gt; – The &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/B%2B_tree"&gt;B+-tree&lt;/a&gt;&lt;/strong&gt; of a clustered index will be fulfilled with root, intermediary and leaves nodes. The root and intermediary nodes will be in index pages structures, containing a key value and a pointer to the data row on the leaf level, seeking through them in cascading way. This type of index is unique by table and it is created taking in basis the table primary key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SOyk_3zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://docs.microsoft.com/en-us/sql/relational-databases/media/bokind2.gif%3Fview%3Dsql-server-ver15" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SOyk_3zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://docs.microsoft.com/en-us/sql/relational-databases/media/bokind2.gif%3Fview%3Dsql-server-ver15" alt="Diagram showing the structure of a clustered index in a single partition." width="444" height="476"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Took from docs.microsoft.com&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-ver15#Nonclustered"&gt;Nonclustered&lt;/a&gt;&lt;/strong&gt; – They have the same structure as clustered indexes, having a difference that the leaves are also index pages instead of &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data pages&lt;/a&gt;&lt;/strong&gt;. For this type of indexes, we have no maximum number for them, but should be taken into consideration that the SQL server will need to balance these &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/B%2B_tree"&gt;B+-tree&lt;/a&gt;&lt;/strong&gt; structures on any insert or delete operation, and these comport and effort. This effort will increase with the number of indexes, therefore these indexes should be added wisely after deeper analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1OncJfmv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://docs.microsoft.com/en-us/sql/relational-databases/media/bokind1a.gif%3Fview%3Dsql-server-ver15" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1OncJfmv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://docs.microsoft.com/en-us/sql/relational-databases/media/bokind1a.gif%3Fview%3Dsql-server-ver15" alt="Diagram showing the structure of a nonclustered index in a single partition." width="514" height="470"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Took from docs.microsoft.com&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Friendliest representation of &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-ver15#clustered-index-architecture"&gt;Clustered&lt;/a&gt;&lt;/strong&gt; indexes…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VYyhNwkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-9.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VYyhNwkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-9.png%3Fw%3D1024" alt="" width="880" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Friendliest representation of &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-ver15#Nonclustered"&gt;Nonclustered&lt;/a&gt;&lt;/strong&gt; indexes…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jA1Gc8Hh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-8.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jA1Gc8Hh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-8.png%3Fw%3D1024" alt="" width="880" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, that you know that index pages are a “route map” to faster &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data page&lt;/a&gt;&lt;/strong&gt; access and how they work, you might end with a final doubt…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are we able to see how it looks like a &lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data page&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To exemplify what we have inside of a &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data page&lt;/a&gt;&lt;/strong&gt;, I’ll use the structure created on this &lt;strong&gt;&lt;a href="https://wordpress.com/post/toolgbrmaker.wordpress.com/48"&gt;post&lt;/a&gt;&lt;/strong&gt; (if you didn’t read it, now it is a good time to jump into it).&lt;/p&gt;

&lt;p&gt;Let’s add some dummy data to it…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CustomerNo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;CustomerFirstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;CustomerLastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;CountryCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Bruno'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Guedes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'PT'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Marcelo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Sousa'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'PT'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Antonio'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'Costa'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'PT'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let’s get a look at our table’s page structure by using the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;DBCC&lt;/span&gt; &lt;span class="n"&gt;IND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SampleTest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GO&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5rkiPq0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-5.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5rkiPq0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-5.png%3Fw%3D1024" alt="" width="880" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we are seeking the rows with &lt;strong&gt;PageType&lt;/strong&gt; 1 that is the type of &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data page&lt;/a&gt;&lt;/strong&gt;. ( &lt;strong&gt;PageType&lt;/strong&gt; 2 – index pages and &lt;strong&gt;PageType&lt;/strong&gt; 10 – IAM page that maintains the index itself).&lt;/p&gt;

&lt;p&gt;Now that we know the &lt;strong&gt;PagePID&lt;/strong&gt; from our &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data page&lt;/a&gt;&lt;/strong&gt;, let’s use the following query to check the answer to our final doubt…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;DBCC&lt;/span&gt; &lt;span class="n"&gt;TRACEON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3604&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;DBCC&lt;/span&gt; &lt;span class="n"&gt;PAGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SampleTest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;TABLERESULTS&lt;/span&gt;
&lt;span class="k"&gt;GO&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1SE2XIE---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-6.png%3Fw%3D609" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1SE2XIE---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://toolgbrmaker.files.wordpress.com/2022/01/image-6.png%3Fw%3D609" alt="" width="609" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you scroll until the end you can see that the data rows are stored in slots that start with a zero offset.&lt;/p&gt;

&lt;p&gt;And that’s it, the complex monster (aka Indexes), and its herculean relation with &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/sql/relational-databases/pages-and-extents-architecture-guide?view=sql-server-ver15"&gt;data pages&lt;/a&gt;&lt;/strong&gt; ended, in this post, by being diminished for the world. Well, at least hopefully! &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qgur0s-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qgur0s-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Above you can find a small explanation for the index behavior on SQL server, but if you are looking to dive deeper into the concept I can suggest you the reading of this &lt;strong&gt;&lt;a href="https://www.brentozar.com/archive/2006/04/sql-server-training-for-developers-primary-keys-indexes/"&gt;post&lt;/a&gt;&lt;/strong&gt; from Brent Ozar that is light reading and very explanatory of how indexes act. I can also suggest the reading of the following &lt;strong&gt;&lt;a href="https://www.amazon.com/gp/product/1260458873/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1260458873&amp;amp;linkCode=as2&amp;amp;tag=toolgbrmaker2-20&amp;amp;linkId=692d78d9987c5fa3b22e673107e26228"&gt;book&lt;/a&gt;&lt;/strong&gt; that has one chapter fully dedicated to this subject. Good readings!&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>datapages</category>
      <category>index</category>
      <category>indexes</category>
    </item>
    <item>
      <title>Building a function | Powershell</title>
      <dc:creator>ToolGBRMaker</dc:creator>
      <pubDate>Thu, 06 Jan 2022 17:33:24 +0000</pubDate>
      <link>https://dev.to/toolgbrmaker/building-a-function-powershell-12d5</link>
      <guid>https://dev.to/toolgbrmaker/building-a-function-powershell-12d5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt;  5.1.x&lt;/p&gt;

&lt;p&gt;During this post, I’ll share some concepts that I’ve used to build a function from a piece of code already shared on my blog in an earlier post. If you want to give it a look, please use the following &lt;strong&gt;&lt;a href="https://dev.to/toolgbrmaker/get-service-cmdlet-continuation-powershell-59p"&gt;link&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The piece of code that I’ll reuse and change to fit my function needs is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;#starting the stopped services or restarting the running ones&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'PTPOPF247203'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Pharma*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Attempting to restart'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'with status'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-BackgroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DarkRed&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;elseif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Stopped'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Attempting to start'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'with status'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-BackgroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DarkGreen&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;      
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code has the goal to restart executing services and start stopped ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our new function…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our function will have the name of &lt;strong&gt;Set-ServiceRunningStatus&lt;/strong&gt; and will need as Parameters the &lt;strong&gt;ComputerName&lt;/strong&gt; , &lt;strong&gt;Name&lt;/strong&gt; , and &lt;strong&gt;Force&lt;/strong&gt;. Regarding &lt;strong&gt;Name&lt;/strong&gt; I’ll set this one as mandatory, to avoid a restart of all running services or the start of all stopped services, by mistake. Furthermore, the types used for these parameters are, by order, a string array, string, and a switch type, if the user wants a service restart no matter what’s.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CmdletBinding&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ValueFromPipeline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]]&lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;HelpMessage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Enter a service name (or filter for multiple) to set Running Status"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Force&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;BEGIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#BEGIN&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;PROCESS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#PROCESS&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#END  &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So far so good, we have already our function structure. If you give a close look at our preliminary function structure you’ll be able to see that we have the &lt;strong&gt;BEGIN&lt;/strong&gt; , &lt;strong&gt;PROCESS&lt;/strong&gt; and &lt;strong&gt;END&lt;/strong&gt; blocks. Let’s explain these &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_methods?view=powershell-7.2#input-processing-methods"&gt;input processing methods&lt;/a&gt;&lt;/strong&gt; one by one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BEGIN&lt;/strong&gt; – Contains all the code that is needed to execute at the beginning of the function;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROCESS&lt;/strong&gt; – Contains the main functionality of the function;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;END&lt;/strong&gt; – Contains all the code that is needed to execute at the end of the function. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These methods can be read as follows – Begin to Process to end.&lt;/p&gt;

&lt;p&gt;In our example won’t be strictly necessary to use all these blocks, but why not start to get used to them!?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Begin:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s start with our &lt;strong&gt;BEGIN&lt;/strong&gt; block, firstly I’ll enforce our coding rules in expressions, scripts, and script blocks (&lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-7.2"&gt;Set-StrictMode&lt;/a&gt;&lt;/strong&gt;), afterward I’ll &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-verbose?view=powershell-7.2"&gt;write a verbose&lt;/a&gt;&lt;/strong&gt; to indicate in which step is our function and start to handle some of the service parameters to use on my cmdlets. These parameters will be dynamically set, because of the non-mandatory ones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;BEGIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Set-StrictMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2.0&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[BEGIN] Starting: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$MyInvocation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Mycommand&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#BEGIN&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PROCESS:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, time to get into our PROCESS block, where the action will happens… By first, I’ll need to ensure that Parameter $ComputerName has been used and if so, I’ll add the &lt;strong&gt;$ComputerName&lt;/strong&gt; to my &lt;strong&gt;$serviceParam&lt;/strong&gt;. To accomplish that I’m using the automatic variable &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.2#psboundparameters"&gt;$PSBoundParameters&lt;/a&gt;&lt;/strong&gt;. Also, take note that I’m switching the &lt;strong&gt;$ComputerName&lt;/strong&gt; parameter in case of being called more than once when our function is being invoked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$PSBoundParameters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ComputerName'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ComputerName'&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Computername'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#if already have&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Getting Services for &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Getting Services"&lt;/span&gt;&lt;span class="w"&gt;    
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="c"&gt;#if param ComputerName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After, I’ve built my list of parameters to be used on my Services cmdlets, I’ll start by getting the services result list, using &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service?view=powershell-7.2"&gt;Get-Service&lt;/a&gt;&lt;/strong&gt; cmdlet, and pipe it to my &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/where-object?view=powershell-7.2"&gt;Where-Object&lt;/a&gt;&lt;/strong&gt;, where I’ll check if it’s a service to restart or to start.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;PROCESS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$PSBoundParameters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ComputerName'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ComputerName'&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nv"&gt;$serviceParam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Computername'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#if already have&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Getting Services for &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$ComputerName&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Getting Services"&lt;/span&gt;&lt;span class="w"&gt;    
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="c"&gt;#if param ComputerName&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;serviceParam&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;

            &lt;/span&gt;&lt;span class="kr"&gt;Try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="kr"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$Force&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Restarting Service &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; with -Force"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;    
                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Restarting Service &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;       
                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="c"&gt;#if force&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;elseif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Stopped'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Starting Service &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="w"&gt;    
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#if status &lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;Catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;Write-Warning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PROCESS] Attemp Failed for Service &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;. Reason: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#try&lt;/span&gt;&lt;span class="w"&gt;

        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#Where-Object&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#PROCESS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;All PROCESS block&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You should notice, by reading the code above, that besides normal Service cmdlet invocation, I’m also writing some verbose to keep the user aware of what is being done during PROCESS execution. Parallelly to that, I’m also checking if our function was been invoked with Force option, and if so, combined if it’s a restart, I’m forcing the cmdlet execution with force option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;END:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By last, on my end block, I’m only writing as a verbose mentioning the ending of my function execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;Write-Verbose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[END] Ending: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="bp"&gt;$MyInvocation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Mycommand&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#END &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it. Now I have a function, that will be available to reuse in multiple scenarios, like importing a new license (that demands a restart for the impacted services). Another example could be a start/restart service, at the end of the day, to ensure that the services get the last released code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples of Execution:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This function will, by definition, execute the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service?view=powershell-7.2"&gt;Get-Service&lt;/a&gt;&lt;/strong&gt; cmdlet on your local machine and it’s optional the use of parameter &lt;strong&gt;$ComputerName&lt;/strong&gt; , so only if you want to play it on a list of Computer Names, you’ll need to use it. A possible call would be…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-ServiceRunningStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*Pharma*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Verbose&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’ll use this function in future references to show you how we can use it in different tasks and also introduce the Automated testing on PowerShell. Keep aware of future posts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Besides internet references, I’ve also used the learning concepts acquired in the following &lt;strong&gt;&lt;a href="https://www.amazon.com/gp/product/1617295094/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1617295094&amp;amp;linkCode=as2&amp;amp;tag=toolgbrmaker2-20&amp;amp;linkId=afa15f19fc0419a6851496e32f39b370"&gt;book&lt;/a&gt;&lt;/strong&gt;. I advise it as a good lecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; On any doubts about cmdlets, always look for help on official internet pages, about those cmdlets, and from PowerShell helper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ps:&lt;/strong&gt; I didn’t handle all possible function calls, so by now, this function is not bulletproof. If you detected the missing approach on it, please comment on this post. Good hunt!&lt;/p&gt;

&lt;p&gt;Stay safe!&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>getservice</category>
      <category>restartingservices</category>
      <category>function</category>
    </item>
  </channel>
</rss>
