【问题标题】:Execute C# method / function from trigger in SQL Server从 SQL Server 中的触发器执行 C# 方法/函数
【发布时间】:2015-04-24 15:23:04
【问题描述】:

我正在处理一个需要使用 SQL Server 中的触发器或存储过程执行 C# 方法/函数(在网页上编码)的项目。

我找到了这个Execute-NET-Code-under-SQL-Server

但正如此链接所述,我必须将数据库属性 TRUSTWORTHY 更改为 ON

有什么方法可以在不更改数据库属性的情况下做到这一点?

提前致谢

【问题讨论】:

  • 几乎肯定不会。
  • 您绝对不必更改此数据库属性。仅当您的程序集未签名并需要访问外部资源时才需要它
  • @PanagiotisKanavos 由于 OP 需要以某种方式调用外部网页(如果我正确理解了他的观点) - 他需要 TRUSTWORTHY ON 和具有 EXTERNAL_ACCESS 权限的组装。正如我在回答中所说,唯一的选择是运行外部程序。

标签: c# asp.net sql-server triggers


【解决方案1】:

好吧,如果您不想(或不能)使用 SQLCLR - 您可以创建一些包含您需要的所有 c# 代码的独立控制台应用程序,然后使用 xp_cmdshell 使用一些参数执行此应用程序。

但请注意:xp_cmdshell 默认禁用,您必须使用

启用它
EXEC sp_configure 'xp_cmdshell', 1

由于 xp_cmdshell 是服务器选项 - 您无需更改数据库属性,但您必须更改服务器选项以在禁用时启用它。选择你自己——改变什么。 ;)

【讨论】:

  • 从安全角度来看,这比更改数据库选项更糟糕 - xp_cmdshell 可以使用 SQL Server 的服务帐户轻松执行恶意脚本
【解决方案2】:

是否需要同步执行外部代码?换句话说,外部代码必须在触发器结束之前启动并运行到完成吗?

如果答案是肯定的,那么我建议更改您的设计。您错误地使用了触发器,并且使任何 DML 操作触发触发器的速度都非常慢。

假设答案是否定的,您可以选择将需要完成的任何工作排队并异步执行该工作。例如,当您的触发器需要运行此外部代码时,它可以在工作队列表中创建一条记录。其他一些进程(例如,计划任务、SQL 代理、应用程序中的某些内容、SQL Server 代理)可以监视此表中的新记录并根据需要触发适当的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2019-03-25
    • 2023-04-06
    相关资源
    最近更新 更多