Index: .idea/sqldialects.xml
===================================================================
--- .idea/sqldialects.xml	(revision ac668234e5932db09f8950c545fe0b558551bbcd)
+++ .idea/sqldialects.xml	(revision 77b2536c76d3a04bc29b398d9805a99f346b55fe)
@@ -2,4 +2,5 @@
 <project version="4">
   <component name="SqlDialectMappings">
+    <file url="file://$PROJECT_DIR$/music/triggers/normalize_and_validate_customer_email.sql" dialect="PostgreSQL" />
     <file url="file://$PROJECT_DIR$/music/triggers/update_invoice_total_after_delete.sql" dialect="PostgreSQL" />
     <file url="file://$PROJECT_DIR$/music/triggers/update_invoice_total_after_insert.sql" dialect="PostgreSQL" />
Index: music/triggers/normalize_and_validate_customer_email.sql
===================================================================
--- music/triggers/normalize_and_validate_customer_email.sql	(revision 77b2536c76d3a04bc29b398d9805a99f346b55fe)
+++ music/triggers/normalize_and_validate_customer_email.sql	(revision 77b2536c76d3a04bc29b398d9805a99f346b55fe)
@@ -0,0 +1,17 @@
+CREATE OR REPLACE FUNCTION normalize_and_validate_customer_email()
+RETURNS TRIGGER AS $$
+BEGIN
+    NEW.email := LOWER(NEW.email);
+
+    IF NEW.email !~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN
+        RAISE EXCEPTION 'Invalid email format: %', NEW.email;
+    END IF;
+
+    RETURN NEW;
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE TRIGGER trg_normalize_validate_email
+BEFORE INSERT ON customer
+FOR EACH ROW
+EXECUTE FUNCTION normalize_and_validate_customer_email();
