Sometimes we need receive alert on client side about some event on SQL server without request. For instance, data is changed and we want notify all client applications.It is possible to realize this option with extended stored procedure contained in dynamic-link library, that send broadcast packets through sockets via UDP. The creation of an extended stored procedure was made in С++ Builder 6, with use of ODS (Open Data Service) API for MS SQL Server 2000. To take into consideration that static library Opends60.lib with this Borland IDE, which realize all services of ODS API, has outdated version and support only MS SQL 7. You may get import library file there or create it self-dependent with Implib utility. Also, to be noticed that UDP not ensure the message delivery, but don’t require a connection, as TCP. This is main reason why UDP was choosen.
The simple example of using alerts is generation
event from user audit table’s trigger after adding new record. The
structure of “EVENT” table consist of unique record identifier, user
login and message. The extended stored procedure "xp_event" may
has following input parameters: <host name>, <port
number>,<message text>, <user name>, <record
identifier>. You may use broadcast address in host name argument.
For instance, 18.104.22.168 (net-directed broadcast ) or 255.255.255.255
(limited broadcast address). Also you may use the local network
computer’s name. Notice, that if your net has subnets, then router
didn’t admit any broadcast packet without addition settings. The number
of UDP port is optional, but you should avoid system ports that are
using by OS. By default, the client listen 3338 port.
component has two methods: Start and Stop, which creates new process for port
listening and stop it correspondingly, i.e. the client has UDP server
The event OnGetMessage comes in the moment of notification delivery,
pointer to TLabel visual component allows display a getting message at
form. The structure are using for sending broadcast messages has the
The thread gets an alert and synchronize
properties Message, RecordId and Login of TSQLAlerter class
object in AddMessage() method. The example of registration procedure
and realization of delivery notification you may look in script.
/*TSQLAlerter.sql*/-- Only add an extended stored procedure to the master database.
-- If 'xp_event' already exist, drops an extended stored procedure.
IF EXISTS (SELECT name FROM sysobjects/* sp_addextendedproc adds entries to the sysobjects table, registering the name of the new extended
WHERE name = 'xp_event' AND type = 'X')
EXEC sp_dropextendedproc 'xp_event'
stored procedure with SQL Server. It also adds an entry in the syscomments table.
First argument is the name of the function to call within the dynamic-link library procedure,
second argument is the name of the DLL containing the function.*/
EXEC sp_addextendedproc xp_event, 'dll_event.dll'
-- If table 'EVENTS' already exist, drops table.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'EVENTS' AND type = 'U')
DROP TABLE EVENTS
CREATE TABLE dbo.EVENTS (-- If trigger
[ID] INT IDENTITY(1,1) NOT NULL,
[LOGIN] CHAR(255) NULL,
[MESSAGE] TEXT NULL
'events_trg'already exist, drops trigger.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'events_trg' AND type = 'TR')
DROP TRIGGER events_trg
-- To execute an extended stored procedure from a database
CREATE TRIGGER events_trg
declare @login varchar(20)
declare @message varchar(2000)
declare @id int
select @login=rtrim(LOGIN),@id = ID from inserted
select @message = EVENTS.MESSAGE from inserted join EVENTS on EVENTS.ID=inserted.ID
-- other than master, qualify the name of the extended stored procedure with master.
-- 'xp_event' parameters: <host name or broadcast address>, <port number>,
-- <message text>, <user name>, <record identifier>.
EXEC master..xp_event '255.255.255.255',3338,@message,@login,@id
We used TSQLAlerter component in own bug-tracking system, for notifications programmers and quality assuranceengineers
when bug's status was close or changed.