System.InvalidOperationException: Cannot perform CAS Asserts in Security Transparent methods

半城伤御伤魂 提交于 2019-12-13 02:35:11

问题


I have a SQL CLR trigger written in C# 4.0 and deployed on SQL Server 2014. Whenever an insertion happens in a table in SQL Server, this CLR trigger's job is to import that row in an Oracle database. So basically I have to import data in Oracle database whenever an insert query is fired on a table in SQL Server 2014. This is my first CLR SQL trigger project and below is what I am doing:

[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();
        }
    }
}

And this is my code to create assembly/deploy trigger:

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

Now the problem is whenever I run an insert query in SQL Server to insert data, I got below error in SQL Server:

Msg 6522, Level 16, State 1, Procedure tri_InsertSurvey_clr, Line 18
A .NET Framework error occurred during execution of user-defined routine or aggregate "tri_InsertSurvey_clr":

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

tri_InsertSurvey_clr is the trigger which is responsible for executing the assembly whenever I run an insert statement.

Please tell me what I am missing so that I am getting this error, Also if there a more elegant way of implementing a CLR SQL trigger then please also suggest that.

NOTE: When I tried to save the data using a trigger in SQL Server I was successful, but now when I am trying to save it in Oracle database, I am getting this error. Also the Oracle database is installed on another machine.

来源:https://stackoverflow.com/questions/25009477/system-invalidoperationexception-cannot-perform-cas-asserts-in-security-transpa

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!