4

実行時にエラーを返す CLR (.net アセンブリ) から SQL プロシージャを取得しました。

Msg 6522, Level 16, State 1, Procedure sp_HelloWorld, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'sp_HelloWorld': 
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 HelloWorld.SQLCLR.HelloWorld()

これは私のSQLスクリプトです

go
drop procedure HelloWorld
drop assembly HelloWorld
GO

create assembly HelloWorld from 'F:\HelloWorld.dll'
with permission_set = safe
Go
create procedure sp_HelloWorld
as external name HelloWorld.[HelloWorld.SQLCLR].HelloWorld
go
exec sp_HelloWorld

これは私のクラスです(アセンブリ)

using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using System.Security.Permissions;
using System.Data;

namespace HelloWorld
{
    public class SQLCLR
    {
        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void HelloWorld()
        {
            string connectString1 = @"Data Source=localhost;Initial Catalog=ItemData;Integrated Security=True";

            SqlClientPermission permission = new SqlClientPermission(PermissionState.None);
            permission.Add(connectString1, "", KeyRestrictionBehavior.AllowOnly);
            permission.PermitOnly();
            SqlConnection sqlcon = new SqlConnection(connectString1);
            sqlcon.Open();
            SqlCommand sqlcmd = new SqlCommand("SELECT Top 1 * FROM ItemData.dbo.Item", sqlcon);
            SqlDataReader reader = sqlcmd.ExecuteReader();
            SqlContext.Pipe.Send(reader);
            sqlcon.Close();
        }
    }
}
4

3 に答える 3

0

これに私の2つの感覚を追加したかっただけです。私は非常に似たようなことをしていますが、同じエラーが発生しています。これが私が見つけたものですが、b / c DBへのこのレベルのアクセスがないため、テストできません。

最も簡単な (CLR proc を実行するためだけに MSDN が推奨するわけではありませんが) アクセス許可レベルを External_Access に設定することです...

SQL Server ホスト ポリシー レベルの権限セット SQL Server ホスト ポリシー レベルによってアセンブリに付与されるコード アクセス セキュリティ権限のセットは、アセンブリの作成時に指定された権限セットによって決定されます。SAFE、EXTERNAL_ACCESS、および UNSAFE の 3 つの権限セットがあります。

アクセス許可レベルは、CLR プロジェクトのプロパティ ページ、データベース タブで設定されます。アクセス許可レベルを外部に設定し、Aassembly Owner-dbo を設定して、tsql 'ALTER DATABASE DataBaseName SET TRUSTWORTHY ON' を実行します。-そして、SmtpClient は問題なく動作します...次に、正しく実行し、厳密な名前のキーファイルで Assenbly に署名します...

完全な投稿はこちら...

于 2012-06-19T19:33:53.830 に答える
-4

DBセットをTrusrtworthONに設定し、clrを有効にしましたか?

これを試して

sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON
GO

ここに、役立つ可能性のあるCLRストアドプロシージャの使用方法に関するガイドがあります。

于 2010-11-07T19:37:24.600 に答える