在 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
我收到错误
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/