データベースにトリガーを追加したい。私が使う DBIx::Class
そして、これらの例に従ってください: 1, 2.
私のコードは:
package App::Schema;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_namespaces();
sub sqlt_deploy_hook {
my ($self, $schema) = @_;
$schema->add_trigger( name => "foo" );
}
1;
しかし、私はこのエラーが発生します:
Failed to translate to YAML: translate: Error with producer "SQL::Translator::Producer::YAML": Can"t call method "name" on an undefined value at /home/kes/work/projects/x/app/local/lib/perl5/SQL/Translator/Schema/Trigger.pm line 198
必要なすべての環境変数でコマンドを実行するとき dbic-migration
:
dbic-migration --force --schema_class App::Schema --database PostgreSQL -Ilib prepare
どこかに私を向ける SQL::Translator::Schema::Trigger
私は何を取りこぼしたか?このエラーを修正するには?
UPD
すべての引数を追加してもエラーが発生しました:
Failed to translate to YAML: translate: Error with parser "SQL::Translator::Parser::DBIx::Class": Table named users doesn"t exist at /home/kes/work/projects/x/app/local/lib/perl5/SQL/Translator/Schema/Trigger.pm line 54
ここに ターゲット行:
my $table = $args->{schema}->get_table($arg)
or die "Table named $arg doesn"t exist";
修正されたコード
sub sqlt_deploy_hook {
my ($self, $schema) = @_;
warn "TABLES: " ,$schema->get_tables ,"n";
$schema->add_trigger(()
,name => "foo"
,perform_action_when => "after"
,database_events => "insert"
,on_table => "users"
,action => "text"
,scope => "row"
);
}
このコードは次の警告を生成します:
TABLES: users
TABLES: dbix_class_deploymenthandler_versions
ただし、DBには現在1つのテーブルしかありません。私は少なくともそれが生成することを期待しています:
TABLES: users dbix_class_deploymenthandler_versions
トリガーを作成する方法 DB
?
回答:
回答№1は0おそらく問題がある DBIx :: Class :: ResultSource :: default_sqlt_deploy_hook:
当初は、Resultクラス名と$ sqlt_tableインスタンスを期待するように設計されていました デプロイされるテーブル
回避策として、前に次のコード行を追加します add_trigger
:
return unless grep $_ eq "users", $schema->get_tables;
ただし、推奨される方法はdeploy / upgrade / downgradeを作成することです .sql
ファイルを手動で