Oracleのビューをバージョン管理

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

プログラムのコードはみんなバージョン管理してると思いますけど、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;
      }
    }
  }
}