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

时间:2014-07-29 06:37:44

标签: c# sql-server sqlclr code-access-security clrstoredprocedure

我有一个用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中遇到以下错误:

  

Msg 6522,Level 16,State 1,Procedure tri_InsertSurvey_clr,Line 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数据库也安装在另一台机器上。

0 个答案:

没有答案