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

SQL Server: error could not find type in assembly during dll trigger creation

在微软SQL服务器中,我想调用一个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);
        }
    }
}

这是我的属性面板:

然后我在 SQL 服务器中创建程序集,它似乎工作并创建了一个程序集:

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

我收到一个错误

Could not find Type 'WriteTimeInfile.WriteTimeInfile.Program' in assembly 'WriteTimeInfile'.

没有效果

你能帮帮我吗?

您没有在 .NET 代码中创建 SQLCLR 触发器。本次签名:

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 触发器的详细信息,请参阅 CLR Triggers 的 MSDN 页面。

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


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

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