1

機能チェック用のストアド プロシージャ テスト ケースを作成しようとしています。更新操作で行われた挿入および/または削除操作があることを確認する必要があります。更新のためにBINARY_CHECKSUM(*)を試しましたが、結果セットを介した更新操作テーブルが挿入または削除されたかどうかをどのように知ることができますか。

MS SQL Server 2005 を使用しています

ありがとうございます。

4

2 に答える 2

1

見積もり:

私が従うのは、tempにデータを挿入することです。テーブルと実際のテーブルのいずれかで操作を実行し、... プロシージャの機能をチェックします。

最終的な問題が、2 つのテーブル内で実際のデータと期待されるデータを比較することであると説明できる場合は、次のアプローチを試すことができます -except句を使用した比較:

create table [tb_source] (id int primary key identity(1,1), value varchar(50));
create table [tb_dest] (id int primary key, value varchar(50));


insert into [tb_source] (value) values ('a');
insert into [tb_source] (value) values ('b');
insert into [tb_source] (value) values ('c');

-- tables are equal
insert into [tb_dest] select * from [tb_source];

-- one row inserted
insert [tb_dest] (id, value) values (4, 'd');

-- one row deleted
delete from [tb_dest] where id = 1;

-- one row updated
update [tb_dest] set value = 'b_' where id = 2;

 -- answering the question "how many number of rows with update operation through result"
with [raw] as (
    (select *, 'deleted' [operation] from [tb_source]
    except 
    select *, 'deleted' from [tb_dest])
    union all
    (select *, 'inserted' from [tb_dest]
    except 
    select *, 'inserted' from [tb_source])),

[updates] as (
    select id
    from [raw]
    group by id
    having count(*) > 1),

[results] as (
    select * from [raw] where id not in (select id from [updates])
    union all
    select id, value, 'updated' from [raw] where id in (select id from [updates]))

select [operation], count(distinct id)
from [results]
group by [operation]
order by count(*) desc

結果:

operation   count
---------------------------------
updated         1
deleted         1
inserted        1
于 2013-08-20T15:33:42.570 に答える
0

すぐに次の場合:

  • 削除のみ - 削除
  • 挿入のみ - 挿入
  • 挿入と削除 - 更新

オプションとして、トリガーを使用して操作のタイプを調べることができます。

ALTER TRIGGER [dbo].[MyTrigger]
   ON  [dbo].[MyTable]
   AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    declare
        @i int = (select count(*) from (select top (1) * from inserted) as i),
        @d int = (select count(*) from (select top (1) * from deleted) as d),
        @type varchar(20);

    if @i = 1 and @d = 1 set @type = 'update'
        else if @i = 1 and @d = 0 set @type = 'insert'
            else if @i = 0 and @d = 1 set @type = 'delete'
                else set @type = 'empty'; 


    if @type = 'insert'
    begin
        -- YOUR CODE HERE
    end

    if @type = 'delete'
    begin
        -- YOUR CODE HERE
    end

    if @type = 'update'
    begin
        -- YOUR CODE HERE
    end

    if @type = 'empty'
    begin
        -- YOUR CODE HERE
    end


END
于 2013-08-20T11:26:45.523 に答える