我想编写一个监视数据库表的服务(可能在c#中).当记录插入表中时,我希望服务获取新插入的数据,并使用它执行一些复杂的业务逻辑(对于TSQL来说太复杂).
一种选择是让服务定期检查表以查看是否已插入新记录.这样做的问题是我希望服务一旦发生就知道插件,我不想杀死数据库性能.
做一点研究,似乎写一个CLR触发器可以完成这项工作.我可以在c#中编写触发器,当插入发生时触发,然后将新插入的数据发送到Windows或WCF服务.
您认为,SQL CLR触发器的良好(甚至可能)使用是什么?
关于如何实现这一目标的任何其他想法?
SQL Server 2005支持CLR,这意味着我们可以在后端使用CLR,所以如何做到这一点,我在c#中有一些函数,它使用日期时变量做一些复杂的操作,现在我想在SP中使用这些函数.首先,有可能做到这一点.
根据这个帖子,F#Core必须经SQLCLR批准才能标记组件SAFE.这是计划好的吗?甚至可以做到吗?
我在将SQLCLR程序集添加到数据库时遇到了问题,但是我的同事没有问题.虽然我们确实有不同级别的访问权限,但我们无法弄清楚为什么我收到了错误消息.
这是我的代码:
USE [mydatabase]
GO
CREATE ASSEMBLY [My.Assembly]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\MyStuff\My.Assembly.dll'
WITH PERMISSION_SET = UNSAFE
GO
Run Code Online (Sandbox Code Playgroud)
这是我的错误:
Msg 300,Level 14,State 1,Line 3
UNSAFE ASSEMBLY权限被拒绝对象'服务器',数据库'master'.
思考?
我一直在使用早期版本的Visual Studio(VS2008)和SQL Server 2008.
最近我的组织搬到了VS2013和SQL Server 2012.我发现VS2013中的数据库接口与VS2008中的数据库接口有很大的不同.
我的问题基本上是,如果有人知道一篇文章或引用,详细说明如何做这里描述的内容:
http://yassershaikh.com/how-to-create-a-clr-stored-procedure-using-c-and-visual-studio/
(特别是将DLL部署到SQL Server 2012数据库).
但是使用VS2013和SQL Server 2012.
我使用SQL Server CLR集成来创建一个ASSEMBLY.
加载命令:
CREATE ASSEMBLY TcpClr FROM 'G:\TcpClrTest.dll' WITH PERMISSION_SET = UNSAFE
没有App.Config
DLL代码包含:
string ip=ConfigurationManager.AppSettings["connection"].ToString();
App.config还包含:
<appSettings>
<add key="connection" value="127.0.0.1"/>
</appSettings>
但是当我执行PROCEDURE时,SQL Server显示错误 System.NullReferenceException
SQL Server CLR集成是否支持App.config文件?
c# sql-server configurationmanager sqlclr configuration-files
如果我在SSMS中运行此命令:
set showplan_xml on
GO
exec some_procedure 'arg1', 'arg2','arg3'
GO
set showplan_xml off
GO
Run Code Online (Sandbox Code Playgroud)
我获得了查询执行中涉及的完整调用堆栈的XML输出,以及任何建议的索引等.
怎么可能从C#中读到这个?
(一个用例可能是定期启用此功能并在生产环境中记录这些结果,以便密切关注索引建议.)
我有sql server 2008r2.根据我的互联网研究,它支持.net framework 4.0.我试图用sql clr函数安装我的程序集并收到错误.
程序集"MyAssembly"的CREATE ASSEMBLY失败,因为程序集是为不支持的公共语言运行时版本构建的.
询问
select * from sys.dm_clr_properties
Run Code Online (Sandbox Code Playgroud)
给出结果:
目录C:\ Windows\Microsoft.NET\Framework64\v2.0.50727\
版本v2.0.50727
CLR已初始化
我检查C:\ Windows\Microsoft.NET\Framework64 \以确定并找到v4.0.30319文件夹所在的位置.所以,安装了.net v4.0.
所以,我需要更改用于sql的CLR版本.我试过了
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)
它没有帮助.我尝试添加带有内容的sqlservr.exe.config
<configuration>
<startup>
<requiredRuntime version="v4.0"/>
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
到C:\ Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn文件夹并重新启动sql server.它没有帮助.
我知道创建注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\OnlyUseLatestCLR并将其设置为1的选项.它可以打破其他解决方案,所以我很害怕在生产中使用它.
有什么建议如何说服sql server使用clr v4.0?
我有一个返回表的SQL Server 2012存储过程.我必须修改该SP以向返回的表添加其他值.不幸的是,这种附加值来自对Web服务的调用.从我的研究中,我收集主要的方法是在SQL中使用OLE自动化程序(sp_OA ...),或者使用SQLCLR存储过程.给定sp_OA ...过程运行的安全上下文,单个返回值是VARCHAR(10)注册密钥,并且对服务的调用很少(每小时10到20个),我猜测SQLCLR方法是要走的路.此外,Web服务托管在我们的Intranet上,外部世界无法访问.
有没有更好的方法来完成我需要的东西?更好的意思是更高性能,更好的安全性,更容易编码和维护
看来我正在用'我最喜欢的数据类型'SqlDecimal遇到更多困境.我想知道这是否应该被认为是一个错误.
当我在SQL中乘以两个小数字时,我得到了预期的结果.当我通过SQLCLR函数运行相同的数字时,结果非常令人惊讶.
c#代码:
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace TestMultiplySQLDecimal
{
public static class Multiplier
{
[SqlFunction(DataAccess=DataAccessKind.None, IsDeterministic = true,IsPrecise = true)]
public static SqlDecimal Multiply(SqlDecimal a, SqlDecimal b)
{
if (a.IsNull || b.IsNull) return SqlDecimal.Null;
return a*b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
SQL代码:
USE tempdb
GO
IF DB_ID('test') IS NOT NULL DROP DATABASE test
GO
CREATE DATABASE test
GO
USE test
GO
CREATE ASSEMBLY TestMultiplySQLDecimal
FROM 'C:\Users\tralalalaa\Documents\visual studio 2015\Projects\TestMultiplySQLDecimal\TestMultiplySQLDecimal\bin\Release\TestMultiplySQLDecimal.dll'
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION dbo.fn_multiply(@a decimal(38,8), @b decimal(18,8)) …Run Code Online (Sandbox Code Playgroud) sqlclr ×10
sql-server ×9
c# ×4
sql ×2
t-sql ×2
.net ×1
f# ×1
permissions ×1
triggers ×1
web-services ×1