Cry
about...
SQL Server Troubleshooting
Distribution Agent: Cannot insert
duplicate key row in object 'TTTT' with unique index
'IIII'
Symptom:
A distribution agent has failed, the full
error message text being::
Cannot insert duplicate key row
in object 'TTTT' with unique index 'IIII'
where 'TTTT' is the name of a table and
'IIII' the name of a unique index of that table.
Cause:
A new row has been added at the publisher, however a
row with the same key has also been added at the
subscriber. When the distribution agent runs and tries to
insert the new row at the subscriber it fails because a
row with the same unique key already exists.
Remedy
Before attempting to remedy the problem first identify
why the problem arose. Distribution agents are only used
for Merge and Transaction replication. These are suitable
only for propagating changes made at the publisher.
Tables which are replicated in this way should not have
changes made to them at the subscriber. Be aware that the
offending row may have been added at the subscriber any
time prior to the error first being noticed. The error
will only manifest itself when a row with the same unique
key is added to the publisher. This could be days, weeks
or even years before.
To resolve the problem:
Identify the row at the
subscriber with the same unique key.
This is actually quite easy. Within SQL Server
Enterprise Manager bring up the Distribution Agent
Error Details dialog. This will show the 'Last
command', which will be something like:
{CALL
sp_MSins_TTTT( ... values ...)}
where 'TTTT' is the name of the table and '...
values ...' is a comma separated list of values.
These are the values that it attempted to insert and
failed on. Comparing these values with the primary
keys or unique constraints applied to the table
should allow you to identify the offending row at the
subscriber.
Consider if the contents of the
row should be incorporated into the table at the
publisher. This is a business decision.
Delete the row at the subscriber
(and only that row).
- Restart the Publication Agent for that subscriber.
It should now run successfully
|