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

标签 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

我收到错误

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

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


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

ALSO,这非常重要,因为您正在执行与文件系统相关的功能,因此您的程序集需要设置为 EXTERNAL_ACCESS。请不要通过将数据库设置为TRUSTWORTHY ON来实现此目的。请对程序集进行签名(使用密码保护它),然后在 master 中从该程序集创建一个非对称 key ,然后根据该非对称 key 创建一个登录名,然后授予该基于 key 的登录名外部访问组件。您将在我在上述“SQLCLR 的阶梯”系列中撰写的各种文章中看到这种方法。

关于SQL Server : error could not find type in assembly during dll trigger creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41431080/

相关文章:

mysql - 如何优化包含多个带有多个UNION的子查询的MySQL查询

mysql - 首先发生什么 : min() in selector or where in condition?

sql-server - 从 sql 字符串范围中获取数字

android - 如何在普通表和 fts3 表之间创建触发器?

MySQL - 单个查询中的两个相关加权平均值

SQL 日期时间天数差异

mysql - SQL 中的存储过程用于连接两个表

sql - min 和 max 不适用于位字段是否有任何原因

sql-server - 如何重构使用插入表和删除表的触发器,以将公共(public)代码移动到存储过程

sql - 我的 Oracle TRIGGER 出了什么问题?