During testing of an application, i noticed a difference between
SQL 2000 and SQL 7, both with identical config.
In a nutshell:
A table has a trigger for UPDATE and DELETE.
When a column in the table is UPDATED the following happens:
In autocommit mode, when entering a trigger the trancount equals
1 for both SQL 7 and 2000.
When the same update is performed in an explicit transaction
in SQL 7 @@TRANCOUNT equal 2, and in SQL 2000 @@TRANCOUNT equals 1.
Configuration is the same and there are no implicit transactions.
I don't need a work around as this will invalidate the migration
process as both products should behave identically.
What would influence the difference or why is there a difference???
Is there something which has been overlooked?
=============== =============== =============== ============
The following code replicates the problem
Ensure implicit transactions are off in both versions at the server
level, thus defaulting to autocommitted mode.
Ensure sp_configure settings are identical.
Step 1: Create a DB called test:
Step 2: Execute the following under the context of test DB.
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[trigtest]') and OBJECTPROPERTY( id, Outrigger') = 1)
drop trigger [dbo].[trigtest]
GO
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[test]') and OBJECTPROPERTY( id, N'IsUserTable') = 1)
drop table [dbo].[test]
GO
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[trancount]') and OBJECTPROPERTY( id, N'IsUserTable')
= 1)
drop table [dbo].[trancount]
GO
CREATE TABLE [dbo].[test] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[text] [char] (10) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[trancount] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[trancount] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TRIGGER trigtest ON [dbo].[test]
FOR UPDATE, DELETE
AS
declare @trancount int
select @trancount = @@TRANCOUNT
insert into trancount ( trancount ) values ( @trancount )
Step 3: Run the following against the DB, then check trancount table.
-- Add a record to the test table (trigger will not fire)
insert into test (text) values ( 'xxxx' );
go
-- Update the value (autocommit mode) to fire trigger
-- Under SQL 7 and 2000, trancount table will only indicate 1
tranaction open.
-- This is being performed in autocommit mode.
update test set text = 'test1'
go
-- Update value using an explicit transaction
-- Under SQL 7, trancount will equal 2 in trigger, in SQL 2000
trancount equals 1
begin transaction
update test set text = 'test2'
commit work
go 5 3519
Neil Rutherford (ne************ *@yahoo.com) writes: During testing of an application, i noticed a difference between SQL 2000 and SQL 7, both with identical config.
In a nutshell: A table has a trigger for UPDATE and DELETE. When a column in the table is UPDATED the following happens:
In autocommit mode, when entering a trigger the trancount equals 1 for both SQL 7 and 2000.
When the same update is performed in an explicit transaction in SQL 7 @@TRANCOUNT equal 2, and in SQL 2000 @@TRANCOUNT equals 1.
Configuration is the same and there are no implicit transactions.
I don't need a work around as this will invalidate the migration process as both products should behave identically. What would influence the difference or why is there a difference??? Is there something which has been overlooked?
Apparently there was - consciously or by chance - a change in SQL2000.
I cannot say why, and indeed 2 would be a more expected result in
this situation.
But I would be interesting to know why this would be an issue? It sounds
to me like your triggers must be doing something quite interesting.
--
Erland Sommarskog, SQL Server MVP, es****@sommarsk og.se
Books Online for SQL Server SP3 at http://www.microsoft.com/sql/techinf...2000/books.asp
BOL says:
"Microsoft SQL Server 2000 increments the transaction count within a
statement only when the transaction count is 0 at the start of the
statement. In SQL Server version 7.0, the transaction count is always
incremented, regardless of the transaction count at the start of the
statement. This can cause the value returned by @@TRANCOUNT in triggers to
be lower in SQL Server 2000 than it is in SQL Server version 7.0.
In SQL Server 2000, if a COMMIT TRANSACTION or COMMIT WORK statement is
executed in a trigger, and there is no corresponding explicit or implicit
BEGIN TRANSACTION statement at the start of the trigger, users may see
different behavior than on SQL Server version 7.0. Placing COMMIT
TRANSACTION or COMMIT WORK statements in a trigger is not recommended."
HTH
Igor ne************* @yahoo.com (Neil Rutherford) wrote in message news:<d6******* *************** ****@posting.go ogle.com>... During testing of an application, i noticed a difference between SQL 2000 and SQL 7, both with identical config.
In a nutshell: A table has a trigger for UPDATE and DELETE. When a column in the table is UPDATED the following happens:
In autocommit mode, when entering a trigger the trancount equals 1 for both SQL 7 and 2000.
When the same update is performed in an explicit transaction in SQL 7 @@TRANCOUNT equal 2, and in SQL 2000 @@TRANCOUNT equals 1.
Configuration is the same and there are no implicit transactions.
I don't need a work around as this will invalidate the migration process as both products should behave identically. What would influence the difference or why is there a difference??? Is there something which has been overlooked?
=============== =============== =============== ============
The following code replicates the problem
Ensure implicit transactions are off in both versions at the server level, thus defaulting to autocommitted mode. Ensure sp_configure settings are identical.
Step 1: Create a DB called test:
Step 2: Execute the following under the context of test DB.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trigtest]') and OBJECTPROPERTY( id, Outrigger') = 1)
drop trigger [dbo].[trigtest] GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY( id, N'IsUserTable') = 1)
drop table [dbo].[test] GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trancount]') and OBJECTPROPERTY( id, N'IsUserTable') = 1)
drop table [dbo].[trancount] GO
CREATE TABLE [dbo].[test] ( [id] [int] IDENTITY (1, 1) NOT NULL , [text] [char] (10) NULL ) ON [PRIMARY] GO
CREATE TABLE [dbo].[trancount] ( [id] [int] IDENTITY (1, 1) NOT NULL , [trancount] [int] NOT NULL ) ON [PRIMARY] GO
CREATE TRIGGER trigtest ON [dbo].[test] FOR UPDATE, DELETE AS declare @trancount int
select @trancount = @@TRANCOUNT
insert into trancount ( trancount ) values ( @trancount )
Step 3: Run the following against the DB, then check trancount table.
-- Add a record to the test table (trigger will not fire) insert into test (text) values ( 'xxxx' ); go
-- Update the value (autocommit mode) to fire trigger -- Under SQL 7 and 2000, trancount table will only indicate 1 tranaction open. -- This is being performed in autocommit mode. update test set text = 'test1' go
-- Update value using an explicit transaction -- Under SQL 7, trancount will equal 2 in trigger, in SQL 2000 trancount equals 1 begin transaction update test set text = 'test2' commit work go
Igor Raytsin (ig*****@yahoo. com) writes: BOL says: "Microsoft SQL Server 2000 increments the transaction count within a statement only when the transaction count is 0 at the start of the statement. In SQL Server version 7.0, the transaction count is always incremented, regardless of the transaction count at the start of the statement. This can cause the value returned by @@TRANCOUNT in triggers to be lower in SQL Server 2000 than it is in SQL Server version 7.0.
In SQL Server 2000, if a COMMIT TRANSACTION or COMMIT WORK statement is executed in a trigger, and there is no corresponding explicit or implicit BEGIN TRANSACTION statement at the start of the trigger, users may see different behavior than on SQL Server version 7.0. Placing COMMIT TRANSACTION or COMMIT WORK statements in a trigger is not recommended."
It's even documented! I didn't know that. Thanks, Igor!
--
Erland Sommarskog, SQL Server MVP, es****@sommarsk og.se
Books Online for SQL Server SP3 at http://www.microsoft.com/sql/techinf...2000/books.asp
Thanks for your help guys.
Someone put logic in a trigger to only continue
if the @@TRANCOUNT came from an explicit transaction in
SQL Server 7 and the @@TRANCOUNT > 1
Like mentioned, in SQL 7 this works, but in SQL 2000..
it breached the integrity of a whole data warehouse system
test.
I have to convince the developers and management that
there is a change between versions. The developers
are convinced there is difference between the server
config and they believe that both versions should
work identically.
Unless I'm going blind.. where in books on-line is
the passage above?
*** Sent via Developersdex http://www.developersdex.com ***
Don't just participate in USENET...get rewarded for it!
Neil Rutherford (ne************ *@yahoo.com) writes: Someone put logic in a trigger to only continue if the @@TRANCOUNT came from an explicit transaction in SQL Server 7 and the @@TRANCOUNT > 1
Dubious usage. I have not checked, but recursive trigger calls
may have slipped.
True, I have stored procedures which barf if you call them without
a transaction in progress, but that is because they perform only
half the job.
I have to convince the developers and management that there is a change between versions. The developers are convinced there is difference between the server config and they believe that both versions should work identically.
Obviously there is a difference between versions. This is nothing you
configure.
Unless I'm going blind.. where in books on-line is the passage above?
I searched for the string "the transaction count is always incremented"
and found two hits.
--
Erland Sommarskog, SQL Server MVP, es****@sommarsk og.se
Books Online for SQL Server SP3 at http://www.microsoft.com/sql/techinf...2000/books.asp This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: GJones |
last post by:
Is there away to capture a session variable value from IIS
and use it in a SQL 2000 trigger with out passing it as a
part of a string query. I just want to capture it somehow
systemically.
Thanks,
Greg
|
by: level8 |
last post by:
Hi, Everybody,
I'm a Hungarian SQL user and I need a little help for SQL Server 7 !
I protect my table against bad data with a trigger. I use ROLLBACK and
RAISERROR statement in this trigger. Users can get my error message
after manual input, but the stored procedure always cancel because of
ROLLBACK. So the input program dont't have...
|
by: Fernand St-Georges |
last post by:
Hi,
can someone tell how to write a Trigger; I am familiar with Sybase Sql
Anywhere trigger syntax.
Actually I have three tables MEMBER, CONTRACT and PAYMENT
I need to update the MEMBER.BALANCE once the PAYMENT.AMOUNT is INSERTED
where PAYEMENT.CONTRAC_ID = CONTRACT.CONTRAC_ID
and CONTRAT.MEMBER_ID = MEMBRE.MEMBER_ID
I have more...
|
by: Scott CM |
last post by:
I have a multi-part question regarding trigger performance. First of
all, is there performance gain from issuing the following within a
trigger:
SELECT PrimaryKeyColumn FROM INSERTED
opposed to:
SELECT * FROM INSERTED
|
by: hitendra15 |
last post by:
Can it be possible to create trigger/procedure
in following case
2 server server A and server B
A has db1
db1 has tblA
B has db2
db2 has tblB
can it be possible to create trigger on server A.db1.tblA as
| |
by: Stuart McGraw |
last post by:
Is Microsoft full of #*$#*% (again) or am I badly misunderstanding
something?
Quote from Microsoft's T-SQL doc:
> INSTEAD OF triggers are executed instead of the triggering action.
> These triggers are executed after the inserted and deleted tables
> reflecting the changes to the base table are created, but before any
> other actions are...
|
by: rdraider |
last post by:
I created and successfully tested a trigger on a test database. Now that I
want to put this on a production system, the create trigger statement takes
way too long to complete. I cancelled after a few minutes. The test
trigger took just a second to create. The test and production databases are
identical in design. Only difference is that...
|
by: Ots |
last post by:
I'm using SQL 2000, which is integrated with a VB.NET 2003 app.
I have an Audit trigger that logs changes to tables. I want to apply
this trigger to many different tables. It's the same trigger, with the
exception of the table name. I could manually change the table name in
the trigger and create it, over and over, but I'd like to automate...
|
by: majastic |
last post by:
Hello all,
I have a database question for you. I have a table in SQL 2000 that I think I need a trigger for. I'm tring to get the trigger to take the last two numbers from one field and replace the number in another field on the same table, see my example that follows:
Before Trigger
Table: Job
J_User1: 0122567801
J_JobType: 20
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it. ...
| |
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert...
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...
| |