.SYNOPSIS
    Query Notification for Monitoring Data Changes

  .DESCRIPTION
    Sometimes it is of interest to get notify about data changes, e.g. if a new sales order is entered or some main data was modified.
    With this Powershell script you can monitor data changes in a single table, like inserts, updates and deletes.
    But: It notifies only about changes, not who changed the data and not what data has been changed, it informs you only about the DML type.

  .REQUIREMENTS
    - The Service Broker on the database must be enabled.
      => ALTER DATABASE [AdventureWorks] SET ENABLE_BROKER WITH NO_WAIT;
    - See "Creating a Query for Notification" link below for the restrictions regarding queries.
    - The sample uses the AdventureWorks database.

  .KNOWN ISSUSES
    A script is not the best choose for event driven actions, as this script do. It uses a Wait-Event at the
    end to keep it running, you have to "hard stop" the script with Ctrl + C in Powershell or Shift + F5 in PowerGUI.
    May there is a better solution for it.
   
  .NOTES
    Author  : Olaf Helper
    Requires: PowerShell Version 1.0

  .LINKS
     SqlDependency: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx
     Using Query Notifications: http://msdn.microsoft.com/en-us/library/ms175110.aspx
     Creating a Query for Notification: http://msdn.microsoft.com/en-us/library/ms181122.aspx

 

PowerShell
Skript bearbeiten|Remove
<# 
  .SYNOPSIS 
    Query Notification for Monitoring Data Changes 
 
  .DESCRIPTION 
    Sometimes it is of interest to get notify about data changes, e.g. if a new sales order is entered or some main data was modified. 
    With this Powershell script you can monitor data changes in a single table, like inserts, updates and deletes. 
    But: It notifies only about changes, not who changed the data and not what data has been changed, it informs you only about the DML type. 
 
  .REQUIREMENTS 
    - The Service Broker on the database must be enabled. 
      => ALTER DATABASE [AdventureWorks] SET ENABLE_BROKER WITH NO_WAIT; 
    - See "Creating a Query for Notification" link below for the restrictions regarding queries. 
    - The sample uses the AdventureWorks database. 
 
  .KNOWN ISSUSES 
    A script is not the best choose for event driven actions, as this script do. It uses a Wait-Event at the 
    end to keep it running, you have to "hard stop" the script with Ctrl + C in Powershell or Shift + F5 in PowerGUI. 
    May there is a better solution for it. 
     
  .NOTES 
    Author  : Olaf Helper 
    Requires: PowerShell Version 1.0 
 
  .LINKS 
     SqlDependency: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx 
     Using Query Notifications: http://msdn.microsoft.com/en-us/library/ms175110.aspx 
     Creating a Query for Notification: http://msdn.microsoft.com/en-us/library/ms181122.aspx 
 
#> 
 
# Configuration data 
[string] $script:connStr = "Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True;"; 
 
# Select-Statement with filter for the datasets to monitor. 
[string] $script:sql = " 
SELECT [AddressID] 
      ,[AddressLine1] 
      ,[AddressLine2] 
      ,[City] 
      ,[StateProvinceID] 
      ,[PostalCode] 
      ,[rowguid] 
      ,[ModifiedDate] 
  FROM [Person].[Address] 
 WHERE [AddressID] <= 100"; 
 
function startNotification 
{ 
    # Open ADO.NET Connection with the connection string. 
    $con = New-Object Data.SqlClient.SqlConnection; 
    $con.ConnectionString = $script:connStr; 
    $con.Open(); 
 
    # New command and reader. 
    $cmd = New-Object Data.SqlClient.SqlCommand $script:sql, $con; 
    $dep = New-Object Data.SqlClient.SqlDependency $cmd; 
 
    # Register event "OnEvent" and define action for it. 
    Register-ObjectEvent $dep "OnChange" -SourceIdentifier "PoShSsasQueryNotification" -Action ` 
    { 
        $args = $event.SourceEventArgs; 
        $msg = "Type: " + $args.Type.ToString() + " / Info: " + $args.Info.ToString(); 
        Write-Host ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + " " + $msg); 
 
        Unregister-Event -SourceIdentifier "PoShSsasQueryNotification"; 
 
        if ($args.Info -ne [Data.SqlClient.SqlNotificationInfo]::Invalid ` 
            -and $args.Type -ne [Data.SqlClient.SqlNotificationType]::Subscribe) 
        {   startNotification;   } 
    }  | Out-Null; 
 
    $cmd.ExecuteNonQuery() | Out-Null; 
    $cmd.Dispose(); 
    $con.Close(); 
    $con.Dispose(); 
} 
 
Write-Output ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Started ..."); 
Write-Output ((Get-Date -format yyyy-MM-dd-HH:mm:ss) + ": Press Ctrl + C to stop the script."); 
 
# Start  
[Data.SqlClient.SqlDependency]::Start($script:connStr) | Out-Null; 
 
startNotification; 
Wait-Event; 
 
#Unregister-Event -SourceIdentifier "PoShSsasQueryNotification"; 
#[Data.SqlClient.SqlDependency]::Stop($script:connStr);