|  |  | Knowledge baseMS SQL-server triggerThe examples given below are based on a minimum
SQL-server version of 7. Use Query analyzer to create the tables and triggers. Everything put between <> should be
converted to the name relevant in your application. The trigger examples below use only 2
alphanumeric and 1 numeric primary key field. Adapt the script to your specific
needs. Creating HEAD and TRBCREATE TABLE HEAD (HEADER         NUMERIC NOT NULL,
 MAXI           NUMERIC NOT NULL,
 PRIMARY KEY (HEADER))
 go
 INSERT INTO HEAD VALUES(1,100)
 go
 
 
 CREATE TABLE TRB (
 IND            NUMERIC NOT NULL,
 TABL		      VARCHAR(50) NOT NULL,
 EVENT          VARCHAR(1) NOT NULL,
 SK1            VARCHAR(50) NULL,
 SK2            VARCHAR(50) NULL,
 SK3            VARCHAR(50) NULL,
 SK4            VARCHAR(50) NULL,
 SK5            VARCHAR(50) NULL,
 NK1            NUMERIC NULL,
 NK2            NUMERIC NULL,
 NK3            NUMERIC NULL,
 NK4            NUMERIC NULL,
 NK5            NUMERIC NULL,
 FLD
VARCHAR(50) NULL,
 PRIMARY KEY (IND))
 go
 INSERT INTO TRB (IND,TABL,EVENT,SK1) VALUES (1,'Promes','1','Promes')
 go
 
 Remark: The value 100 in the MAXI field of HEAD
should be the real maximum of your circular buffer. Most likely this is even
more then 10000. The insert in TRB is needed because the trigger would fail to
run the first time. Creating an insert triggerCREATE TRIGGER <Trigger
name> on <Table name> for INSERT ASDECLARE
 @realhead	NUMERIC,
 @in_table	NUMERIC,
 @maximum	NUMERIC,
 @sk1		VARCHAR(50),
 @sk2		VARCHAR(50),
 @sk3		VARCHAR(50),
 @sk4		VARCHAR(50),
 @sk5		VARCHAR(50),
 @nk1		NUMERIC,
 @nk2		NUMERIC,
 @nk3		NUMERIC,
 @nk4		NUMERIC,
 @nk5		NUMERIC
 BEGIN
 set CURSOR_CLOSE_ON_COMMIT on
 declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from inserted
 open <Cursor name>
 fetch next from <Cursor name>
into @sk1,@sk2,@nk1
 WHILE (@@FETCH_STATUS <> -1)
 begin
 SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD
 SELECT @in_table = MAX(IND) FROM TRB
 set @realhead=@realhead+1
 IF @realhead>@maximum
 BEGIN
 set @realhead=1
 END
 IF @in_table<@realhead
 BEGIN
 INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values
 (@realhead,'<Table
name>','1',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL)
 UPDATE HEAD SET HEADER=@realhead
 END
 ELSE
 BEGIN
 UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='1',SK1=@sk1,
 SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead;
 UPDATE HEAD SET HEADER=@realhead;
 END
 fetch next from <Cursor
name> into @sk1,@sk2,@nk1
 end
 close <Cursor name>
 deallocate <Cursor name>
 commit
 END
 
 GO
 
 Creating an update triggerCREATE TRIGGER <Trigger
name> on <Table name> for UPDATE ASDECLARE
 @realhead	NUMERIC,
 @in_table	NUMERIC,
 @maximum	NUMERIC,
 @sk1		VARCHAR(50),
 @sk2		VARCHAR(50),
 @sk3		VARCHAR(50),
 @sk4		VARCHAR(50),
 @sk5		VARCHAR(50),
 @nk1		NUMERIC,
 @nk2		NUMERIC,
 @nk3		NUMERIC,
 @nk4		NUMERIC,
 @nk5		NUMERIC
 BEGIN
 set CURSOR_CLOSE_ON_COMMIT on
 declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from inserted
 open <Cursor name>
 fetch next from <Cursor name> into
@sk1,@sk2,@nk1
 WHILE (@@FETCH_STATUS <> -1)
 begin
 SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD
 SELECT @in_table = MAX(IND) FROM TRB
 set @realhead=@realhead+1
 IF @realhead>@maximum
 BEGIN
 set @realhead=1
 END
 IF @in_table<@realhead
 BEGIN
 INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values
 (@realhead,'<Table
name>','2',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL)
 UPDATE HEAD SET HEADER=@realhead
 END
 ELSE
 BEGIN
 UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='2',SK1=@sk1,
 SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead;
 UPDATE HEAD SET HEADER=@realhead;
 END
 fetch next from <Cursor
name> into @sk1,@sk2,@nk1
 end
 close <Cursor name>
 deallocate <Cursor name>
 commit
 END
 
 GO
 
 Creating a delete triggerCREATE TRIGGER <Trigger
name> on <Table name> for DELETE ASDECLARE
 @realhead	NUMERIC,
 @in_table	NUMERIC,
 @maximum	NUMERIC,
 @sk1		VARCHAR(50),
 @sk2		VARCHAR(50),
 @sk3		VARCHAR(50),
 @sk4		VARCHAR(50),
 @sk5		VARCHAR(50),
 @nk1		NUMERIC,
 @nk2		NUMERIC,
 @nk3		NUMERIC,
 @nk4		NUMERIC,
 @nk5		NUMERIC
 BEGIN
 set CURSOR_CLOSE_ON_COMMIT on
 declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from
deleted
 open <Cursor name>
 fetch next from <Cursor name> into
@sk1,@sk2,@nk1
 WHILE (@@FETCH_STATUS <> -1)
 begin
 SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD
 SELECT @in_table = MAX(IND) FROM TRB
 set @realhead=@realhead+1
 IF @realhead>@maximum
 BEGIN
 set @realhead=1
 END
 IF @in_table<@realhead
 BEGIN
 INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values
 (@realhead,'<Table
name>','3',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL)
 UPDATE HEAD SET HEADER=@realhead
 END
 ELSE
 BEGIN
 UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='3',SK1=@sk1,
 SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead;
 UPDATE HEAD SET HEADER=@realhead;
 END
 fetch next from <Cursor
name> into @sk1,@sk2,@nk1
 end
 close <Cursor name>
 deallocate <Cursor name>
 commit
 END
 
 GO
 
 |  |