I am using SSIS 2008 and am trying to update one column in my table at the time of insertion. This one column is a uniqueidentifier field and I also wrote a trigger for updating this field. This code is below:
CREATE TABLE dbo.rd_information3_cleaned (
c1 uniqueidentifier NULL,
c2 nvarchar(50),
c3 nvarchar(50),
c4 nvarchar(50)
)
create trigger dbo.trg_client_information_id
on client_information
after insert
as
begin
update client_information
set client_information_id = newid()
from Inserted
end
I know this code works cause I tested it in SSMS and it does update this column. Also, my table looks like:
c1 c2 c3 c4
xxxx-xxxx-xxxx-xxxx A BB C5
xxxx-xxxx-xxxx-xxxx A2 BB C
xxxx-xxxx-xxxx-xxxx A3 BB C7
xxxx-xxxx-xxxx-xxxx A4 BB C
But when I try to run this SSIS package, I only write to c2 – c4, since the trigger should update column “c1”. But instead, I am getting an error:
Information: 0x40043007 at Write to Client_Information, SSIS.Pipeline: Pre-Execute phase is beginning.
Information: 0x4004300C at Write to Client_Information, SSIS.Pipeline: Execute phase is beginning.
Error: 0xC0202009 at Write to Client_Information, Client_Information [27]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80004005 Description: "The statement has been terminated.".
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80004005 Description: "Cannot insert duplicate key row in object 'dbo.Client_Information' with unique index 'IX_Client_Demographics_Unique'.".
Error: 0xC0209029 at Write to Client_Information, Client_Information [27]: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "input "OLE DB Destination Input" (40)" failed because error code 0xC020907B occurred, and the error row disposition on "input "OLE DB Destination Input" (40)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.
Error: 0xC0047022 at Write to Client_Information, SSIS.Pipeline: SSIS Error Code DTS_E_PROCESSINPUTFAILED. The ProcessInput method on component "Client_Information" (27) failed with error code 0xC0209029 while processing input "OLE DB Destination Input" (40). The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running. There may be error messages posted before this with more information about the failure.
Information: 0x40043008 at Write to Client_Information, SSIS.Pipeline: Post Execute phase is beginning.
Information: 0x402090DF at Write to Client_Information, Client_Information [27]: The final commit for the data insertion in "component "Client_Information" (27)" has started.
Information: 0x402090E0 at Write to Client_Information, Client_Information [27]: The final commit for the data insertion in "component "Client_Information" (27)" has ended.
Information: 0x4004300B at Write to Client_Information, SSIS.Pipeline: "component "Client_Information" (27)" wrote 2 rows.
Information: 0x40043009 at Write to Client_Information, SSIS.Pipeline: Cleanup phase is beginning.
Task failed: Write to Client_Information
SSIS package "Echo Information Migration2.dtsx" finished: Success.
The program '[2564] Echo Information Migration2.dtsx: DTS' has exited with code 0 (0x0).
I am almost sure the cause of this error is that client_information_id field. cause I am able to write more than one row in SSMS if I just make that field uniqueidentifier; otherwise I can’t write more than one row to this table. So I am wondering. Is it possible that I need to set a TIME property in SSIS to give the trigger enough time to work? Why else could I be getting this error?
Also, I edited the OLE DB Destination and I set Maximum insert commit size = 1, but I still got the same error.
Long story short, don’t use a trigger, just use a DEFAULT as shown in the documentation. The table DDL and trigger code you posted seem to have nothing to do with each other, but I assume you really want something like this:
I suspect that when you tested in SSMS you tested inserting one row at a time, but your SSIS package is inserting multiple rows. The NEWID() function is called only once in the trigger, so if you insert one row it will work but if you insert multiple rows then you get same NEWID() value for each one, causing your duplicate key violation.