Как запустить автоматическое обновление при вставке данных? - PullRequest
0 голосов
/ 24 января 2012

Я использую SSIS 2008 и пытаюсь обновить один столбец в моей таблице во время вставки.Этот один столбец является полем уникального идентификатора, и я также написал триггер для обновления этого поля.Этот код ниже:

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

Я знаю, что этот код работает, потому что я протестировал его в SSMS и обновил этот столбец.Кроме того, моя таблица выглядит следующим образом:

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

Но когда я пытаюсь запустить этот пакет служб SSIS, я пишу только в c2 - c4, поскольку триггер должен обновить столбец "c1".Но вместо этого я получаю сообщение об ошибке:

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).

Я почти уверен, что причиной этой ошибки является поле client_information_id.потому что я могу написать более одной строки в SSMS, если я просто сделаю это поле uniqueidentifier;иначе я не могу написать более одной строки в эту таблицу.Вот мне и интересно.Возможно ли, что мне нужно установить свойство TIME в SSIS, чтобы у триггера было достаточно времени для работы?Почему еще я мог получить эту ошибку?

Кроме того, я отредактировал Назначение OLE DB и установил Максимальный размер фиксации вставки = 1, но я все еще получил ту же ошибку.

1 Ответ

1 голос
/ 25 января 2012

Короче говоря, не используйте триггер, просто используйте DEFAULT, как показано в документации . Кажется, что опубликованные вами таблица DDL и код триггера не имеют ничего общего друг с другом, но я предполагаю, что вы действительно хотите что-то вроде этого:

create table dbo.Clients (
   ClientID uniqueidentifier not null primary key default newid(),
   ClientAttributeA nvarchar(50) not null,
   -- etc.
)

Я подозреваю, что когда вы тестировали в SSMS, вы тестировали вставку по одной строке за раз, но ваш пакет служб SSIS вставляет несколько строк. Функция NEWID () вызывается только один раз в триггере, поэтому, если вы вставите одну строку, она будет работать, но если вы вставите несколько строк, вы получите одинаковое значение NEWID () для каждой, что приведет к нарушению вашего дублированного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...