在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'中找不到Type'WriteTimeInfile.WriteTimeInfile.Program'。
没有任何作用
你能帮我吗?
答案 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中写的各种文章中看到这种方法。系列。