2017-01-12 9 views
1

Я хочу добавить триггер в свою базу данных. Я использую DBIx::Class и следую этим примерам: 1, 2.
Мой код:Как создать триггер в БД с помощью «DBIx :: Class» с помощью метода add_trigger?

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 

Here целевая линия:

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 имеет только одну таблицу в данный момент. Я ожидаю, что он, по крайней мере, должны производить:

TABLES: users dbix_class_deploymenthandler_versions 

Как создать триггер в DB?

ответ

0

Там может быть проблема с DBIx::Class::ResultSource::default_sqlt_deploy_hook:

which was originally designed to expect the Result class name and the $sqlt_table instance of the table being deployed

Поскольку работа вокруг добавить следующую строку кода перед add_trigger:

return unless grep $_ eq 'users', $schema->get_tables; 

Но рекомендовать способ заключается в создании развернуть/обновить/понизить .sql файлы вручную