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, 223.1.2.255 (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.
The TSQLAlerter
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
roles.
The event OnGetMessage comes in the moment of notification delivery,
and the
pointer to TLabel visual component allows display a getting message at
the
form. The structure are using for sending broadcast messages has the
following
view:
typedef struct TDATASEND //
The structure for sending alerts
{
char message[1024];
char login[1024];
long id;
} TDATASEND;
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.USE master
-- 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'
GO
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
GO
/*Create 'EVENTS'
table*/
CREATE TABLE dbo.EVENTS (
-- If trigger
[ID] INT IDENTITY(1,1) NOT NULL,
[LOGIN] CHAR(255) NULL,
[MESSAGE] TEXT NULL
)
GO'events_trg'
already exist, drops trigger.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'events_trg' AND type = 'TR')
DROP TRIGGER events_trg
GO/*Create 'events_trg'
trigger*/
-- To execute an extended stored procedure from a database
CREATE TRIGGER events_trg
ON EVENTS
FOR INSERT
AS
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 assurance engineers when bug's status was close or changed.