1

列が自動的にいっぱいになるかどうかを判断する必要があります。

ほとんどの場合、これは PrimaryKey 列で行われます。これは、Oracle データベースと SQLServer で行う必要があります。

私の質問の背景は(理解を深めるためだけに)、仕様にあるXMLファイルを読んでいます。要素タグはテーブルの列名と一致します。テーブルはユーザーによって提供され、解析する必要があるxmlファイルを選択します。その後、テーブル内の列の名前と一致する場合、xml ファイル内のすべての要素を探しています。

xml ファイルが主キー情報を提供するかどうかは明確ではありません。そうかもしれませんが、そうではないかもしれません。列の名前がxml内にある場合、すべて問題ありません。しかし、そうでない場合は、調べる必要があります

  • 私は xml ファイルで指定された PK 列を持っています。
  • その PK 列に値が自動的に入力される場合

これが指定されていない場合は、例外を発生させる必要があります。そのため、そのスキーマ情報を特定する必要があります。

SQLServer では問題ありません。ID 列の場合、IsAutoIncrement は true になります。

このようなテーブルスキーマデータを読み取ります(短い例のみ)

System.Data.Common.DbDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo);
dtTable = reader.GetSchemaTable();

今、私は欲しい情報をすべて手に入れています。残念ながら、Oracle では IsAutoIncrement プロパティが false に設定されています。

SQLServerのように、DBMSによって列に指定されていない場合、GetSchemaTable()は列がシーケンスによって設定されているかどうかをどのように判断する必要があるかを知っています。それは私には明らかです。

これを解決する方法はありますか?テーブル内の列がトリガー内のシーケンスによって埋められるかどうかを判断していますか? 多分トリガー本体を解析していますか?

助けてくれてありがとう

私のソリューションは次のようになります。

            if (IsOracleClient)
            {
                // reading Trigger Information
                string sql = "select\n" +
                             "      a.trigger_body\n" +
                             "  from\n" +
                             "      all_triggers a,\n" +
                             "      all_trigger_cols b\n" +
                             "  where\n" +
                             "      a.table_name   = '{0}'\n" +
                             "  and b.table_name   = a.table_name\n" +
                             "  and b.column_name  = '{1}'\n" +
                             "  and a.trigger_name = b.trigger_name";

                command.CommandText = String.Format(sql, this.Tabelle.ToUpper(), this.PrimaryKeyColumn.ColumnName.ToUpper());
                using (System.Data.Common.DbDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        reader.Read();
                        string body = reader.GetString(0);
                        if (body.Contains("NEXTVAL"))
                            this.PrimaryKeyColumn.IsAutoIncrement = true;
                    }
                    reader.Close();
                }
            }
4

1 に答える 1

2

簡単な回答:列がシーケンスによって更新されているかどうかは、スキーマ情報からはわかりません。

使用している Oracle のバージョンには、ID 列の概念がない可能性があります。この機能は通常、テーブルのシーケンスとトリガーを介して複製されます。

Oracle DB では、シーケンスは特定の列に関連付けられていません。任意のシーケンスを使用して、必要な数値列に挿入する値を取得できます。そのシーケンスは、多くの場所で使用できます...トリガー、プロシージャ、関数、個別のアプリケーション コードなど。

トリガーの本体を解析することはオプションだと思います。ただし、トリガーを介して列が更新されることのみを気にする場合、これは実行可能です。

これはおそらく悪いアドバイスですが、データベースの命名規則に確信がある場合はテーブル名や列名がシーケンス名で参照されているなど、いくつかの仮定を立てることができます。繰り返しになりますが、Oracleには厄介な30文字の名前制限があり、これらの仮定を簡単に打ち砕くことができます。

于 2013-09-17T07:17:40.423 に答える