all groups > sql server programming > april 2007 >
You're in the

sql server programming

group:

Trigger problem:


Trigger problem: manish1.agarwal NO[at]SPAM gmail.com
4/20/2007 4:07:51 PM
sql server programming:
1) This will affect two tables. Account and Treatment.
2) Trigger is on Account for update and insert
3) After insert or update in Account an insert will be there in
Treatment.
4) the PK or newly inserted Treatment row will be updated in Account
table. (Account table has FK for Treatment).
5) Here the result is After insert or update on Account a
corresponding insert happens in Treatment Table but the problem is
that ...Account Table's FK is not getting updated.

Here is my Trigger. Pls help. This is not a specific case and u can
tell me any simple example. For security reason I cant post Table
scripts.

Thanx a lot.
-Manish

If Exists ( SELECT name
FROM sysobjects
WHERE name = 'I_ACCOUNT_DEFAULT_METHD'
AND type = 'TR')
DROP TRIGGER I_ACCOUNT_DEFAULT_METHD
/
CREATE TRIGGER I_ACCOUNT_DEFAULT_METHD ON ACCOUNT AFTER INSERT,
UPDATE
AS
BEGIN
SET NOCOUNT ON

DECLARE
@column_acc_value$1 NUMERIC(15),
@column_new_value$1 FLOAT,
@column_treatment_schedule_id NUMERIC(15)

DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY
READ_ONLY FOR
SELECT ACCOUNT_ID, EXT_NUMBER_17, TREATMENT_SCHEDULE_ID FROM
inserted

OPEN ForEachInsertedRowTriggerCursor
FETCH NEXT FROM ForEachInsertedRowTriggerCursor INTO @column_acc_value
$1, @column_new_value$1, @column_treatment_schedule_id

WHILE @@fetch_status = 0

BEGIN

DECLARE @var_treatment_schedule_id NUMERIC(15)
DECLARE @var_primary_contact_method NVARCHAR(10)
DECLARE @old_primary_contact_method NVARCHAR(10)

IF @column_new_value$1 IS NOT NULL

BEGIN
IF @column_new_value$1 = 1
BEGIN
SELECT @var_primary_contact_method = 'Email'
END

IF @column_new_value$1 = 2
BEGIN
SELECT @var_primary_contact_method = 'Fax'
END

IF @column_new_value$1 = 3
BEGIN
SELECT @var_primary_contact_method = 'Phone'
END

IF @column_new_value$1 = 4
BEGIN
SELECT @var_primary_contact_method = 'PrintFile'
END

IF @column_treatment_schedule_id IS NULL

BEGIN

Exec IdGeneratorSeq @var_treatment_schedule_id OUTPUT

INSERT INTO TREATMENT_SCHEDULE
(TREATMENT_SCHEDULE_ID ,
SUPPRESS_ALL ,
SEND_AUTO_BILLING_STMT ,
PRIMARY_CONTACT_METHOD ,
UPDATE_DATE ,
UPDATE_SEQUENCE )
VALUES (@var_treatment_schedule_id ,
'N' ,
'N' ,
@var_primary_contact_method ,
GETDATE() ,
1
)

UPDATE ACCOUNT
SET TREATMENT_SCHEDULE_ID = @column_treatment_schedule_id,
UPDATE_SEQUENCE = UPDATE_SEQUENCE + 1,
UPDATE_DATE = GETDATE()
WHERE ACCOUNT_ID = @column_acc_value$1

END
ELSE
BEGIN

SELECT @old_primary_contact_method = PRIMARY_CONTACT_METHOD
FROM TREATMENT_SCHEDULE
WHERE TREATMENT_SCHEDULE_ID = @column_treatment_schedule_id

END

IF @old_primary_contact_method != @var_primary_contact_method

BEGIN
UPDATE TREATMENT_SCHEDULE
SET PRIMARY_CONTACT_METHOD = @var_primary_contact_method,
UPDATE_SEQUENCE = UPDATE_SEQUENCE + 1,
UPDATE_DATE = GETDATE()
WHERE TREATMENT_SCHEDULE_ID = @column_treatment_schedule_id

END
END
FETCH NEXT FROM ForEachInsertedRowTriggerCursor INTO
@column_acc_value$1, @column_new_value$1,
@column_treatment_schedule_id
END
CLOSE ForEachInsertedRowTriggerCursor
DEALLOCATE ForEachInsertedRowTriggerCursor

END
/
Re: Trigger problem: xyb
4/20/2007 5:33:27 PM
On 4=D4=C221=C8=D5, =C9=CF=CE=E77=CA=B107=B7=D6, "manish1.agar...@gmail.com"
[quoted text, click to view]

are the database recursive trigger been set on?
Re: Trigger problem: manish1.agarwal NO[at]SPAM gmail.com
4/20/2007 5:45:58 PM
I dont know what you are talking about. Please elaborate.
Where i can find out this setting "are the database recursive trigger
been set on? "\

Thanx for your kind help.
Re: Trigger problem: xyb
4/20/2007 6:07:52 PM
On 4=D4=C221=C8=D5, =C9=CF=CE=E78=CA=B145=B7=D6, "manish1.agar...@gmail.com"
[quoted text, click to view]
My test code here may help you.
USE sssb
IF DATABASEPROPERTYEX('sssb','IsRecursiveTriggersEnabled') =3D 0
BEGIN
alter database sssb
set RECURSIVE_TRIGGERS ON
END

create table ttt
(
c1 int,
c2 varchar(10)
)

insert into ttt
select 1,'aaa'

create trigger tri_nested
on ttt
after insert
as
insert into ttt
select * from inserted

go

select * from ttt

drop trigger tri_nested
drop table ttt
Re: Trigger problem: manish1.agarwal NO[at]SPAM gmail.com
4/21/2007 9:41:53 AM
[quoted text, click to view]

thanx a lot. I'll try this code. thanx once again :-)
Re: Trigger problem: Erland Sommarskog
4/21/2007 5:38:56 PM
manish1.agarwal@gmail.com (manish1.agarwal@gmail.com) writes:

[quoted text, click to view]

Well, what do you expect? :-) The only place where you update ACCOUNT
as far as I can see is this passage:

[quoted text, click to view]


You set TREATMENT_SCHEDULE_ID to @column_treatment_schedule_id,
but you only come here if this column is NULL. Maybe it's
@var_treatment_schedule_id you should use instead?

As for the suggestion of recursive triggers, stay away from that setting!
When you update the ACCOUNT table, the trigger will fire again with
that setting set, and when happens then I don't know about.

I don't really know what the IdGeneratorSeq procedure does, but it
would be a good thing to have a verision that can return a range of
numbers, so that you don't need to have a cursor in the trigger.

--
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx
Books Online for SQL Server 2000 at
AddThis Social Bookmark Button