テストデータ作成のための良いツールはないでしょうか。

今のところ、Oracle SQL Developer や Visual Studio のサーバーエクスプローラー、OSqlGridなど
を使って、手作業でテストデータを作っています。
いずれも、グリッド編集的な機能によって、手作業でそれぞれのテーブルに対してデータを入力
しています。
(一度作ったデータは、再度クリーンな状態から再現するために、最終的に SQLのINSERT文に
して保存しています)

1テーブルあたりのテストデータ件数は10件から50件程度なのですが、
つらいなあ、と思うのは、例えば「テーブルA」の明細レコードとして「テーブルA-1」のような
テーブルがあり、テーブルA-1のさらなる明細レコードとして「テーブルA-2」がありまして、
そういった場合、上記のツールを使っている場合、それぞれに紐付くレコードを把握しつつ管理
するのが大変です。

テーブル構成を管理しているのは客先なのですが、カラムが増えたり移動(別のテーブルに移動)
したりして、末端の人間としては、既に作成したテストデータを変更するのが大変だ、という
悩みもあります。

テストデータ作成及び管理に良いツールはないでしょうか。
あるいは当該プロジェクトのための専用ツールを作った方が良いでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

テストデータ作成及び管理に良いツールなら、SuperDBToolとSuperDevToolをお勧めしますよ。

今は無料で公開しています。速めにダウンロードに行ってください。
http://www.google.co.jp/search?hl=ja&q=superdbto …

データの関係で一括でデータを作るツールです。
    • good
    • 1

テストデータ生成ツールについていくつか調べたり使ったりしたこともありますが、書いておられるようなことは特にツールを使って行わないとできないようなことではないような気がします。


よって、自力でツール化のほうがお勧めですね。

>いずれも、グリッド編集的な機能によって、手作業でそれぞれのテーブルに対してデータを入力しています。
>(一度作ったデータは、再度クリーンな状態から再現するために、最終的に SQLのINSERT文に
して保存しています)

ここが作業が大変になるところですね。
グリッド編集でテストデータを作成するのは、よほど少量でなければ止めておいたほうがいいでしょう。
お勧めのやり方ですが、テストデータの「種」保存用のテーブルを作り、少量の種レコードを保存し、そこからSQL文で種を増幅してテストデータ保存用テーブルにINSERTやUPDATEし、データ生成するような方法です。
SQLをうまく書けば、主キーを連番にしたり、金額などの数値をばらけさしたり、ヘッダ・明細関係を保つこともできます。
増幅する方法はコツさえつかめれば簡単です。


テーブルDDL変更は、プロジェクトメンバー全員で共有すべきなので、それは必ず知らせてもらうようにしましょう。できればその時の変更DDLも入手させてもらうようにして、テストデータ用テーブルにも適用すればよいのではないでしょうか。

とにかく、早めにグリッド編集作業からは脱却して、すべてをSQLで行うようにシフトすることですね。

この回答への補足

ご回答ありがとうございます&お返事が遅くなってしまい、申し訳ありません。


> グリッド編集でテストデータを作成するのは、よほど少量で
> なければ止めておいたほうがいいでしょう。
> お勧めのやり方ですが、テストデータの「種」保存用のテーブルを
> 作り、少量の種レコードを保存し、そこからSQL文で種を増幅して
> テストデータ保存用テーブルにINSERTやUPDATEし、データ生成する
> ような方法です。

説明不足で申し訳ありません。
実はuresiiwaさんのおっしゃる
「テストデータの「種」保存用のテーブルを作り」
の部分(たぶん)をしんどいと思っているのです。

単にバリエーションのあるデータを増幅したデータが欲しい場合、
ちょっとしたプログラムを組んで、それで例えば1000件のデータを
INSERT文として出力するようにしてます。
テキストを吐き出せる言語なら何でもいいので、適当な言語で吐き
出してます。
場合によっては、プログラムから直接Oracleにデータ出力するように
してます。

この場合は、主キーを連場にしたり、金額などの数値をランダムにしたり
といったことは、自由自在にできるので、まあ、どうでもいいんですが。


「種」となるようなデータを作るには、やはり手作業しかないと思うのですが
どうでしょうか。
その手作業をする場合には、グリッド編集的なツールで、それぞれのテーブルの
関連を見ながら作らざるを得ないのでは?とか思うのですが。

その場合に、既存のグリッド編集ツールがどうにも使いにくくて、何か良い
ツールはないだろうかと。


件数として、1テーブル10件から50件と言ってしまいましたが、若干の
バリエーションを入れたくてそう言ってしまいまして、すみませんでした。
実際は、1テーブル最低必要なのは5件程度とか、孫明細まで入れてトータルで
30件程度のデータがあれば、種としてはOKだろうと思います。

ただ、それを作るのがしんどいです。


> グリッド編集でテストデータを作成するのは、よほど少量でなければ
> 止めておいたほうがいいでしょう。

この場合は、「よほどの少量」に該当するのではないかと思っている
のですが、どうでしょう。

SQLで「増幅」させる以前の件数だと思うので、さすがに手作業で
作らざるを得ないのではないかと思うのです。



ちなみに、テーブル数はとりあえず3テーブルとかそんな程度で、そこから
参照しているマスタが多数あったりします。
3テーブルの各カラム数は、数十カラムぐらいあり、10程度のマスタを参照
するようになってまして、そこがまた面倒です。

グリッド編集的な機能で、既存の(というか、他社が作った)マスタを
参照しながらそれにあうデータを作っていくのが、ほんの数件であっても
大変だなあ、と思う次第です。
しかも一度作ってOKというわけではなく、他社のマスタデータがまたコロコロ
変わるので、そういった場合に、こちらのデータの整合性がきちんと取れているか
どうかとかを「パッと見」で確認しつつ、合わない部分をちょこちょこっと
修正したりできるといいなあとか思います。


> とにかく、早めにグリッド編集作業からは脱却して、すべてをSQLで行うように
> シフトすることですね。

全てをSQLで行うと、逆に効率が悪くなりそうな気がするのですが、
そんなにうまくいくものなんでしょうか。

補足日時:2009/05/18 23:16
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qデータベース内のテーブル名の取得

お世話になります。
初心者的な質問でしたらすいません。
SQL文にてデータベース内のテーブル名を
調べることができると聞いたことがあるのですが、
可能でしょうか。

もし、可能であれば、SQLの記述を教えてください。
お願いします。

Aベストアンサー

select * from tab;

私の場合、テーブル名だけ手っ取り早く知りたいとき、↑を打ちます。その他の情報も知りたいときは#2さんの仰るとおり、user_tablesで取得します。

Q単体テストのテストケースの考え方(あげかた)について

単体テストのテストケースの考え方(あげかた)について

最近、プログラム(java)をはじめたものです。
単体テストを行ううえで、
まず、テスト仕様書の作成を行う(正確にいえば詳細設計段階でやりますが…)と思いますが、
そのテストケースのあげかたはどういう着眼点であげればよいのでしょうか?

単体テストは、詳細設計に対してのテストだと思いますので、
基本的には、詳細設計で作成いたフローチャートの分岐をすべてのケース通るような仕様書を作成しています。

ただ、このやり方だと、問題があるような気がするのです。
たとえば、javaでMapを使用していて、
入力値が、値が固定のMap(例:1,2,3)に入っていればtrue、入っていなければfalseという処理があるとき、
フローチャートでは、trueかfalseかの2パターンしかなく、
実際のコードの記述もget(入力値)で、あるかないかだけ判断するため、2パターンです。
しかし、実際は、固定Mapの値1,2,3,とそれ以外という選択肢があるとおもうのですが、
こういう場合は、1、2、3、それ以外の4パターンのテストを行うべきでしょうか?
それとも、Mapにあるかないかだけの部分なので、trueの時とfalseの時の2パターンでいいのでしょうか?

単体テストのテストケースの考え方(あげかた)について

最近、プログラム(java)をはじめたものです。
単体テストを行ううえで、
まず、テスト仕様書の作成を行う(正確にいえば詳細設計段階でやりますが…)と思いますが、
そのテストケースのあげかたはどういう着眼点であげればよいのでしょうか?

単体テストは、詳細設計に対してのテストだと思いますので、
基本的には、詳細設計で作成いたフローチャートの分岐をすべてのケース通るような仕様書を作成しています。

ただ、このやり方だと、問題があるような気が...続きを読む

Aベストアンサー

単体テストは仕様書に従うべきものです。
Mapが出てきたのは結果論であって、例えば、switch文とか
if文を連ねるやり方も(定数なら尚更)あり得る話です。
フローチャートにしてもYes/Noだけではなく、多分岐的な
書式もあります。
仕様書では「1、2、3はtrue、他はfalse」と書かれているなら、
「1、2、3、それ以外」の全パターンを通過しないといけません。

QStatement ignored というエラー

Oracle 9iを使ってsqlファイルを実行させたところ、タイトルにあるように、
PL/SQL: SQL Statement ignored
というエラーメッセージが出力されました。
いろいろ検索してみると、これは、私にシステム権限がないことからおこるとあったのですが、
その設定変更の仕方がいまいちよくわかりませんでした。設定変更のしかたを教えていただけないでしょうか。
また、設定変更したことによって変わるのは私自身のシステム権限だけであって、他にコンピュータ(UNIX)を共有している人たちには影響はありませんよね?
立て続けに質問ばかりすみませんが、よろしくおねがいします。

Aベストアンサー

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を行いたいかによって、これだけで解決するかどうかわかりません。
また、他の人への影響ですが、ユーザをどのように使用しているか、どのようなポリシーのシステムかによって異なります。(「私自身」というのが、セッションのことかスキーマのことかわかりませんでした。)
同じユーザを他の人と共通で使っていれば、もちろん他の人へ影響が出ますし、一人1ユーザ(スキーマ)で割当てられていれば、影響なく使えます。
「影響が出る」という意味は、セキュリティレベルが権限付与された分落ちるということで、機能的に使用できなくなることはありません。

なお、セッション単位で権限を割当てる方法はないと思っています。
付与した権限をセッション終了次第revokeすれば、元に戻るのではないでしょうか。

PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。
前後のエラーも記載していただいた方が良いとは思いますが。

システム権限の付与方法は下記で行うことが可能です。
※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。
1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン
2.grant execute procedure to [対象ユーザ];
  または
  grant resource to [対象ユーザ];

以上で一応権限付与はできますが、どのような処理を...続きを読む

QSQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です

やりたいことは、
テーブルAから以下の条件に該当するデータを削除する。
基本的にはテーブルBの内容と比較して、一致したもの。

条件(全ての条件を満たすこと)
 テーブルA.AAA = テーブルB.AAA
 テーブルA.BBB = テーブルB.BBB
 テーブルB.CCC > 0


調べたところ、SQLサーバでは以下のように
from を2つ書いて実現できるようです。
が、今回はオラクルなので文法エラーになります。

delete FROM テーブルA FROM テーブルB
where
テーブルA.AAA = テーブルB.AAA
AND
テーブルA.BBB = テーブルB.BBB
AND
テーブルA.CCC > 0
;
commit;


よろしくお願いします

Aベストアンサー

delete 文の細かい構文はちょっと覚えてませんが
サブクエリ使えばいいんじゃないですか

delete from table_a
where 主キーカラム = (
select table_a.主キーカラム
from table_a, table_b
where
指定の条件
)

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング