0

NHibernateを使用して、コードからDBテーブル、シーケンス、トリガーを生成する小さなプログラムを作成しようとしています。

メソッドを使用SchemaExport.Create()すると、すべてのテーブルと関連するシーケンスを作成できましたが、トリガーを作成できませんでした。そのためsession.CreateSQLQuery()、DBにトリガーを追加するコマンドを実行するために使用しようとしました。

私のコードは次のようになります。

string createTriggerQuery= @"create or replace trigger table_insert_trigger before insert on Table for each row begin select TableSequence.nextval into :new.ID from dual; end;";
var query = session.CreateSQLQuery(createTriggerQuery);
query.ExecuteUpdate();

クエリはで実行すると機能しますOracle SQL Developerが、コードを実行すると次の例外が発生します。

Could not execute native bulk manipulation query:create or replace trigger... [SQL: SQL not available]

また、HBMクエリを使用してクエリを作成しようとしました。XMLファイルを埋め込みリソースとしてプロジェクトに追加し、その上に次のコードを追加します。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<database-object>
    <create>
        create or replace
        trigger table_insert_trigger before insert on table
        for each row
        when (new.ID is NULL)
        begin
        select tableSequence.nextval into :new.ID from dual;
        end;
    </create>

メンバーで、FluentConfigurationhbmマッピングを追加するように構成しました。

_fluentConfiguration.Mappings(m => m.HbmMappings.AddFromAssemblyOf<DbContextFactory>());

しかし、それも機能していませんでした。

コードからDBにトリガーを追加する方法を知っている人はいますか?

4

1 に答える 1

1

この特定のインスタンスの問題は、データベースに対して実行しようとしているクエリ、特にこの部分です。

... into :new.ID from dual;

コロン(:)は、NHibernateによってパラメーターのインジケーターとして解釈され、?(実際にはパラメーターを渡していないため)置換されます。つまり、実際には次のようなSQLを渡しています。

into ? from dual

その時点で、Oracleは文句を言います。

現在、ここ:に記載されているように、NHibernateがをエスケープして文字通りデータベースに渡す方法はありません。

同様の制約の下で、解決策はORMNHibernate以外を使用することでした。これが必要な目的である場合、おそらくNHibernateは最良のオプションではありません。

于 2013-01-16T21:33:16.330 に答える