【问题标题】:SQL Server: error could not find type in assembly during dll trigger creationSQL Server:在创建 dll 触发器期间错误无法在程序集中找到类型
【发布时间】:2017-05-16 19:28:36
【问题描述】:

在 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);
        }
    }
}

这是我的属性面板:

然后我在 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.WriteTimeInfile.Program”。

没有任何作用

你能帮帮我吗?

【问题讨论】:

  • 它不起作用,但谢谢你的链接
  • PERMISSION_SET = SAFE 写入文件也不起作用。
  • 你说得对,我刚刚意识到这个问题,就像我的代码因为没有 System.Security.Permissions.FileIOPermission 而无法工作
  • @MartinSmith 和 Vivien:正确,SAFE 在这里不起作用。请参阅我刚刚添加到我的答案中的两个注释(在该行下方)。

标签: sql sql-server triggers sqlclr


【解决方案1】:

您没有在 .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。您将在我在上面提到的“通往 SQLCLR 的阶梯”系列中撰写的各种文章中看到这种方法。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2011-12-11
    • 1970-01-01
    • 2011-03-22
    • 2018-03-15
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多