1

「トランザクション」テーブルのスナップショットを作成し、データ行の挿入、更新、または削除の日付に関する情報とともに「監査」テーブルに保存できるデータベース トリガーを作成しようとしています。

申し訳ありませんが、私はこの種のことについて非常に初心者です!

現状では、私のトリガーは次のとおりです。

create trigger AuditTransactions
on dbo.Transactions
after insert, update, delete
as

    if exists(select * from inserted)
    begin
        if exists(select * from deleted)
        begin
            -- this is for an update
            update Audit
            set DeleteDate = getdate()
            where TransactionId in (select TransactionId from deleted)
        end 

        -- this is just for an insert
        insert into Audit
        select *, getdate() as CreateDate
        from inserted
    end
    else
    begin
        -- this is just for a delete
        update Audit
        set DeleteDate = getdate()
        where TransactionId in (select TransactionId from deleted)
    end

go

そして、私の監査テーブルは次のように表示されます。

CREATE TABLE [dbo].[Audit](
    [TransactionId] [int] NOT NULL,
    [InvoiceNumber] [nvarchar](1) NULL,
    [InvoiceType] [nvarchar](1) NULL,
    [InvoiceIssueDate] [datetime] NULL,
    [InvoiceTotalexclVat] [nvarchar](1) NULL,
    [InvoiceTotalVat] [numeric](18, 0) NULL,
    [InvoiceDiscount] [numeric](18, 0) NULL,
    [InvoiceTotalPayable] [numeric](18, 0) NULL,
    [AccountCode] [nvarchar](1) NULL,
    [Reference1] [nvarchar](1) NULL,
    [Reference2] [nvarchar](1) NULL,
    [Reference3] [nvarchar](1) NULL,
    [Level1CustomOrg] [nvarchar](1) NULL,
    [Level2CustomOrg] [nvarchar](1) NULL,
    [Level3CustomOrg] [nvarchar](1) NULL,
    [Level4CustomOrg] [nvarchar](1) NULL,
    [ScanLocation] [nvarchar](1) NULL,
    [ScanDateTime] [datetime] NULL,
    [CaptureInkjetId] [nvarchar](1) NULL,
    [CaptureBatchId] [nvarchar](1) NULL,
    [CaptureDateTime] [datetime] NULL,
    [InputSource] [nvarchar](1) NULL,
    [CurrencyCode] [nvarchar](1) NULL,
    [DebitCredit] [nvarchar](1) NULL,
    [OrderNumberHeader] [nvarchar](1) NULL,
    [SupplierName] [nvarchar](1) NULL,
    [BancPaySupplierId] [nvarchar](1) NULL,
    [SupplierIDERP] [nvarchar](1) NULL,
    [PaymentDate] [datetime] NULL,
    [DeliveryDate] [datetime] NULL,
    [CustomRef1] [nvarchar](1) NULL,
    [CustomRef2] [nvarchar](1) NULL,
    [CustomRef3] [nvarchar](1) NULL,
    [CustomRef4] [nvarchar](1) NULL,
    [CustomRef5] [nvarchar](1) NULL,
    [CustomRef6] [nvarchar](1) NULL,
    [CustomRef7] [nvarchar](1) NULL,
    [CustomRef8] [nvarchar](1) NULL,
    [CustomRef9] [nvarchar](1) NULL,
    [CustomRef10] [nvarchar](1) NULL,
    [CustomRef11] [nvarchar](1) NULL,
    [CustomRef12] [nvarchar](1) NULL,
    [CustomRef13] [nvarchar](1) NULL,
    [CustomRef14] [nvarchar](1) NULL,
    [CustomRef15] [nvarchar](1) NULL,
    [CustomAmount1] [numeric](18, 0) NULL,
    [CustomAmount2] [numeric](18, 0) NULL,
    [CustomAmount3] [numeric](18, 0) NULL,
    [CustomAmount4] [numeric](18, 0) NULL,
    [CustomAmount5] [numeric](18, 0) NULL,
    [CustomDate1] [datetime] NULL,
    [CustomDate2] [datetime] NULL,
    [Country1] [nvarchar](1) NULL,
    [Country2] [nvarchar](1) NULL,
    [Country3] [nvarchar](1) NULL,
    [Country4] [nvarchar](1) NULL,
    [Country5] [nvarchar](1) NULL,
    [Country6] [nvarchar](1) NULL,
    [Country7] [nvarchar](1) NULL,
    [Country8] [nvarchar](1) NULL,
    [Country9] [nvarchar](1) NULL,
    [Country10] [nvarchar](1) NULL,
    [CheckedOut] [bit] NULL,
    [CheckedOutDate] [datetime] NULL,
    [BlobUrl] [nvarchar](1) NULL,
    [GLCode] [nvarchar](1) NULL,
    [RejectReason] [nvarchar](1) NULL,
    [RejectComment] [nvarchar](1) NULL,
    [ReferMessage] [nvarchar](1) NULL,
    [PaymentTerms] [nvarchar](1) NULL,
    [CheckedOutByUserId] [int] NULL,
    [LastUpdatedByUserId] [int] NULL,
    [TransactionFormatTypeId] [int] NULL,
    [RequestOriginalStatusTypeId] [int] NULL,
    [GLCodeComment] [nvarchar](1) NULL,
    [SenderOrganizationId] [int] NULL,
    [ReceiverOrganizationId] [int] NULL,
    [TransactionStatusTypeId] [int] NULL,
    [TransactionTypeId] [int] NULL,
    [OrganizationId] [int] NULL,
    [OrganizationId1] [int] NULL,
    [CreateDate] [datetime] NOT NULL,
    [DeleteDate] [datetime] NULL
) ON [PRIMARY]

GO

トリガーのクエリを実行しようとすると、次のエラー メッセージが表示されます。

Msg 213, Level 16, State 1, Procedure AuditTransactions, Line 17
Column name or number of supplied values does not match table definition.

これは「監査に挿入」コマンドのようですが、ここから何をすればよいかわかりません!

どんな助けでも大歓迎です、事前に感謝します!

4

2 に答える 2

2

INSERTかなり不十分に文書化されているようです。VALUES()要素については、次のように述べています。

値リストの値が表の列と同じ順序でない場合、または表の各列に値がない場合は、 を使用column_listして、各受信値を格納する列を明示的に指定する必要があります。

(強調を追加)

ただし、値/行のソースが何であれ、同じ制約が適用されることは私の理解と信念です。テーブル内のすべての列が正確に一致しない限り、column_list.

さて、あなたのインスタンスでは、テーブルのすべての列に値を提供するだけで簡単になるかもしれません:

insert into Audit
select *, getdate() as CreateDate,null as DeleteDate
from inserted

さて、私の他の観察は、条件付き制御フローをいじることはすべてかなり無意味だということinsertです.0行は効果がなく、空のテーブルに対するupdate使用inも同様に効果がありません. だから私はちょうど持っているだろう:

create trigger AuditTransactions
on dbo.Transactions
after insert, update, delete
as

    update Audit
    set DeleteDate = getdate()
    where TransactionId in (select TransactionId from deleted)

    insert into Audit
    select *, getdate() as CreateDate,null as DeleteDate
    from inserted
于 2012-07-09T09:35:18.130 に答える
0
 insert into Audit
        select *, getdate() as CreateDate, null
        from inserted

「監査」テーブルには、挿入する列 (削除された日付) よりも多くの列があります。すべての列に名前を付けるか、null を挿入する必要があります。

スタイル的には、列に名前を付ける方が優れています。これにより、何がどこにあるのかが明確になり、新しい列を追加する際のバグを回避できます。

于 2012-07-09T09:35:36.050 に答える