У меня есть триггер 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 для вставки данных, я получаю следующую ошибку в SQL Server:
Сообщение 6522, уровень 16, состояние 1, процедура
tri_InsertSurvey_clr
, строка 18
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или агрегата "tri_InsertSurvey_clr":System.InvalidOperationException: Cannot perform CAS Asserts in Security Transparent methods System.InvalidOperationException: at Triggers.FetchSurvey()
tri_InsertSurvey_clr
— это триггер, который отвечает за выполнение сборки всякий раз, когда я запускаю оператор вставки.
Пожалуйста, скажите мне, что мне не хватает, поэтому я получаю эту ошибку. Также, если есть более элегантный способ реализации триггера CLR SQL, пожалуйста, также предложите это.
ПРИМЕЧАНИЕ. Когда я пытался сохранить данные с помощью триггера в SQL Server, мне это удалось, но теперь, когда я пытаюсь сохранить их в базе данных Oracle, я получаю эту ошибку. Также база данных Oracle установлена на другом компьютере.
inserted
содержит ровно одну строку. Это не безопасное предположение. Он может содержать 0, 1 или несколько строк. - person Damien_The_Unbeliever   schedule 29.07.2014[OraclePermission]
? - person cynic   schedule 29.07.2014[OraclePermission]
из кода, я получу ошибкуRequest for the permission of type 'System.Data.OracleClient.OraclePermission
- person Jitender Kumar   schedule 29.07.2014