SQL Server:在创建dll触发器期间,错误无法在程序集中找到类型

时间:2017-01-02 17:41:07

标签: sql sql-server triggers sqlclr

在Microsoft SQL Server中,我想将dll程序集称为触发器

这是我的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'中找不到Type'WriteTimeInfile.WriteTimeInfile.Program'。

没有任何作用

你能帮我吗?

1 个答案:

答案 0 :(得分:3)

You did not create a SQLCLR Trigger in your .NET code. This signature:

public static void Main(string[] args)

is for a Console App. You need to use the proper declaration for a SQLCLR object, which include using the SqlTrigger attribute.

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

For more info on SQLCLR Triggers, please see the MSDN page for CLR Triggers

有关使用SQLCLR的更多信息,请参阅我在SQL Server Central上编写的系列文章(阅读该网站上的内容需要免费注册):Stairway to SQLCLR

请注意: IF 执行SQLCLR触发器的唯一原因是使用File.AppendAllText,那么您可能最好创建一个SQLCLR UDF /标量函数来执行相同的操作,然后在常规T-SQL触发器中使用该函数。

ALSO ,这非常重要,因为您正在执行与文件系统相关的功能,因此需要将程序集设置为EXTERNAL_ACCESS。请通过将数据库设置为TRUSTWORTHY ON not 来完成此操作。请在程序集上签名(用密码保护),然后在master中从该程序集创建一个非对称密钥,然后根据该非对称密钥创建一个登录,然后授予该基于密钥的登录EXTERNAL ACCESS ASSEMBLY 。您将在我在上面提到的#S; SLCLCLR" Stairway中写的各种文章中看到这种方法。系列。