System.InvalidOperationException:无法执行CAS的安全透明的方法断言

2019-10-20 14:12发布

我有一个SQL CLR触发写在C#4.0和部署的SQL Server 2014每当插入发生在表中的SQL Server上,这个CLR触发的任务是导入行中的Oracle数据库。 所以基本上我要在Oracle数据库中导入数据时,只要插入查询在SQL Server上的发射台2014年是我第一次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中运行一个INSERT查询中插入数据,我得到了下面的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是负责执行大会每当我运行一个INSERT语句触发。

请告诉我,我错过了什么让我得到这个错误,另外,如果有实施CLR SQL触发器的更优雅的方式,那么请也表明。

注意:当我试图使用SQL Server中的触发器我成功保存数据,但现在当我试图把它保存在Oracle数据库中,我得到这个错误。 另外,Oracle数据库安装在另一台机器上。

文章来源: System.InvalidOperationException: Cannot perform CAS Asserts in Security Transparent methods