我的类库代码:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;namespace SQLLib
{
public class SQLLib
{
[SqlFunction(DataAccess = DataAccessKind.None )]
public static int Encode()
{
//SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=salers;User ID=sa;Password=sa");
int i=0;
using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Test;User ID=sa;Password=sa"))
{
SqlCommand cmd = new SqlCommand("select count(*) as c from t_user", conn);
conn.Open(); SqlDataReader dr= cmd.ExecuteReader();
dr.Read();
i = Convert.ToInt32(dr["c"]);
}
return i;
} [SqlFunction(DataAccess = DataAccessKind.None)]
public static string aa(string str)
{
return str;
}
}
}
我的SQL创建create assembly [SQLLib]
FROM 'H:\SQLLib\SQLLib.dll' CREATE FUNCTION Encode()
RETURNS int
AS
External name [SQLLib].[SQLLib.SQLLib].Encode 当我运行
select dbo.Encode() 报出一下错误:
消息 6522,级别 16,状态 2,第 1 行
在执行用户定义例程或聚合 "Encode" 期间出现 .NET Framework 错误:
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SQLLib.SQLLib.Encode()
。
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;namespace SQLLib
{
public class SQLLib
{
[SqlFunction(DataAccess = DataAccessKind.None )]
public static int Encode()
{
//SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=salers;User ID=sa;Password=sa");
int i=0;
using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Test;User ID=sa;Password=sa"))
{
SqlCommand cmd = new SqlCommand("select count(*) as c from t_user", conn);
conn.Open(); SqlDataReader dr= cmd.ExecuteReader();
dr.Read();
i = Convert.ToInt32(dr["c"]);
}
return i;
} [SqlFunction(DataAccess = DataAccessKind.None)]
public static string aa(string str)
{
return str;
}
}
}
我的SQL创建create assembly [SQLLib]
FROM 'H:\SQLLib\SQLLib.dll' CREATE FUNCTION Encode()
RETURNS int
AS
External name [SQLLib].[SQLLib.SQLLib].Encode 当我运行
select dbo.Encode() 报出一下错误:
消息 6522,级别 16,状态 2,第 1 行
在执行用户定义例程或聚合 "Encode" 期间出现 .NET Framework 错误:
System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SQLLib.SQLLib.Encode()
。
alter database databasename set trustworthy on
go
--修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
ALTER ASSEMBLY SqlClassLibrary
WITH PERMISSION_SET=EXTERNAL_ACCESS;
GO
试试
我执行了下面的代码
alter database test set trustworthy on
go
--修改程序集为PERMISSION_SET=EXTERNAL_ACCESS
ALTER ASSEMBLY [SQLLib]
WITH PERMISSION_SET=EXTERNAL_ACCESS;
GO在运行
select dbo.Encode()
抱一下错误
:
消息 6522,级别 16,状态 2,第 2 行
在执行用户定义例程或聚合 "Encode" 期间出现 .NET Framework 错误:
System.InvalidOperationException: 在此上下文中不允许访问数据。此上下文可能是不带 DataAccessKind.Read 或 SystemDataAccessKind.Read 标记的函数或方法,也可能是从表值函数的 FillRow 方法为获取数据而进行的回调,还可能是 UDT 验证方法。
System.InvalidOperationException:
at System.Data.SqlServer.Internal.ClrLevelContext.CheckSqlAccessReturnCode(SqlAccessApiReturnCode eRc)
at System.Data.SqlServer.Internal.ClrLevelContext.GetCurrentContext(SmiEventSink sink, Boolean throwIfNotASqlClrThread, Boolean fAllowImpersonation)
at System.Data.SqlServer.Internal.ClrLevelContext.GetCurrentContext(Boolean throwIfNotASqlClrThread, Boolean fAllowImpersonation)
at System.Data.SqlServer.Internal.SqlUtil.GetCurrentTransaction()
at System.Transactions.Transaction.FastGetTransaction(TransactionScope currentScope, ContextData contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.GetCurrentTransactionAndScope(Transaction& current, TransactionScope& currentScope, ContextData& contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.get_Current()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at SQLLib.SQLLib.Encode()
。
GO
RECONFIGURE
GO
--将UDT导入程序集
CREATE ASSEMBLY ComplexNumbersCS
FROM 'H:\SQLLib\SQLLib.dll'
WITH PERMISSION_SET=SAFECREATE FUNCTION Encode()
RETURNS int
AS
External name [SQLLib].[SQLLib]
SqlServerProject1 -> F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.dll
------ 已启动部署: 项目: SqlServerProject1, 配置: Debug Any CPU ------
生成启动时间为 2010-12-22 15:48:17。
SqlClrDeploy:
开始将程序集 SqlServerProject1.dll 部署到服务器 .: Test
如果部署的 SQL CLR 项目是为与 SQL Server 目标实例不兼容的 .NET Framework 版本生成的,则可能出现以下错误:“部署错误 SQL01268: 针对程序集的 CREATE ASSEMBLY 失败,因为验证程序集失败”。若要解决此问题,请打开项目的属性,然后更改 .NET Framework 版本。
部署脚本已生成到:
F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.sql
正在创建 [SqlServerProject1]...
F:\test\SqlServerProject1\SqlServerProject1\bin\Debug\SqlServerProject1.sql(39-39): Deploy error SQL01268: .Net SqlClient Data Provider: 消息 6218,级别 16,状态 3,行 1 针对程序集 'SqlServerProject1' 的 CREATE ASSEMBLY 失败,原因是程序集 'SqlServerProject1' 未通过身份验证。请检查被引用程序集是否是最新的,而且是可信的(external_access 或 unsafe),能在该数据库中执行。如果有 CLR Verifier 错误消息,将显示在此消息之后
执行批处理时发生错误。生成失败。已用时间 00:00:01.82
========== 生成: 成功或最新 1 个,失败 0 个,跳过 0 个 ==========
========== 部署: 成功 0 个,失败 1 个,跳过 0 个 ==========
[SqlFunction(DataAccess = DataAccessKind.None )]
public static int Encode()
{
改成
[SqlFunction(DataAccess = DataAccessKind.Read )]
public static int Encode()
{应该就ok啦.
create assembly [SQLLib]
AUTHORIZATION dbo
FROM 'D:\LUKE\CSDN\20101223\SQLLib\SQLLib\bin\Debug\SQLLib.dll'
WITH PERMISSION_SET = UNSAFE
go
"WITH PERMISSION_SET = UNSAFE" 必须的.