SQL Server 2005 CLR 调用Web Service需要注意的几个问题【轉】
用Visual Studio 2005创建SQL Server项目,然后编写调用Web Service的过程是很简单的,在项目里添加引用Web Service,然后编写处理代码.在部署前有几个问题需要注意:
1.目标数据库实例需要启用CLR集成.
如果没启用,可以在 SQL Server 外围应用配置器 里去启用
或者使用以下语句:
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
3.确保部署程序集时所使用的账号是目标数据库的所有者,如不是可以使用以下语句:
针对程序集 'XXX' 的 CREATE ASSEMBLY 失败,因为程序集 'XXX' 未获授权(PERMISSION_SET = UNSAFE)。 当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 UNSAFE ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态;或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有 UNSAFE ASSEMBLY 权限。
当然部署账号需要有创建程序集的权限.
4.程序集的权限级别必须设为 EXTERNAL ACCESS,否则在部署的时候会报错:
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
5.在项目里增加名为Predeployscript.sql和Postdeployscript.sql的文件,Predeployscript.sql文件里包含以下语句:
System.InvalidOperationException: Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information. ---> System.IO.FileLoadException: LoadFrom()、LoadFile()、Load(byte[]) 和 LoadModule() 已被主机禁用。
1.目标数据库实例需要启用CLR集成.
如果没启用,可以在 SQL Server 外围应用配置器 里去启用
或者使用以下语句:
sp_configure 'clr enabled', 1
go
reconfigure
go
2.目标数据库的可信任属性需要设为FALSE,可以使用以下语句启用:go
reconfigure
go
alter database dbName set trustworthy on
否则在调用对应的方式时会报错:System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
3.确保部署程序集时所使用的账号是目标数据库的所有者,如不是可以使用以下语句:
exec sp_changedbowner 'login_name'
否则部署时会报错:针对程序集 'XXX' 的 CREATE ASSEMBLY 失败,因为程序集 'XXX' 未获授权(PERMISSION_SET = UNSAFE)。 当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 UNSAFE ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态;或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有 UNSAFE ASSEMBLY 权限。
当然部署账号需要有创建程序集的权限.
4.程序集的权限级别必须设为 EXTERNAL ACCESS,否则在部署的时候会报错:
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
5.在项目里增加名为Predeployscript.sql和Postdeployscript.sql的文件,Predeployscript.sql文件里包含以下语句:
IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'XXX.XmlSerializers') DROP ASSEMBLY [XXX.XmlSerializers]
Postdeployscript.sql文件包含以下语句: CREATE ASSEMBLY [XXX.XmlSerializers] from 'E:\XXX.XmlSerializers.dll' WITH permission_set = SAFE
项目编译成功后,在预生成命令行中加入以下语句: "d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force "$(TargetPath)"
然后重新编译发布,否则在调用对应的方式时会报错:System.InvalidOperationException: Cannot load dynamically generated serialization assembly. In some hosting environments assembly load functionality is restricted, consider using pre-generated serializer. Please see inner exception for more information. ---> System.IO.FileLoadException: LoadFrom()、LoadFile()、Load(byte[]) 和 LoadModule() 已被主机禁用。