LoginSignup
5
5

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5