1

C# 4.0 で記述され、SQL Server 2014 に展開された SQL CLR トリガーがあります。SQL Server のテーブルで挿入が発生するたびに、この CLR トリガーの仕事は、その行を Oracle データベースにインポートすることです。したがって、基本的に、SQL Server 2014 のテーブルで挿入クエリが実行されるたびに、Oracle データベースにデータをインポートする必要があります。これは私の最初の CLR SQL トリガー プロジェクトであり、以下は私が行っていることです。

[SecurityCritical]
[OraclePermission(System.Security.Permissions.SecurityAction.Assert, Unrestricted = true)]
[SqlTrigger(Name = "FetchSurvey", Target = "temp", Event = "FOR INSERT")]
public static void FetchSurvey()
{

    SqlTriggerContext triggerContext = SqlContext.TriggerContext;
    // Create result set to store data
    DataSet resultSet = new DataSet();
    // Create a new SQL command
    using (SqlCommand command = new SqlCommand("SELECT * FROM INSERTED"))
    {
        // Create a new SQL connection
        using (command.Connection = new SqlConnection("context connection=true"))
        {
            // Connect to the database
            command.Connection.Open();
            // Execute procedure
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                adapter.Fill(resultSet);
            }
            // Disconnect from the database
            command.Connection.Close();
        }
    }
    SqlPipe sqlP = SqlContext.Pipe;
    // Return data
    if (resultSet.Tables.Count > 0)
        SaveSurvey(resultSet);
    sqlP.Send("Finaly its done!!");
}
public static void SaveSurvey(DataSet dsSurvey)
{
using (OracleConnection con = new OracleConnection("my oracle connection string"))
    {
        if (con.State == ConnectionState.Closed)
            con.Open();
        DataRowView drv = dsSurvey.Tables[0].DefaultView[0];
        using (OracleCommand cmd = new OracleCommand("AddMetaData", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("V_id", drv["TemplateID"]);
            cmd.Parameters.AddWithValue("V_Title", drv["TemplateName"]);
            cmd.Parameters.AddWithValue("V_CreatedBy", drv["CreatedBy"]);
            cmd.Parameters.AddWithValue("V_IsActive", drv["IsActive"]);
            cmd.ExecuteNonQuery();
        }
    }
}

そして、これはアセンブリ/デプロイトリガーを作成するための私のコードです:

CREATE ASSEMBLY   TriggerImportSurvey
FROM 'C:\ImportSurvey\SQL-CLR-Trigger.dll'
With Permission_Set = External_Access;

問題は、SQL Server で挿入クエリを実行してデータを挿入するたびに、SQL Server で以下のエラーが発生することです。

メッセージ 6522、レベル 16、状態 1、手順tri_InsertSurvey_clr、行 18
ユーザー定義ルーチンまたは集計 "tri_InsertSurvey_clr" の実行中に .NET Framework エラーが発生しました:

System.InvalidOperationException: Cannot perform CAS Asserts in Security Transparent methods
System.InvalidOperationException: 
  at Triggers.FetchSurvey()

tri_InsertSurvey_clr挿入ステートメントを実行するたびにアセンブリを実行するトリガーです。

このエラーが発生するように何が欠けているか教えてください。また、CLR SQL トリガーを実装するより洗練された方法がある場合は、それも提案してください。

注: SQL Server でトリガーを使用してデータを保存しようとしたときは成功しましたが、Oracle データベースに保存しようとすると、このエラーが発生します。また、Oracle データベースは別のマシンにインストールされています。

4

0 に答える 0