2017-01-02 12 views
2

В Microsoft SQL Server, я хочу, чтобы вызвать сборку библиотеки DLL в качестве триггераSQL Server: ошибка не может найти тип в сборке во время длл создания триггера

Это мой C# код:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace WriteTimeInfile 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      File.AppendAllText(@"C:\Users\Vivien\Desktop\date.txt", 
        DateTime.Now.ToString() + Environment.NewLine); 
     } 
    } 
} 

Это моя панель свойств:

enter image description here

Затем я создаю сборку в SQL Server, это похоже на работу и создать сборку:

CREATE ASSEMBLY triggertest 
FROM 'C:\Users\Vivien\Documents\visual studio 2015\Projects\WriteTimeInfile\WriteTimeInfile\bin\Release\WriteTimeInfile.dll' 
WITH PERMISSION_SET = SAFE 

Но когда я пытаюсь создать триггер, я стараюсь делать, как это объясняется в этом link:

CREATE TRIGGER tri_Publishes_clr 
ON STATION 
FOR INSERT 
AS EXTERNAL NAME triggertest.[WriteTimeInfile.WriteTimeInfile.Program].Main 

Я получаю ошибку

Не удалось найти тип ' WriteTimeInfile.WriteTimeInfile.Program 'в сборке' WriteTimeInfile '.

Ничто не работает

Не могли бы вы мне помочь, пожалуйста?

+0

Проверьте настройки вашего проекта http://www.codepal.co.uk/show/Could_not_find_type_in_assembly – Serg

+0

он не работает, но спасибо за ссылку –

+0

'PERMISSION_SET = SAFE' и запись в файл также не будет работать. –

ответ

3

Вы не создали триггер SQLCLR в своем коде .NET. Эта подпись:

public static void Main(string[] args) 

предназначен для консольного приложения. Вам нужно использовать соответствующее объявление для объекта SQLCLR, которое включает в себя использование атрибута SqlTrigger.

[SqlTrigger(Name = "trigger_name", Target = "[schema].[table]", 
      Event = "FOR INSERT, UPDATE, DELETE")] 
public static void TriggerName() 
{ 
} 

Для получения дополнительной информации о SQLCLR Триггеры, пожалуйста, смотрите на странице MSDN для CLR Triggers.

Дополнительную информацию о работе с SQLCLR в целом см. В серии, которую я пишу на SQL Server Central (бесплатная регистрация требуется для чтения содержимого на этом сайте): Stairway to SQLCLR.


ОБРАТИТЕ ВНИМАНИЕ: IF единственной причиной делать SQLCLR триггер использовать File.AppendAllText, то вы могли бы быть лучше создать SQLCLR UDF/скалярную функцию, чтобы сделать то же самое, а затем использовать эту функцию в регулярный триггер T-SQL.

ТАКЖЕ, и это очень важно, так как вы выполняете связанные с файловой системой функции, ваша сборка должна быть установлена ​​в EXTERNAL_ACCESS. Пожалуйста, сделайте не, выполнив это, установив базу данных на TRUSTWORTHY ON. Подпишите сборку (защитите ее паролем), затем создайте асимметричный ключ с этой сборки в master, затем создайте вход на основе этого асимметричного ключа, а затем предоставите этот ключевой вход EXTERNAL ACCESS ASSEMBLY. Вы увидите этот подход в различных статьях, которые я написал в вышеупомянутой серии «Stairway to SQLCLR».

+0

благодаритесь! я жду –