<?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: Haripriya V</title>
    <description>The latest articles on DEV Community by Haripriya V (@haripriya_v_7e6e5d35f526a).</description>
    <link>https://dev.to/haripriya_v_7e6e5d35f526a</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%2F3834783%2F0c978899-f46a-497b-8501-1af2cec008cb.jpg</url>
      <title>DEV Community: Haripriya V</title>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/haripriya_v_7e6e5d35f526a"/>
    <language>en</language>
    <item>
      <title>Assignment 29</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 04 Apr 2026 15:08:01 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-29-3eif</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-29-3eif</guid>
      <description>&lt;p&gt;After launching a web server, accessing it via IP address works — but it’s not practical. So the next step was to connect a domain name.&lt;br&gt;
For this, I used Amazon Route 53 from Amazon Web Services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why DNS Matters&lt;/strong&gt;&lt;br&gt;
Humans prefer domain names, not IP addresses. DNS translates a domain into the correct server location.&lt;br&gt;
Without it, users would have to remember numeric IPs — which isn’t realistic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Creating a Hosted Zone&lt;br&gt;
Inside Route 53:&lt;br&gt;
•I created a Public Hosted Zone&lt;br&gt;
•Entered my domain name&lt;br&gt;
AWS automatically generated:&lt;br&gt;
NS (Name Server) records&lt;br&gt;
SOA record&lt;br&gt;
These are essential for DNS&lt;br&gt;
functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Mapping Domain to Server&lt;br&gt;
To connect my domain to the EC2 instance:&lt;br&gt;
•Created an A Record&lt;br&gt;
•Pointed it to the server’s public IP&lt;br&gt;
This step tells AWS where to send incoming traffic.&lt;/p&gt;

&lt;p&gt;**Step 3: **DNS Propagation&lt;br&gt;
Even after correct setup, the domain didn’t work immediately.&lt;br&gt;
This is expected.&lt;br&gt;
DNS changes take time to propagate globally. In my case, it took some time before everything worked properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges I Noticed&lt;/strong&gt;&lt;br&gt;
Expected instant results after configuration&lt;br&gt;
Needed to double-check record values&lt;br&gt;
Realized DNS delays are normal, not errors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;br&gt;
DNS is a critical layer between users and servers&lt;br&gt;
Small configuration mistakes can break routing&lt;br&gt;
Patience is required due to propagation delays&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
Setting up DNS made my project feel more real. Instead of accessing a raw IP, I now understand how domains connect users to applications.&lt;br&gt;
If you're learning cloud, don’t stop at launching a server — connect it properly using DNS.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Assignment 28</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 04 Apr 2026 15:03:24 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-28-50k5</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-28-50k5</guid>
      <description>&lt;p&gt;Getting hands-on with cloud infrastructure was something I wanted to do for a while. So I started with a simple goal: launch a server and make a webpage accessible over the internet.&lt;br&gt;
For this, I used Amazon Web Services and specifically Amazon EC2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Launching the Instance&lt;br&gt;
I created a new EC2 instance with the following setup:&lt;/p&gt;

&lt;p&gt;•Operating System: Amazon Linux&lt;br&gt;
•Instance Type: Free-tier eligible&lt;br&gt;
•Key Pair: Created for SSH access&lt;br&gt;
•Security Group:&lt;br&gt;
Allowed SSH (port 22)&lt;br&gt;
Allowed HTTP (port 80)&lt;br&gt;
One mistake here can block everything later, so I made sure the ports were correctly configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Installing the Web Server&lt;br&gt;
After connecting to the instance, I installed Apache:&lt;/p&gt;

&lt;p&gt;sudo yum update -y&lt;br&gt;
sudo yum install httpd -y&lt;br&gt;
sudo systemctl start httpd&lt;br&gt;
sudo systemctl enable httpd&lt;/p&gt;

&lt;p&gt;Then I created a simple webpage:&lt;br&gt;
echo "&lt;/p&gt;
&lt;h1&gt;My EC2 Server is Live!&lt;/h1&gt;" | sudo tee /var/www/html/index.html

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Accessing the Server&lt;br&gt;
Using the public IP address of the instance, I opened it in a browser.&lt;br&gt;
The page loaded successfully, confirming:&lt;br&gt;
•Server is running&lt;br&gt;
•Web service is active&lt;br&gt;
•Network access is working&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems I Faced&lt;/strong&gt;&lt;br&gt;
Not everything worked instantly:&lt;br&gt;
Initially forgot to allow HTTP traffic&lt;br&gt;
Mixed up private IP and public IP&lt;br&gt;
Had to restart Apache once&lt;br&gt;
These small mistakes helped me understand how each layer matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;br&gt;
EC2 gives full control but requires manual setup&lt;br&gt;
Security groups act like a firewall&lt;br&gt;
Even a simple deployment has multiple checkpoints&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;br&gt;
I plan to improve this setup by:&lt;br&gt;
Adding a domain&lt;br&gt;
Using a static IP&lt;br&gt;
Exploring load balancing&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ASSIGNMENT 36</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 17:05:12 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-36-1gfd</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-36-1gfd</guid>
      <description>&lt;p&gt;** Building a Reliable Digital Wallet System (Like PhonePe / GPay)**&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In today’s digital world, applications like Google Pay, PhonePe, and Paytm handle millions of financial transactions every second.&lt;/p&gt;

&lt;p&gt;Behind these simple “Pay” buttons lies a highly critical system where data consistency is everything. Even a tiny inconsistency can lead to:&lt;br&gt;
•Money loss&lt;br&gt;
• Duplicate transactions&lt;br&gt;
• Incorrect balances&lt;/p&gt;

&lt;p&gt;To prevent this, databases rely on ACID properties, especially Isolation, which ensures transactions don’t interfere with each other in unsafe ways.&lt;/p&gt;

&lt;p&gt;Database Setup&lt;/p&gt;

&lt;p&gt;We begin with a simple accounts table:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id SERIAL PRIMARY KEY,&lt;br&gt;
    name TEXT NOT NULL,&lt;br&gt;
    balance INT NOT NULL CHECK (balance &amp;gt;= 0),&lt;br&gt;
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sample Data&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INSERT INTO accounts (name, balance)&lt;br&gt;
VALUES &lt;br&gt;
('Alice', 1000),&lt;br&gt;
('Bob', 500);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This simulates a wallet system where users hold balances.&lt;/p&gt;

&lt;p&gt;Simulating Concurrent Transactions&lt;/p&gt;

&lt;p&gt;To understand how isolation works, we simulate two concurrent database sessions.&lt;/p&gt;

&lt;p&gt;Scenario: Two Transactions on Same Account&lt;/p&gt;

&lt;p&gt;Session 1 (T1)&lt;/p&gt;

&lt;p&gt;`BEGIN;&lt;/p&gt;

&lt;p&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 800 &lt;br&gt;
WHERE name = 'Alice';`&lt;/p&gt;

&lt;p&gt;Alice’s balance becomes 200 (but uncommitted)&lt;/p&gt;

&lt;p&gt;Session 2 (T2)&lt;/p&gt;

&lt;p&gt;`BEGIN;&lt;/p&gt;

&lt;p&gt;SELECT balance FROM accounts WHERE name = 'Alice'; `&lt;/p&gt;

&lt;p&gt;Now the key question:&lt;br&gt;
Can T2 see the updated balance (200)? Or still 1000?&lt;/p&gt;

&lt;p&gt;This depends on the isolation level.&lt;/p&gt;

&lt;p&gt;Isolation Levels Explained&lt;/p&gt;

&lt;p&gt;Read Uncommitted&lt;/p&gt;

&lt;p&gt;Lowest isolation (rarely used in PostgreSQL)&lt;br&gt;
•T2 can see uncommitted data&lt;br&gt;
•Leads to Dirty Reads&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;T2 might see balance = 200 even if T1 later rolls back.&lt;/p&gt;

&lt;p&gt;Result: Incorrect financial state&lt;/p&gt;

&lt;p&gt;Read Committed (Default in PostgreSQL)**&lt;br&gt;
•T2 cannot see uncommitted changes&lt;br&gt;
•Only committed data is visible&lt;/p&gt;

&lt;p&gt;✔ Behavior&lt;/p&gt;

&lt;p&gt;T2 sees:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Alice = 1000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Issue: Non-repeatable Reads&lt;/p&gt;

&lt;p&gt;If T1 commits later, T2 may see different values in the same transaction.&lt;/p&gt;

&lt;p&gt;Repeatable Read&lt;/p&gt;

&lt;p&gt;•Ensures consistent snapshot during transaction&lt;/p&gt;

&lt;p&gt;✔ Behavior&lt;br&gt;
•T2 always sees 1000 during its transaction&lt;br&gt;
•Even if T1 commits later&lt;/p&gt;

&lt;p&gt;Issue: Phantom reads still possible (in some DBs)&lt;/p&gt;

&lt;p&gt;Serialize (Highest Isolation)&lt;/p&gt;

&lt;p&gt;Most strict and safest&lt;br&gt;
•Transactions behave as if executed one after another&lt;/p&gt;

&lt;p&gt;✔ Behavior&lt;br&gt;
•Prevents:&lt;br&gt;
•Dirty reads&lt;br&gt;
•Non-repeatable reads&lt;br&gt;
•Lost updates&lt;/p&gt;

&lt;p&gt;Example Outcome&lt;/p&gt;

&lt;p&gt;One transaction may fail with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ERROR: could not serialize access due to concurrent update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You must retry the transaction&lt;/p&gt;

&lt;p&gt;Key Problems Demonstrated&lt;/p&gt;

&lt;p&gt;Dirty Read&lt;/p&gt;

&lt;p&gt;Reading uncommitted data → leads to wrong balance&lt;/p&gt;

&lt;p&gt;Non-Repeatable Read&lt;/p&gt;

&lt;p&gt;Same query returns different results within a transaction&lt;/p&gt;

&lt;p&gt;Lost Update&lt;/p&gt;

&lt;p&gt;`-- T1 reads 1000&lt;br&gt;
-- T2 reads 1000&lt;/p&gt;

&lt;p&gt;-- T1 updates to 200&lt;br&gt;
-- T2 updates to 300&lt;/p&gt;

&lt;p&gt;-- Final = 300  (T1 lost) `&lt;/p&gt;

&lt;p&gt;Two transactions overwrite each other’s updates&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Why Isolation Matters in Wallet Systems&lt;/p&gt;

&lt;p&gt;In a real-world wallet:&lt;br&gt;
•Multiple users may send money simultaneously&lt;br&gt;
•Systems must prevent:&lt;br&gt;
•Double spending&lt;br&gt;
•Balance corruption&lt;br&gt;
•Race conditions&lt;/p&gt;

&lt;p&gt;Without isolation, financial systems would be unreliable.&lt;/p&gt;

&lt;p&gt;Best Practices for Wallet Systems&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM accounts &lt;br&gt;
WHERE name = 'Alice'&lt;br&gt;
FOR UPDATE;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;•Use Serializable isolation for critical transactions&lt;br&gt;
•Use row-level locking:&lt;/p&gt;

&lt;p&gt;Implement retry logic for failed transactions&lt;br&gt;
•Keep transactions short and efficient&lt;/p&gt;

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

&lt;p&gt;Building a digital wallet system is not just about transferring money—it’s about guaranteeing correctness under concurrency.&lt;/p&gt;

&lt;p&gt;Through this experiment, we observed how different isolation levels impact:&lt;br&gt;
•Data visibility&lt;br&gt;
•Transaction safety&lt;br&gt;
•System reliability&lt;/p&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>sql</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>ASSIGNMENT 32</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:27:25 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-32-2e9l</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-32-2e9l</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In SQL, filtering data is essential to retrieve only the required records from a database. This is done using the WHERE clause along with different operators.&lt;/p&gt;

&lt;p&gt;In this task, we explore filtering techniques such as:&lt;br&gt;
•WHERE for conditions&lt;br&gt;
•AND, OR for combining conditions&lt;br&gt;
•IN, BETWEEN for range/value filtering&lt;br&gt;
•LIKE, SIMILAR TO for pattern matching&lt;br&gt;
•IS NULL for missing values&lt;br&gt;
•LIMIT, OFFSET for controlling output&lt;/p&gt;

&lt;p&gt;These operations help in extracting meaningful and specific data from large datasets.  ￼&lt;/p&gt;

&lt;p&gt;Queries with Code &amp;amp; Explanation&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films with rental rate &amp;gt; 3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
WHERE rental_rate &amp;gt; 3;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Filters movies with rental rate greater than 3.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rental rate &amp;gt; 3 AND replacement cost &amp;lt; 20&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate, replacement_cost&lt;br&gt;
FROM film&lt;br&gt;
WHERE rental_rate &amp;gt; 3 AND replacement_cost &amp;lt; 20;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uses AND to apply multiple conditions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rating = ‘PG’ OR rental rate = 0.99&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rating, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
WHERE rating = 'PG' OR rental_rate = 0.99;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retrieves movies satisfying either condition.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Top 10 movies by rental rate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rental_rate DESC&lt;br&gt;
LIMIT 10;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts and limits results.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skip 5, fetch next 3 (ascending)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rental_rate ASC&lt;br&gt;
OFFSET 5 LIMIT 3;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Skips first 5 rows and fetches next 3.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;(Same as 5 – alternate syntax)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rental_rate ASC&lt;br&gt;
OFFSET 5 FETCH NEXT 3 ROWS ONLY;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uses FETCH instead of LIMIT.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rental duration between 3 and 7&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_duration&lt;br&gt;
FROM film&lt;br&gt;
WHERE rental_duration BETWEEN 3 AND 7;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Filters range using BETWEEN.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Title starts with ‘A’ and ends with ‘e’&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title&lt;br&gt;
FROM film&lt;br&gt;
WHERE title LIKE 'A%e';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pattern matching using LIKE.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customers with no email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM customer&lt;br&gt;
WHERE email IS NULL;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finds missing values.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Movies (2006, specific rates, title starts with S)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate, release_year&lt;br&gt;
FROM film&lt;br&gt;
WHERE release_year = 2006&lt;br&gt;
AND rental_rate IN (2.99, 3.99)&lt;br&gt;
AND title LIKE 'S%'&lt;br&gt;
LIMIT 5;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Combines multiple filters.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;10 customers after skipping 20&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM customer&lt;br&gt;
ORDER BY last_name&lt;br&gt;
LIMIT 10 OFFSET 20;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pagination using LIMIT + OFFSET.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Top 5 movies by replacement cost (skip highest)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, replacement_cost&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY replacement_cost DESC&lt;br&gt;
OFFSET 1 FETCH NEXT 5 ROWS ONLY;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Skips the highest and gets next 5.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rentals between two dates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT rental_id, rental_date, customer_id&lt;br&gt;
FROM rental&lt;br&gt;
WHERE rental_date BETWEEN '2005-05-01' AND '2005-06-01';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Filters date range.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actors with “man” in last name&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM actor&lt;br&gt;
WHERE last_name LIKE '%man%';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Searches substring using %.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Movies with NULL special features&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title&lt;br&gt;
FROM film&lt;br&gt;
WHERE special_features IS NULL;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finds missing feature values.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rental duration &amp;gt;7&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_duration&lt;br&gt;
FROM film&lt;br&gt;
WHERE rental_duration &amp;gt; 7;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Filters based on duration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Movies with multiple conditions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate, rating&lt;br&gt;
FROM film&lt;br&gt;
WHERE rental_rate IN (2.99, 4.99)&lt;br&gt;
AND rating = 'R'&lt;br&gt;
AND title LIKE '%L%'&lt;br&gt;
LIMIT 10;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Combines IN, AND, and LIKE.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Title starts with A or B and ends with s&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title&lt;br&gt;
FROM film&lt;br&gt;
WHERE title SIMILAR TO '(A|B)%s';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uses regex-like pattern matching.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Title contains Man, Men, or Woman&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title&lt;br&gt;
FROM film&lt;br&gt;
WHERE title SIMILAR TO '%(Man|Men|Woman)%'; &lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Advanced pattern matching.&lt;/p&gt;

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

&lt;p&gt;This task demonstrates how SQL filtering helps in:&lt;br&gt;
•Extracting specific data using conditions&lt;br&gt;
•Combining multiple filters effectively&lt;br&gt;
•Searching patterns in text&lt;br&gt;
•Handling missing value&lt;br&gt;
•Controlling output size&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ASSIGNMENT 31</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:27:19 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-31-3ba2</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-31-3ba2</guid>
      <description>&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;The SELECT statement in SQL is used to retrieve data from a database. In this exercise, we explore different ways of querying the DVD Rental database, such as sorting, filtering, renaming columns, and finding unique values.&lt;/p&gt;

&lt;p&gt;These queries demonstrate essential SQL concepts like:&lt;br&gt;
•Column selection&lt;br&gt;
•Aliasing (AS)&lt;br&gt;
•Sorting (ORDER BY)&lt;br&gt;
•Removing duplicates (DISTINCT)&lt;br&gt;
•Aggregation (MIN)&lt;br&gt;
•Limiting results (LIMIT)&lt;/p&gt;

&lt;p&gt;Queries with Code &amp;amp; Explanation&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Film titles and rental rates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title AS "Movie Title",rental_rate AS "Rate"&lt;br&gt;
FROM film;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retrieves movie titles and rental rates with user-friendly column names.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer names and email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name AS "First Name",last_name AS "Last Name",email&lt;br&gt;
FROM customer;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays customer details with renamed columns.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films sorted by rental rate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rental_rate DESC, title ASC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts films by highest rental rate, then alphabetically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actor names sorted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM actor&lt;br&gt;
ORDER BY last_name ASC, first_name ASC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lists actors in proper alphabetical order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique replacement cost&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT replacement_cost&lt;br&gt;
FROM film;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Removes duplicate replacement cost values.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Film title and duration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title,length AS "Duration (min)" FROM film;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Shows movie duration with a clear column name.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer active status&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name,last_name,&lt;br&gt;
active AS "Is Active"&lt;br&gt;
FROM customer;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays whether customers are active.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Film categories&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT name&lt;br&gt;
FROM category&lt;br&gt;
ORDER BY name ASC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lists categories alphabetically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films by length&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, length&lt;br&gt;
FROM film ORDER BY length DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Shows longest films first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actors sorted by first name&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name FROM actor&lt;br&gt;
ORDER BY first_name DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts actors in reverse alphabetical order by first name.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique ratings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT rating&lt;br&gt;
FROM film;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays all available movie ratings.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique rental durations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT rental_duration&lt;br&gt;
FROM film;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Shows different rental duration values.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer ID with active status&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT customer_id,active&lt;br&gt;
FROM customer&lt;br&gt;
ORDER BY customer_id;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays unique customer IDs with their active status.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Earliest rental date per customer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT customer_id,&lt;br&gt;
MIN(rental_date) AS rental_date&lt;br&gt;
FROM rental&lt;br&gt;
GROUP BY customer_id&lt;br&gt;
ORDER BY customer_id;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finds each customer’s first rental.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;10 shortest films&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, length&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY length ASC&lt;br&gt;
LIMIT 10;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lists the shortest movies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Top 5 customers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, length&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY length ASC&lt;br&gt;
LIMIT 10;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Retrieves customers with highest IDs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique store IDs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT store_id&lt;br&gt;
FROM inventory;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Shows all store IDs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Replacement cost sorted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT replacement_cost&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY replacement_cost ASC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays sorted unique replacement costs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First rental per store&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT i.store_id,&lt;br&gt;
MIN(r.rental_date) AS rental_date&lt;br&gt;
FROM rental r&lt;br&gt;
JOIN inventory i ON r.inventory_id = i.inventory_id&lt;br&gt;
GROUP BY i.store_id&lt;br&gt;
ORDER BY i.store_id;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Finds earliest rental date for each store.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique film ratings sorted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT DISTINCT rating&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rating ASC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Displays ratings alphabetically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films by rating and length&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rating, length&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rating ASC, length DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts by rating, then longest films first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actor sorting variation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM actor&lt;br&gt;
ORDER BY last_name ASC, first_name DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts actors with mixed order conditions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films by cost and rate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, replacement_cost, rental_rate&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY replacement_cost ASC, rental_rate DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts by cost and rental rate.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer sorting variation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT first_name, last_name&lt;br&gt;
FROM customer&lt;br&gt;
ORDER BY last_name ASC, first_name DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Orders customers by last name and reverse first name.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rentals sorted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT *&lt;br&gt;
FROM rental&lt;br&gt;
ORDER BY customer_id ASC, rental_date DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Shows all rentals sorted by customer and latest date.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Films by rental duration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;SELECT title, rental_duration&lt;br&gt;
FROM film&lt;br&gt;
ORDER BY rental_duration ASC, title DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sorts films by duration and reverse title order.&lt;/p&gt;

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

&lt;p&gt;These queries demonstrate how SQL can efficiently:&lt;br&gt;
•Retrieve specific data&lt;br&gt;
•Sort and organize results&lt;br&gt;
•Remove duplicates&lt;br&gt;
•Perform basic analysis&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ASSIGNMENT 33</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:27:11 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-33-4b4p</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-33-4b4p</guid>
      <description>&lt;p&gt;*&lt;em&gt;Restore the DVD Rental Database and perform role-based access control operations by creating users with specific permissions. Create a &lt;code&gt;report_user&lt;/code&gt; role with limited access, modify permissions to allow or restrict access to certain tables and columns, and handle permission errors. Then create a &lt;code&gt;support_user&lt;/code&gt; with controlled update rights, revoke specific privileges, and implement a &lt;code&gt;readonly_group&lt;/code&gt; role with read access to all tables. Finally, create multiple users and assign them to this group to manage permissions efficiently.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In database systems, role-based access control (RBAC) is used to manage who can access or modify data. Instead of giving permissions directly to every user, roles are created and privileges are assigned efficiently.&lt;/p&gt;

&lt;p&gt;In this exercise, we:&lt;/p&gt;

&lt;p&gt;Create users with restricted access&lt;br&gt;
Grant and revoke permissions&lt;br&gt;
Control access at both table-level and column-level&lt;br&gt;
Use groups to simplify permission management&lt;/p&gt;

&lt;p&gt;This ensures security, data privacy, and controlled operations.&lt;/p&gt;

&lt;p&gt;Task 1: Create report_user with read access only to film&lt;/p&gt;

&lt;p&gt;sql CREATE ROLE report_user LOGIN PASSWORD 'password123';&lt;/p&gt;

&lt;p&gt;GRANT SELECT ON film TO report_user;&lt;/p&gt;

&lt;p&gt;Explanation  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a login role
&lt;/li&gt;
&lt;li&gt;Grants read-only (&lt;code&gt;SELECT&lt;/code&gt;) access to &lt;code&gt;film&lt;/code&gt; table
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Task 2: Fix permission denied for &lt;code&gt;customer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;sql GRANT SELECT ON customer TO report_user;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Initially, access is denied&lt;br&gt;
Granting SELECT allows reading the table&lt;/p&gt;

&lt;p&gt;Task 3: Restrict access to specific columns&lt;br&gt;
sql REVOKE SELECT ON customer FROM report_user;&lt;/p&gt;

&lt;p&gt;GRANT SELECT (customer_id, first_name, last_name)&lt;br&gt;
ON customer TO report_user;&lt;/p&gt;

&lt;p&gt;Explanation  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes full access
&lt;/li&gt;
&lt;li&gt;Grants column-level access only
&lt;/li&gt;
&lt;li&gt;Improves &lt;strong&gt;data privacy&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Task 4: Create &lt;code&gt;support_user&lt;/code&gt; with limited permissions&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE ROLE support_user LOGIN PASSWORD 'password123';&lt;/p&gt;

&lt;p&gt;GRANT SELECT ON customer TO support_user;&lt;/p&gt;

&lt;p&gt;GRANT UPDATE (email) ON customer TO support_user;&lt;/p&gt;

&lt;p&gt;REVOKE DELETE ON customer FROM support_user;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Can read all customer data&lt;br&gt;
Can update only email&lt;br&gt;
Cannot delete records --&amp;gt; prevents data loss&lt;/p&gt;

&lt;p&gt;Task 5: Remove SELECT access on film&lt;/p&gt;

&lt;p&gt;sql REVOKE SELECT ON film FROM report_user;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Removes previously granted permission&lt;br&gt;
Demonstrates privilege revocation&lt;/p&gt;

&lt;p&gt;Task 6: Create readonly_group with SELECT on all tables&lt;/p&gt;

&lt;p&gt;sql CREATE ROLE readonly_group;&lt;/p&gt;

&lt;p&gt;GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_group;&lt;/p&gt;

&lt;p&gt;Explanation  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a group role
&lt;/li&gt;
&lt;li&gt;Grants read-only access to all tables
&lt;/li&gt;
&lt;li&gt;Useful for analysts and reporting users
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Task 7: Create users and assign to group&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
CREATE ROLE analyst1 LOGIN PASSWORD 'password123';&lt;br&gt;
CREATE ROLE analyst2 LOGIN PASSWORD 'password123';&lt;/p&gt;

&lt;p&gt;GRANT readonly_group TO analyst1;&lt;br&gt;
GRANT readonly_group TO analyst2;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Creates multiple users&lt;br&gt;
Assigns them to the group&lt;br&gt;
Inherits permissions automatically&lt;/p&gt;

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

&lt;p&gt;This exercise demonstrates how PostgreSQL enforces secure and structured access control:&lt;/p&gt;

&lt;p&gt;Roles simplify permission management&lt;br&gt;
GRANT and REVOKE control access precisely&lt;br&gt;
Column-level security enhances privacy&lt;br&gt;
Group roles improve scalability&lt;/p&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>security</category>
      <category>sql</category>
    </item>
    <item>
      <title>ASSIGNMENT 34</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:27:05 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-34-1jj1</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-34-1jj1</guid>
      <description>&lt;p&gt;*&lt;em&gt;Design a transaction using the given &lt;code&gt;accounts&lt;/code&gt; table to transfer money from one user to another by debiting the sender and crediting the receiver within a single transaction block. Then introduce errors at different stages of the transaction (such as after the debit operation) and observe whether the database allows partial updates or rolls back the entire transaction. Analyze the results to verify that atomicity is maintained, ensuring that either both operations succeed or none are applied.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In a digital wallet system (like PhonePe/GPay/Paytm), Atomicity ensures:&lt;/p&gt;

&lt;p&gt;A transaction is completed fully or not executed at all.&lt;/p&gt;

&lt;p&gt;This is critical because:&lt;/p&gt;

&lt;p&gt;Partial updates --&amp;gt; money loss&lt;br&gt;
Failed transfers --&amp;gt; inconsistent balances&lt;/p&gt;

&lt;p&gt;Atomicity guarantees:&lt;/p&gt;

&lt;p&gt;Either both debit and credit happen&lt;br&gt;
Or nothing happens&lt;br&gt;
Given Table&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id SERIAL PRIMARY KEY,&lt;br&gt;
    name TEXT NOT NULL,&lt;br&gt;
    balance INT NOT NULL CHECK (balance &amp;gt;= 0),&lt;br&gt;
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Initial Data&lt;/p&gt;

&lt;p&gt;INSERT INTO accounts (name, balance)&lt;br&gt;
VALUES &lt;br&gt;
('Alice', 1000),&lt;br&gt;
('Bob', 500);&lt;/p&gt;

&lt;p&gt;Initial State:&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹1000&lt;br&gt;
Bob --&amp;gt; ₹500&lt;/p&gt;

&lt;p&gt;Step 1: Successful Transaction&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 200 &lt;br&gt;
WHERE name = 'Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance + 200 &lt;br&gt;
WHERE name = 'Bob';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800&lt;br&gt;
Bob --&amp;gt; ₹700&lt;/p&gt;

&lt;p&gt;Both operations succeed&lt;/p&gt;

&lt;p&gt;Step 2: Introduce Failure After Debit&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;BEGIN;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 300 &lt;br&gt;
WHERE name = 'Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET bal = balance + 300 &lt;br&gt;
WHERE name = 'Bob';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Observation&lt;/p&gt;

&lt;p&gt;Second query fails &lt;br&gt;
PostgreSQL automatically aborts the transaction&lt;br&gt;
Entire transaction is rolled back&lt;/p&gt;

&lt;p&gt;Final State&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800 (unchanged)&lt;br&gt;
Bob --&amp;gt; ₹700 (unchanged)&lt;/p&gt;

&lt;p&gt;No partial update&lt;/p&gt;

&lt;p&gt;Step 3: Manual Rollback Scenario&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 400 &lt;br&gt;
WHERE name = 'Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ROLLBACK;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Observation&lt;/p&gt;

&lt;p&gt;Transaction is cancelled&lt;br&gt;
No changes saved&lt;/p&gt;

&lt;p&gt;Final State&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800&lt;br&gt;
Bob --&amp;gt; ₹700&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;Money disappears&lt;br&gt;
System becomes unreliable&lt;br&gt;
How PostgreSQL Ensures Atomicity&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transaction Blocks (BEGIN ... COMMIT)
Groups multiple queries into one unit&lt;/li&gt;
&lt;li&gt;Automatic Rollback on Failure
Any error --&amp;gt; entire transaction is cancelled&lt;/li&gt;
&lt;li&gt;Write-Ahead Logging (WAL)
Tracks changes for safe recovery&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Atomicity ensures:&lt;/p&gt;

&lt;p&gt;Reliable money transfers&lt;br&gt;
No partial transactions&lt;br&gt;
Strong financial integrity&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ASSIGNMENT 35</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:26:55 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-35-2o0m</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-35-2o0m</guid>
      <description>&lt;p&gt;*&lt;em&gt;Using the given &lt;code&gt;accounts&lt;/code&gt; table, test how PostgreSQL maintains data consistency by attempting operations that violate rules such as making the balance negative. Perform invalid updates like deducting more money than available or setting a negative balance, observe the errors produced, and explain whether these failures are due to database constraints or transaction logic. Finally, analyze how consistency is ensured and differentiate between rules enforced by the database schema and those handled at the application level.&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In a digital wallet system (like PhonePe/GPay/Paytm), consistency ensures that the database always remains in a valid state.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;A user should never have a negative balance&lt;br&gt;
Invalid transactions must be rejected&lt;br&gt;
Only valid data should be stored&lt;/p&gt;

&lt;p&gt;PostgreSQL enforces this using constraints, while additional rules are handled through transaction logic.&lt;/p&gt;

&lt;p&gt;Given Table&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id SERIAL PRIMARY KEY,&lt;br&gt;
    name TEXT NOT NULL,&lt;br&gt;
    balance INT NOT NULL CHECK (balance &amp;gt;= 0),&lt;br&gt;
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Key Rule&lt;/p&gt;

&lt;p&gt;CHECK (balance &amp;gt;= 0)&lt;/p&gt;

&lt;p&gt;Ensures balance is never negative&lt;/p&gt;

&lt;p&gt;Step 1: Insert Dummy Data&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INSERT INTO accounts (name, balance)&lt;br&gt;
VALUES &lt;br&gt;
('Alice', 1000),&lt;br&gt;
('Bob', 500);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Try Invalid Operation (Over-Deduction)&lt;br&gt;
Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 1500 &lt;br&gt;
WHERE name = 'Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Deduction makes balance = -500&lt;br&gt;
Violates CHECK (balance &amp;gt;= 0)&lt;/p&gt;

&lt;p&gt;Database blocks the update&lt;/p&gt;

&lt;p&gt;Step 3: Directly Setting Negative Balance&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = -100 &lt;br&gt;
WHERE name = 'Bob';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Some rules must be handled manually:&lt;/p&gt;

&lt;p&gt;Example (Safe Transfer Logic)&lt;br&gt;
&lt;code&gt;BEGIN;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check balance first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;SELECT balance FROM accounts WHERE name='Alice';&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only proceed if sufficient balance
&lt;code&gt;UPDATE accounts 
SET balance = balance - 500 
WHERE name='Alice' AND balance &amp;gt;= 500;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance + 500 &lt;br&gt;
WHERE name='Bob';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Final Analysis&lt;/p&gt;

&lt;p&gt;Observations&lt;/p&gt;

&lt;p&gt;PostgreSQL prevents invalid states using constraints&lt;br&gt;
Invalid operations are rejected immediately&lt;br&gt;
Database ensures consistency at data level&lt;/p&gt;

&lt;p&gt;Limitations&lt;/p&gt;

&lt;p&gt;Database doesn’t understand business logic fully&lt;br&gt;
Needs application checks for:&lt;br&gt;
Sufficient balance before transfer&lt;br&gt;
Fraud detection&lt;br&gt;
Transaction validation&lt;/p&gt;

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

&lt;p&gt;Consistency is a shared responsibility&lt;/p&gt;

&lt;p&gt;Database --&amp;gt; enforces structural rules&lt;br&gt;
Application --&amp;gt; enforces logical rules&lt;/p&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ASSIGNMENT 37</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:26:46 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-37-p8i</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-37-p8i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Design a digital wallet system (like PhonePe/GPay/Paytm) using the given accounts table and sample data. Perform a money transfer between two users within a transaction and commit the changes. Then simulate a system crash or restart and retrieve the account balances to verify whether the committed transaction persists. Based on your observation, explain how the database ensures durability, and analyze what happens if a failure occurs just before or just after the COMMIT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In applications like PhonePe / GPay / Paytm, even a tiny inconsistency can cause:&lt;/p&gt;

&lt;p&gt;Money loss&lt;br&gt;
Duplicate transactions&lt;br&gt;
Incorrect balances&lt;/p&gt;

&lt;p&gt;To prevent this, databases follow ACID properties, where Durability ensures:&lt;/p&gt;

&lt;p&gt;Once a transaction is committed, it is permanently stored — even if the system crashes.&lt;/p&gt;

&lt;p&gt;Given Table Structure&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id SERIAL PRIMARY KEY,&lt;br&gt;
    name TEXT NOT NULL,&lt;br&gt;
    balance INT NOT NULL CHECK (balance &amp;gt;= 0),&lt;br&gt;
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;balance &amp;gt;= 0 prevents negative money&lt;br&gt;
last_updated tracks latest changes&lt;br&gt;
Ensures basic integrity&lt;/p&gt;

&lt;p&gt;Step 1: Insert Dummy Data&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INSERT INTO accounts (name, balance)&lt;br&gt;
VALUES &lt;br&gt;
('Alice', 1000),&lt;br&gt;
('Bob', 500);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Initial State:&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹1000&lt;br&gt;
Bob --&amp;gt; ₹500&lt;/p&gt;

&lt;p&gt;Step 2: Perform a Transaction (Transfer Money)&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance - 200, last_updated = CURRENT_TIMESTAMP&lt;br&gt;
WHERE name = 'Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts &lt;br&gt;
SET balance = balance + 200, last_updated = CURRENT_TIMESTAMP&lt;br&gt;
WHERE name = 'Bob';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result After Commit&lt;br&gt;
Alice --&amp;gt; ₹800&lt;br&gt;
Bob --&amp;gt; ₹700&lt;/p&gt;

&lt;p&gt;Transaction successful and committed&lt;/p&gt;

&lt;p&gt;Step 3: Simulate System Crash / Restart&lt;/p&gt;

&lt;p&gt;Now imagine:&lt;/p&gt;

&lt;p&gt;Database crashes &lt;br&gt;
Server restarts &lt;/p&gt;

&lt;p&gt;Observation After Restart&lt;/p&gt;

&lt;p&gt;Output remains:&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800&lt;br&gt;
Bob --&amp;gt; ₹700&lt;/p&gt;

&lt;p&gt;Changes are still محفوظ (persisted)&lt;/p&gt;

&lt;p&gt;Why Did This Work? (Durability Explained)&lt;/p&gt;

&lt;p&gt;Durability is guaranteed by the database using:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write-Ahead Logging (WAL)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before modifying data, changes are written to a log file&lt;br&gt;
Even if crash happens → database can recover using logs&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;p&gt;“Write it in a notebook before actually doing it”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit = Permanent Record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once COMMIT is executed:&lt;br&gt;
Changes are flushed to disk&lt;br&gt;
Marked as permanent&lt;/p&gt;

&lt;p&gt;What Happens During Failures?&lt;/p&gt;

&lt;p&gt;Case 1: Crash BEFORE COMMIT&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts SET balance = balance - 200 WHERE name='Alice';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result after restart:&lt;/p&gt;

&lt;p&gt;Transaction is rolled back&lt;/p&gt;

&lt;p&gt;Alice still --&amp;gt; ₹1000&lt;/p&gt;

&lt;p&gt;No partial updates (Atomicity + Durability)&lt;/p&gt;

&lt;p&gt;Case 2: Crash AFTER COMMIT&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result after restart:&lt;/p&gt;

&lt;p&gt;Changes are preserved&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800&lt;/p&gt;

&lt;p&gt;Durability ensures no data loss&lt;/p&gt;

&lt;p&gt;What If Durability Didn’t Exist?&lt;/p&gt;

&lt;p&gt;Without durability:&lt;/p&gt;

&lt;p&gt;Transactions may disappear after crash&lt;br&gt;
Users could:&lt;br&gt;
Lose money&lt;/p&gt;

&lt;p&gt;Real-World Implementation (Wallet Apps)&lt;/p&gt;

&lt;p&gt;Apps like PhonePe / GPay / Paytm ensure durability by:&lt;/p&gt;

&lt;p&gt;Using robust databases (PostgreSQL, MySQL)&lt;br&gt;
Maintaining replicated logs across servers&lt;br&gt;
Performing frequent backups&lt;br&gt;
Using distributed transaction systems&lt;/p&gt;

&lt;p&gt;Final Conclusion&lt;/p&gt;

&lt;p&gt;Key Takeaways&lt;/p&gt;

&lt;p&gt;COMMIT = guarantee of persistence&lt;br&gt;
Database logs ensure recovery after crash&lt;br&gt;
Durability prevents data loss in financial systems&lt;/p&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>sql</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>ASSIGNMENT 38</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:26:38 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-38-24op</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-38-24op</guid>
      <description>&lt;p&gt;&lt;strong&gt;Simulate a situation where the same transfer operation is executed more than once, as might happen in a real system due to network retries or duplicate requests. Perform the same deduction and credit operations multiple times and observe how the account balances are affected. Analyze whether the system prevents duplicate processing or allows the same transaction to be applied repeatedly. Based on your observations, think about how real-world systems ensure that repeated requests do not lead to inconsistent or duplicated state changes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In real-world systems (like banking or payment apps), a transaction might be sent multiple times due to:&lt;/p&gt;

&lt;p&gt;Network retries&lt;br&gt;
Slow server responses&lt;br&gt;
Duplicate API requests&lt;/p&gt;

&lt;p&gt;If the system is not designed properly, this can lead to duplicate deductions or credits, causing incorrect balances.&lt;/p&gt;

&lt;p&gt;Step 1: Create Accounts Table&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100),&lt;br&gt;
    balance DECIMAL(10,2)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Stores account details&lt;br&gt;
balance represents available money&lt;/p&gt;

&lt;p&gt;Step 2: Insert Sample Data&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INSERT INTO accounts VALUES (1, 'Alice', 1000);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;INSERT INTO accounts VALUES (2, 'Bob', 500);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹1000&lt;br&gt;
Bob --&amp;gt; ₹500&lt;/p&gt;

&lt;p&gt;Step 3: Simulate a Transfer (Single Execution)&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts SET balance = balance - 200 WHERE id = 1;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;UPDATE accounts SET balance = balance + 200 WHERE id = 2;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹800&lt;br&gt;
Bob --&amp;gt; ₹700&lt;/p&gt;

&lt;p&gt;Step 4: Simulate Duplicate Execution (Retry Scenario)&lt;/p&gt;

&lt;p&gt;Code &lt;/p&gt;

&lt;p&gt;&lt;code&gt;UPDATE accounts SET balance = balance - 200 WHERE id = 1;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;UPDATE accounts SET balance = balance + 200 WHERE id = 2;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;Alice --&amp;gt; ₹600&lt;br&gt;
Bob --&amp;gt; ₹900 &lt;/p&gt;

&lt;p&gt;Observation&lt;/p&gt;

&lt;p&gt;The system allowed duplicate processing&lt;br&gt;
Same transaction applied twice&lt;br&gt;
No mechanism to detect duplicates&lt;/p&gt;

&lt;p&gt;This leads to:&lt;/p&gt;

&lt;p&gt;Incorrect balances&lt;br&gt;
Financial inconsistency&lt;br&gt;
Potential fraud or system failure&lt;/p&gt;

&lt;p&gt;The database:&lt;/p&gt;

&lt;p&gt;Executes each query independently&lt;br&gt;
Has no memory of previous transactions&lt;br&gt;
Cannot identify if the request is a duplicate&lt;/p&gt;

&lt;p&gt;Real-World Solutions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transaction ID (Idempotency Key)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE transactions (&lt;br&gt;
    txn_id VARCHAR(50) PRIMARY KEY,&lt;br&gt;
    from_account INT,&lt;br&gt;
    to_account INT,&lt;br&gt;
    amount DECIMAL(10,2)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each request has a unique txn_id&lt;br&gt;
Duplicate txn_id --&amp;gt; rejected automatically&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check Before Processing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Logic&lt;/p&gt;

&lt;p&gt;IF NOT EXISTS (SELECT * FROM transactions WHERE txn_id = 'TXN123') THEN&lt;br&gt;
   -- perform transfer&lt;br&gt;
END IF;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Database Transactions (ACID)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;START TRANSACTION;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;code&gt;UPDATE accounts SET balance = balance - 200 WHERE id = 1;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;UPDATE accounts SET balance = balance + 200 WHERE id = 2;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COMMIT;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ensures atomicity&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unique Constraint on Transactions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE transactions&lt;br&gt;
ADD CONSTRAINT unique_txn UNIQUE (txn_id);&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Application-Level Idempotency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;APIs store request IDs&lt;/p&gt;

&lt;p&gt;If same request comes again → return previous result&lt;br&gt;
Used by systems like:&lt;br&gt;
Payment gateways&lt;br&gt;
Banking apps&lt;/p&gt;

&lt;p&gt;Final Conclusion&lt;/p&gt;

&lt;p&gt;Key Findings&lt;br&gt;
Basic SQL operations do NOT prevent duplicate execution&lt;br&gt;
Same transaction can be applied multiple times&lt;br&gt;
Leads to data inconsistency&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>ASSIGNMENT 39</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:26:28 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-39-57po</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-39-57po</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Students table with unique ID&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Each student must have a unique identifier.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE students (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100),&lt;br&gt;
    age INT&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;PRIMARY KEY ensures:&lt;br&gt;
No duplicate IDs&lt;br&gt;
No NULL values&lt;br&gt;
Each student is uniquely identified.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Employees table with required name &amp;amp; email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Some fields are mandatory, while others can be optional.&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;code&gt;CREATE TABLE employees (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100) NOT NULL,&lt;br&gt;
    email VARCHAR(100) NOT NULL,&lt;br&gt;
    phone_number VARCHAR(15)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;NOT NULL ensures name and email must be provided&lt;br&gt;
phone_number is optional (can be NULL)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Users table with unique username &amp;amp; email
Introduction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Usernames and emails must be unique for authentication systems.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE users (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    username VARCHAR(50) UNIQUE,&lt;br&gt;
    email VARCHAR(100) UNIQUE&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;UNIQUE prevents duplicate values&lt;br&gt;
Ensures no two users share the same username/email&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Products table with price and stock constraints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Products must have valid pricing and stock values.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE products (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100),&lt;br&gt;
    price DECIMAL(10,2) CHECK (price &amp;gt; 0),&lt;br&gt;
    stock INT CHECK (stock &amp;gt;= 0)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;CHECK (price &amp;gt; 0) --&amp;gt; no free/negative products&lt;br&gt;
CHECK (stock &amp;gt;= 0) --&amp;gt; stock cannot be negative&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Orders table with default status &amp;amp; timestamp&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Automating values reduces manual errors.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE orders (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    status VARCHAR(50) DEFAULT 'pending',&lt;br&gt;
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;DEFAULT 'pending' --&amp;gt; automatic order status&lt;br&gt;
CURRENT_TIMESTAMP --&amp;gt; stores insertion time&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accounts table with constraints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Bank accounts need strict validation rules.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE accounts (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    account_number VARCHAR(20) UNIQUE NOT NULL,&lt;br&gt;
    balance DECIMAL(10,2) CHECK (balance &amp;gt;= 0)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;UNIQUE NOT NULL --&amp;gt; ensures valid account numbers&lt;br&gt;
CHECK (balance &amp;gt;= 0) --&amp;gt; prevents negative balance&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enrollments table with composite uniqueness&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;A student can enroll in many courses—but not the same course twice.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE enrollments (&lt;br&gt;
    student_id INT,&lt;br&gt;
    course_id INT,&lt;br&gt;
    UNIQUE (student_id, course_id)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Composite UNIQUE ensures:&lt;br&gt;
No duplicate student-course combinations&lt;br&gt;
Allows multiple courses per student&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Departments &amp;amp; Employees with foreign key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Relationships between tables ensure data consistency.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE departments (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE employees (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100),&lt;br&gt;
    department_id INT,&lt;br&gt;
    FOREIGN KEY (department_id) REFERENCES departments(id)&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;FOREIGN KEY links employees to departments&lt;br&gt;
Prevents invalid department references&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Foreign key with CASCADE options&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Sometimes related data should update/delete automatically.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE TABLE employees (&lt;br&gt;
    id INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(100),&lt;br&gt;
    department_id INT,&lt;br&gt;
    FOREIGN KEY (department_id)&lt;br&gt;
    REFERENCES departments(id)&lt;br&gt;
    ON DELETE CASCADE&lt;br&gt;
    ON UPDATE CASCADE&lt;br&gt;
);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;ON DELETE CASCADE --&amp;gt; deletes employees when department is deleted&lt;br&gt;
ON UPDATE CASCADE --&amp;gt; updates employee records if department ID changes&lt;/p&gt;

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

&lt;p&gt;Using constraints in table creation:&lt;/p&gt;

&lt;p&gt;Improves data integrity&lt;br&gt;
Prevents invalid or duplicate data&lt;br&gt;
Maintains relationships between tables&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ASSIGNMENT 40</title>
      <dc:creator>Haripriya V</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:26:20 +0000</pubDate>
      <link>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-40-268d</link>
      <guid>https://dev.to/haripriya_v_7e6e5d35f526a/assignment-40-268d</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Enforcing NOT NULL on email in customers table&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Sometimes, a column initially allows NULL values, but later business rules require it to always have data. Here, we enforce that every customer must have an email.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE customers MODIFY email VARCHAR(255) NOT NULL;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;MODIFY changes the definition of the column.&lt;br&gt;
NOT NULL ensures future records must include an email.&lt;br&gt;
Existing NULL values must be handled before applying this (or it will fail).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Making username UNIQUE in users table&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Usernames should be unique to avoid duplication and conflicts.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE users ADD CONSTRAINT unique_username UNIQUE (username);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Adds a UNIQUE constraint.&lt;br&gt;
Prevents duplicate usernames.&lt;br&gt;
Automatically creates an index for faster lookups.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enforcing price &amp;gt; 0 in products table&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Products should never have zero or negative prices.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE products ADD CONSTRAINT check_price CHECK (price &amp;gt; 0);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;CHECK constraint validates data before insertion/update.&lt;br&gt;
Ensures all product prices are strictly positive.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting default status as 'pending' in orders&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;If no status is provided, the system should automatically assign a default value.&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;code&gt;ALTER TABLE orders MODIFY status VARCHAR(50) DEFAULT 'pending';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;DEFAULT 'pending' assigns a value automatically.&lt;br&gt;
Simplifies insert operations and ensures consistency.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adding salary column with constraints in employees&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;We add a new column with rules to ensure valid salary values.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE employees ADD salary DECIMAL(10,2) NOT NULL CHECK (salary &amp;gt; 10000);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Adds a new column salary.&lt;br&gt;
NOT NULL → salary is mandatory.&lt;br&gt;
CHECK → ensures salary is greater than 10,000.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cascading delete between departments and employees&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;When a department is deleted, all related employees should also be removed automatically.&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;code&gt;ALTER TABLE employees DROP FOREIGN KEY fk_department;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;code&gt;ALTER TABLE employees&lt;br&gt;
ADD CONSTRAINT fk_department&lt;br&gt;
FOREIGN KEY (department_id)&lt;br&gt;
REFERENCES departments(id)&lt;br&gt;
ON DELETE CASCADE;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;First removes the existing foreign key.&lt;br&gt;
Recreates it with ON DELETE CASCADE.&lt;br&gt;
Ensures dependent rows are automatically deleted.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Removing CHECK constraint from accounts table&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Sometimes constraints are no longer needed and must be removed.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE accounts DROP CHECK check_balance;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Removes the constraint enforcing balance &amp;gt;= 0.&lt;br&gt;
Constraint name (check_balance) must be known beforehand.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Making (user_id, transaction_id) unique in payments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;Some scenarios require composite uniqueness, where a combination of columns must be unique.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ALTER TABLE payments ADD CONSTRAINT unique_payment UNIQUE (user_id, transaction_id);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explanation&lt;/p&gt;

&lt;p&gt;Ensures no duplicate pair of user_id and transaction_id.&lt;br&gt;
Useful for preventing duplicate transactions per user.&lt;/p&gt;

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

&lt;p&gt;Using ALTER TABLE, we can:&lt;/p&gt;

&lt;p&gt;Enforce data integrity rules&lt;br&gt;
Modify existing schema without recreating tables&lt;br&gt;
Improve data quality and reliability&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
