プログラムのコードはみんなバージョン管理してると思いますけど、DBに入ってるビューはバージョン管理してますか?
ビューの中でコメント入れてコメントアウトして管理してたり、DumpやExportだけって方が実際は多いのでは?
うちはビューの中身をテキストに書きだして、Gitで管理してます。
定期的に出力して自動でコミットさせても、変更かけた時に手動で取り出してコメント付けてコミットしてもどっちでもいいけど、テストしにくいビューはすぐに戻せるようにしておくと精神的に楽です。
ホストとユーザー名,パスワード、それと取り出したいスキーマを指定してやると、更新があった時だけファイルを書き換える仕様です。
use strict;
use warnings;
use DBI;
use FindBin;
use Data::Dumper;
use Digest::MD5;
my $host = 'XXX.XXX.XXX.XXX';
my $user = 'XXXXX';
my $pass = 'XXXXX';
my @schemas = qw/schema list XXXX/;
my $dbh = DBI->connect(
"dbi:Oracle:host=$host;sid=$sid",
$user, $pass, {
LongReadLen => 1024 * 1024 * 10})
or die "Unable to connect: $DBI::errstr";
foreach my $schema (@schemas) {
my $sql =<<EOF;
-- SQL --
SELECT VIEW_NAME
,TEXT
FROM SYS.ALL_VIEWS
WHERE OWNER = '$schema'
EOF
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my $result = $sth->fetchrow_hashref) {
if ($result) {
my $view_name = $result->{VIEW_NAME};
my $filename = $schema . "." . $view_name . ".sql";
my $file_exist = 0;
my $file_md5 = Digest::MD5->new;
if (-e $filename) {
open FILE, $filename;
$file_md5->addfile(*FILE);
close FILE;
$file_exist = 1
}
my $text = "CREATE OR REPLACE VIEW $schema.$view_name AS\n";
$text .= $result->{TEXT};
my $text_md5 = Digest::MD5->new;
$text_md5->add($text);
if ($file_exist = 0 || $file_md5->digest ne $text_md5->digest) {
open OUT, "> $filename" or die "Can't open file $filename";
print OUT $text;
close OUT;
}
}
}
}