17 October 2023

Primary key vs Unique key in SQL Server

Primary key vs Unique key in SQL Server 

Both primary keys and unique keys in SQL Server are used to enforce the uniqueness of values in a column or a set of columns. However, there are important differences between them:

### Primary Key:

1. **Uniqueness:** A primary key ensures that the values in the specified column or columns are unique across all rows in the table.  

2. **Null Values:** A primary key column cannot contain NULL values. Every row must have a unique and non-null value in the primary key column(s).

3. **One per Table:** There can be only one primary key constraint in a table. It can consist of one or multiple columns.

4. **Clustered Index:** In SQL Server, the primary key constraint automatically creates a clustered index on the primary key column(s) if a clustered index does not already exist on the table.

5. **Foreign Key:** Primary key constraints are often used as the target of foreign key constraints in other tables. Foreign keys establish relationships between tables.

**Example of Primary Key:**

```sql

CREATE TABLE Employees (

    EmployeeID INT PRIMARY KEY,

    FirstName VARCHAR(50),

    LastName VARCHAR(50)

);

Unique Key:

1. **Uniqueness:** Like a primary key, a unique key ensures that the values in the specified column or columns are unique across all rows in the table.

2. **Null Values:** Unlike primary keys, unique key columns can contain NULL values. However, a unique key constraint will allow only one NULL value, meaning that you can have multiple NULLs in the column, but each non-null value must be unique.

3. **Multiple Unique Keys:** Unlike primary keys, you can have multiple unique key constraints in a table. Each unique key can consist of one or multiple columns.

4. **Non-Clustered Index:** Creating a unique key constraint creates a non-clustered index on the unique key column(s) if a clustered index does not already exist on the table.

5. **No Implicit Relationship:** Unique keys are not implicitly used as the target of foreign key constraints.

Example of Unique Key:

CREATE TABLE Customers (

    CustomerID INT UNIQUE,

    Email VARCHAR(255) UNIQUE,

    FirstName VARCHAR(50),

    LastName VARCHAR(50)

);

In summary, primary keys are used to uniquely identify records in a table and are often used as the target of foreign key constraints, while unique keys provide uniqueness but allow for multiple NULL values and do not establish relationships between tables implicitly. The choice between them depends on the specific requirements of your database schema.

Sql rank vs Dense_rank IN SQL SERVER

 Sql rank vs Dense_rank IN SQL SERVER

In SQL Server, `RANK()` and `DENSE_RANK()` are both window functions that are used to assign a rank to each row within a result set based on the values in one or more columns. However, they differ in how they handle duplicate values.

Here's a comparison of `RANK()` and `DENSE_RANK()` in SQL Server:

RANK():

- `RANK()` is a window function that assigns a unique rank to each distinct row within a result set based on the values in the specified column(s).

- If two or more rows have the same values, `RANK()` will assign the same rank to those rows and leave gaps in the ranking sequence for the next rank.

- The ranking values are not consecutive when there are ties.

**Example:**

```sql

SELECT 

    RANK() OVER (ORDER BY ColumnName) AS Rank

FROM 

    TableName;

# DENSE_RANK():

- `DENSE_RANK()` is also a window function that assigns a unique rank to each distinct row within a result set based on the values in the specified column(s).

- If two or more rows have the same values, `DENSE_RANK()` will assign the same rank to those rows but will not leave gaps in the ranking sequence.

 It produces consecutive ranking values, even when there are ties.

**Example:**

```sql

SELECT 

    DENSE_RANK() OVER (ORDER BY ColumnName) AS DenseRank

FROM 

    TableName;

In summary, if you want consecutive ranking values without any gaps, you should use `DENSE_RANK()`. If you don't mind having gaps in the ranking sequence for tied values, you can use `RANK()`. The choice between them depends on your specific use case and the behavior you want for tied values in your ranking results.

Magic table in sql server

 Magic table in sql server

In SQL Server, there is no specific concept called a "magic table." However, the term "magic table" is commonly used to refer to the special tables that are used in triggers to access the data that was modified by the triggering action (such as an INSERT, UPDATE, DELETE statement). These special tables are known as inserted and deleted tables.

Here's how they work:

1. **Inserted Table:**

   - In the context of an `INSERT` or `UPDATE` trigger, the `inserted` table contains the new rows that were inserted or the updated rows after the modification.

   - For example, in an `INSERT` trigger, you can access the newly inserted rows from the `inserted` table to perform further actions based on the inserted data.

   ```sql

   CREATE TRIGGER trgAfterInsert

   ON TableName

   AFTER INSERT

   AS

   BEGIN

       -- Inserted table contains newly inserted rows

       SELECT * FROM inserted;

   END

   ```

2. **Deleted Table:**

   - In the context of a `DELETE` or `UPDATE` trigger, the `deleted` table contains the old rows that were deleted or the rows before they were updated.

   - For example, in a `DELETE` trigger, you can access the deleted rows from the `deleted` table to perform actions before the rows are deleted permanently.


   ```sql

   CREATE TRIGGER trgAfterDelete

   ON TableName

   AFTER DELETE

   AS

   BEGIN

       -- Deleted table contains rows that were deleted

       SELECT * FROM deleted;

   END

   ```

By using these `inserted` and `deleted` tables, you can effectively access the data being modified by the triggering SQL statement within the body of the trigger. These tables are sometimes colloquially referred to as "magic tables" due to their special and implicit nature within triggers.

16 October 2023

Add multiple client in Azure APIM

 Add multiple client in Azure APIM

In Azure API Management (APIM), adding multiple clients, also known as applications or subscriptions, allows different entities (such as developers or applications) to access your APIs securely. Here are the steps to add multiple clients in APIM:

### 1. **Sign in to the Azure Portal:**

   - Go to [Azure Portal](https://portal.azure.com/).

### 2. **Select your API Management Service:**

   - Navigate to your APIM instance from the Azure Portal.

### 3. **Add a New Application:**

   - In your APIM instance, go to the "Security" section.

   - Click on "Add" to create a new application.

### 4. **Fill in Application Details:**

   - Provide a unique client ID for the application. This is typically generated by the system.

   - You can set a display name for the application to identify it easily.

   - Optionally, configure other settings like product subscriptions, policies, etc.

   - Save your changes.

### 5. **Generate Client Secrets or Certificates (if necessary):**

   - Depending on your security requirements, generate client secrets or upload certificates for authentication.

   - Client secrets are typically used with confidential clients, such as server-side applications.

   - Certificates provide an additional layer of security and are used for authentication in similar scenarios.

### 6. **Configure API Access:**

   - In the application settings, configure the specific APIs, operations, or products that this application can access.

   - You can define rate limits, quotas, and policies for each application separately.

### 7. **Retrieve Client ID and Client Secret:**

   - After saving the application details, make sure to note down the generated Client ID and Client Secret. These are essential for authenticating the client application.

### 8. **Securely Store Client Secrets:**

   - If you're using client secrets, ensure that you securely store them. For security reasons, the client secret is only shown once during the creation process. Make sure to save it in a secure location.

### 9. **Implement Authentication in Client Applications:**

   - In your client applications, implement authentication using the Client ID and Client Secret or other methods like client certificates, depending on what you configured in APIM.

   - Make sure to include the necessary authentication headers or tokens in API requests made by the client applications.

By following these steps, you can add multiple clients in Azure API Management, allowing different applications or users to securely access your APIs based on the defined policies and configurations.

When to choose azure function and logic app

 When to choose azure function and logic app

Azure Functions and Logic Apps are both serverless computing options in Azure, but they serve different purposes and are designed for different scenarios. Here's a breakdown of when to choose Azure Functions and Logic Apps based on your specific requirements:

### Choose Azure Functions When:

1. **Event-Driven Tasks:**

   - Use Azure Functions when you need to execute code in response to events. For example, handling HTTP requests, reacting to messages in a queue, or responding to changes in a database.

2. **Microservices Architecture:**

   - Azure Functions are suitable for building microservices, where each function can handle a specific task or process, and these functions can be orchestrated to create complex applications.

3. **Stateless and Short-Lived Operations:**

   - Functions are stateless, meaning they don't maintain state between executions. They are designed for short-lived operations. Use them when your tasks can be executed quickly without requiring long-running processes.

4. **Flexible Language Support:**

   - Azure Functions support multiple programming languages such as C#, Python, JavaScript, and PowerShell. You can choose the language that best fits your expertise and requirements.

5. **HTTP APIs and Webhooks:**

   - Functions are great for building HTTP APIs and handling webhooks. They can easily handle incoming HTTP requests and return responses.

6. **Integration with Other Azure Services:**

   - Azure Functions can integrate seamlessly with other Azure services, such as Azure Storage, Azure Cosmos DB, Azure Service Bus, and Azure Event Hubs.

### Choose Logic Apps When:

1. **Workflow Orchestration:**

   - Use Logic Apps when you need to orchestrate workflows with multiple steps involving various services and APIs. Logic Apps provide a visual designer for creating complex workflows.

2. **Integration with SaaS Applications:**

   - Logic Apps are designed for integrating with Software as a Service (SaaS) applications. They have built-in connectors for popular services like Salesforce, Office 365, Twitter, and more.

3. **Non-Developer Friendly:**

   - Logic Apps are suitable for business users and non-developers who need to create workflows without writing code. The visual designer makes it easy to create and modify workflows.

4. **Built-In Connectors:**

   - Logic Apps come with a wide range of built-in connectors for various services and APIs. You can easily connect to external systems without writing custom code.

5. **Long-Running and Stateful Workflows:**

   - Logic Apps support long-running workflows and can maintain state between steps, making them suitable for processes that require multiple stages and extended periods of execution.

6. **B2B Integrations:**

   - Logic Apps are well-suited for Business-to-Business (B2B) integrations, allowing you to exchange data and automate processes with partners and suppliers.

In summary, choose **Azure Functions** when you need lightweight, event-driven, and stateless functions with flexibility in language choice. Choose **Logic Apps** when you require complex workflow orchestration, integration with SaaS applications, visual design capabilities, and support for long-running and stateful processes. Often, these services can complement each other within a larger application architecture, providing the right tool for the specific task at hand.

Azure Monitor

 Azure Monitor

Azure Monitor is a comprehensive service in Microsoft Azure that provides full-stack monitoring, advanced analytics, and intelligent insights to help you understand the performance and health of your applications, infrastructure, and networks. It enables you to collect and analyze data from various sources, helping you to monitor the performance of your applications, diagnose issues, and understand the usage patterns.

Here are key components and features of Azure Monitor:

### 1. **Metrics:**

   - Azure Monitor collects metrics from various Azure resources. Metrics are numerical values that represent the health and performance of resources. You can visualize these metrics on Azure dashboards and set up alerts based on specific conditions.

### 2. **Logs:**

   - Azure Monitor Logs (formerly known as Azure Log Analytics) collect and analyze log data from different sources. You can collect data from Azure resources, applications, operating systems, and other sources. Logs provide rich querying capabilities using the Kusto Query Language (KQL).

### 3. **Application Insights:**

   - Application Insights is a service under Azure Monitor designed for developers. It allows you to monitor the availability, performance, and usage patterns of your applications. Application Insights integrates with various platforms and languages, providing deep insights into application behavior, exceptions, dependencies, and more.

### 4. **Azure Security Center:**

   - Azure Security Center is integrated with Azure Monitor to provide advanced threat protection across all of your services, including applications and data. It helps you detect and respond to security threats, configure security policies, and strengthen your security posture.

### 5. **Azure Workbooks:**

   - Azure Workbooks provide a flexible canvas for data analysis and the creation of interactive reports and dashboards. You can use Workbooks to visualize data from various sources, including metrics, logs, and Application Insights.

### 6. **Alerts and Actions:**

   - Azure Monitor allows you to set up alerts based on metrics or log queries. When specific conditions are met, alerts can trigger actions, such as sending email notifications, invoking Azure Functions, or starting automated remediation workflows.

### 7. **Service Map:**

   - Azure Monitor Service Map automatically discovers and maps dependencies of your applications. It helps you understand communication patterns, identify bottlenecks, and troubleshoot performance issues.

### 8. **Network Monitoring:**

   - Azure Monitor provides network monitoring capabilities, including insights into network performance, connectivity, and diagnostics. It helps you identify issues in your network infrastructure.

Azure Monitor is a powerful tool for monitoring, diagnosing, and gaining insights into your Azure resources and applications. It supports a wide range of services, allowing you to create a centralized monitoring solution tailored to your specific requirements.


Display all Webapi return type in dotnetcore

 In ASP.NET Core Web API, you can return various types of results from action methods. Here is a comprehensive list of return types you can use in ASP.NET Core Web API:

### 1. **ObjectResult:**

   - `ObjectResult` allows you to return an object along with an HTTP status code.

   ```csharp

   public IActionResult Get()

   {

       var data = new { key = "value" };

       return Ok(data); // or return new ObjectResult(data);

   }

   ```

### 2. **ActionResult<T>:**

   - `ActionResult<T>` is a generic version of `ObjectResult` that allows you to return an object of type `T` along with an HTTP status code.


   ```csharp

   public ActionResult<string> Get()

   {

       return Ok("value");

   }

   ```

### 3. **IActionResult:**

   - `IActionResult` is an interface that represents a result of an action method. It allows you to return various types of action results.


   ```csharp

   public IActionResult Get()

   {

       if (condition)

       {

           return Ok();

       }

       else

       {

           return NotFound();

       }

   }

   ```

### 4. **ViewResult:**

   - `ViewResult` is used in MVC controllers to return a view as a result of the action method.


   ```csharp

   public IActionResult Index()

   {

       return View();

   }

   ```

### 5. **FileResult:**

   - `FileResult` is used to return files to the client.


   ```csharp

   public IActionResult DownloadFile()

   {

       byte[] fileBytes = // Read file content into byte array

       string fileName = "example.txt";

       return File(fileBytes, "application/octet-stream", fileName);

   }

   ```

### 6. **ContentResult:**

   - `ContentResult` allows you to return a string content along with an HTTP status code and content type.


   ```csharp

   public IActionResult Get()

   {

       return Content("Hello, World!", "text/plain");

   }

   ```

### 7. **JsonResult:**

   - `JsonResult` is used to return JSON-formatted data.


   ```csharp

   public IActionResult Get()

   {

       var data = new { key = "value" };

       return Json(data);

   }

   ```

### 8. **NotFoundResult:**

   - `NotFoundResult` returns a 404 Not Found status code.


   ```csharp

   public IActionResult Get(int id)

   {

       if (Exists(id))

       {

           return Ok();

       }

       else

       {

           return NotFound();

       }

   }

   ```


### 9. **BadRequestResult:**

   - `BadRequestResult` returns a 400 Bad Request status code.


   ```csharp

   public IActionResult Post([FromBody] MyModel model)

   {

       if (ModelState.IsValid)

       {

           // Process the model

           return Ok();

       }

       else

       {

           return BadRequest();

       }

   }

   ```


### 10. **RedirectResult:**

   - `RedirectResult` is used to perform a redirection to a specified URL.


   ```csharp

   public IActionResult RedirectToExternalUrl()

   {

       return Redirect("https://www.example.com");

   }

   ```

### 11. **RedirectToActionResult:**

   - `RedirectToActionResult` is used to perform a redirection to another action within the same controller.

   ```csharp

   public IActionResult RedirectToIndex()

   {

       return RedirectToAction("Index");

   }

   ```


### 12. **ChallengeResult:**

   - `ChallengeResult` is used to initiate an authentication challenge.


   ```csharp

   public IActionResult Logout()

   {

       return SignOut("Cookies", "oidc");

   }

   ```

These are some of the common return types you can use in ASP.NET Core Web API actions. You can choose the appropriate return type based on your API's requirements and the specific response you want to send to the client.

Implementing OAuth validation in a Web API

 I mplementing OAuth validation in a Web API Implementing OAuth validation in a Web API using C# typically involves several key steps to sec...