-- Listing 16.16

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
using System.Transactions;
namespace Helion.Examples
{
   public partial class Triggers
   {
      private static readonly Regex email_pattern = new Regex
       (
         // Cz przed znakiem @ ("nazwa lokalna").
         "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*" +
         // Nazwa domeny po znaku @.
         "@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+" +
         // Domena najwyszego poziomu.
         "(?:[a-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\\b$"
      );
      [Microsoft.SqlServer.Server.SqlTrigger(
         Name = "EmailAddressTrigger",
         Target = "[Person].[EmailAddress]",
         Event = "FOR INSERT, UPDATE")]
      public static void EmailAddressTrigger()
      {
         SqlTriggerContext tContext = SqlContext.TriggerContext;
         // Pobierz poczenie wykorzystywane przez wyzwalacz.
         using (SqlConnection cn
            = new SqlConnection(@"context connection=true"))
         {
            SqlCommand cmd;
            SqlDataReader r;
            cn.Open();
            cmd = new SqlCommand(@"SELECT EmailAddress FROM INSERTED", cn);
            r = cmd.ExecuteReader();
            try
            {
               while (r.Read())
               {
                  if (!email_pattern.IsMatch(r.GetString(0).ToLower()))
                      Transaction.Current.Rollback();
               }
            }
            catch (SqlException ex)
            {
               // Przechwy oczekiwany wyjtek.
            }
            finally
            {
               r.Close();
               cn.Close();
            }
         }
      }
   }
}

