仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 792|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之SQLServer存储历程会见数据库权限非常问...

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?server|sqlserver|存储历程|会见|办理|数据|数据库|成绩比来用ASP.net2.0+SQLServer做一个网页表单的提交,利用C#编写存储历程来完成向SQLServer数据库表中拔出纪录的操纵。在挪用这个存储历程时,呈现了关于存储权限的一个非常。上面胪陈非常发生的历程息争决计划。
1.操纵步骤:
1)利用ASP.net2.0,用C#写了一个存储历程,对数据库test中的一个表举行操纵,代码以下:

publicclassStoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
publicstaticvoidSubmit(stringstrAnswer)
{
using(SqlConnectionconnection=newSqlConnection("DataSource=WS;InitialCatalog=test;IntegratedSecurity=False;Trusted_Connection=yes;"))
{
connection.Open();//***实行到这一步呈现非常,详见下文所述***
StringcmdTxt="INSERTINTOdbo.Response_SCL90VALUES("+strAnswer+")";
SqlCommandcommand=newSqlCommand(cmdTxt,connection);
SqlDataReaderreader=command.ExecuteReader();

}
}
}

2)编译天生了Submit_Answer.dll,接着,在SQLServer中注册这个dll,并创立存储历程,SQL剧本以下:
CREATEASSEMBLYSubmit_Answer
FROMD:studyC#测评体系WebSite1StoredProcedureSubmit_AnswerinDebugSubmit_Answer.dll;
GO

CREATEPROCEDUREdbo.Submit_Answer
(
@strAnswernvarchar(256)
)
WITHEXECUTEASOWNER
AS
EXTERNALNAMESubmit_Answer.StoredProcedures.Submit
GO

3)最初,在.net中挪用这个存储历程,代码以下:
SqlConnectionconnection=newSqlConnection("DataSource=WS;InitialCatalog=test;IntegratedSecurity=False;Trusted_Connection=yes;");

StringcmdTxt="dbo.Submit_Answer";
SqlCommandcommand=newSqlCommand(cmdTxt,connection);
command.CommandType=CommandType.StoredProcedure;

command.Parameters.Add("@strAnswer",SqlDbType.NVarChar);
command.Parameters["@strAnswer"].Value=strAnswer;

command.Connection.Open();
SqlDataReaderdr=command.ExecuteReader();

command.Connection.Close();
2.非常形貌:
在实行到存储历程connection.Open();一句时,呈现非常,非常形貌和事先的仓库信息以下:
非常具体信息:System.Data.SqlClient.SqlException:A.NETFrameworkerroroccurredduringexecutionofuserdefinedroutineoraggregateSubmit_Answer:
System.Security.SecurityException:RequestforthepermissionoftypeSystem.Data.SqlClient.SqlClientPermission,System.Data,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089failed.
System.Security.SecurityException:
atSystem.Security.CodeAccessSecurityEngine.Check(Objectdemand,StackCrawlMark&stackMark,BooleanisPermSet)
atSystem.Security.PermissionSet.Demand()
atSystem.Data.Common.DbConnectionOptions.DemandPermission()
atSystem.Data.SqlClient.SqlConnection.PermissionDemand()
atSystem.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnectionouterConnection)
atSystem.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnectionouterConnection,DbConnectionFactoryconnectionFactory)
atSystem.Data.SqlClient.SqlConnection.Open()
atStoredProcedures.Submit(SqlCharsstrAnswer)

3.扼要剖析:
看来是在存储过程当中没有对数据库的会见权限,由于在数据库毗连Open时就堕落了,查找了一些材料,也没发明成绩在哪。厥后便在社区中发问了。

4.办理计划:
在“MS-SQLServer疑问成绩”版面,zlp321002(龙卷风2006)对这个成绩举行解答,概况请见:
http://community.csdn.net/Expert/TopicView3.asp?id=4790457
现收拾和总结以下:
(十分感激zlp321002(龙卷风2006),上面形貌的办理计划源自zlp321002(龙卷风2006))

1)翻开数据库的内部会见选项(external_access_option)
AlterDatabase数据库名
SETTRUSTWORTHYON

reference:关于数据库内部会见选项(external_access_option)的形貌(摘录自SQLServerBooksOnline)
TRUSTWORTHY{ON|OFF}
ON
Databasemodules(forexample,user-definedfunctionsorstoredprocedures)thatuseanimpersonationcontextcanaccessresourcesoutsidethedatabase.
OFF
Databasemodulesinanimpersonationcontextcannotaccessresourcesoutsidethedatabase.
TRUSTWORTHYissettoOFFwheneverthedatabaseisattached.
Bydefault,themasterdatabasehasTRUSTWORTHYsettoON.ThemodelandtempdbdatabasesalwayshaveTRUSTWORTHYsettoOFF,andthevaluecannotbechangedforthesedatabases.
Tosetthisoption,requiresmembershipinthesysadminfixedserverrole.
Thestatusofthisoptioncanbedeterminedbyexaminingtheis_trustworthy_oncolumninthesys.databasescatalogview.

2)设置存储历程dll的PERMISSION_SET为EXTERNAL_ACCESS
将操纵步骤第2)步华夏来的
CREATEASSEMBLYSubmit_Answer
FROMD:studyC#测评体系WebSite1StoredProcedureSubmit_AnswerinDebugSubmit_Answer.dll
GO
改成:
CREATEASSEMBLYSubmit_Answer
FROMD:studyC#测评体系WebSite1StoredProcedureSubmit_AnswerinDebugSubmit_Answer.dll
WITHPERMISSION_SET=EXTERNAL_ACCESS
GO
reference:关于CREATEASSEMBLY中PERMISSION_SET设置(摘录自SQLServerBooksOnline)

PERMISSION_SET{SAFE|EXTERNAL_ACCESS|UNSAFE}
SpecifiesasetofcodeaccesspermissionsthataregrantedtotheassemblywhenitisaccessedbySQLServer.Ifnotspecified,SAFEisappliedasthedefault.
WerecommendusingSAFE.SAFEisthemostrestrictivepermissionset.CodeexecutedbyanassemblywithSAFEpermissionscannotaccessexternalsystemresourcessuchasfiles,thenetwork,environmentvariables,ortheregistry.
EXTERNAL_ACCESSenablesassembliestoaccesscertainexternalsystemresourcessuchasfiles,networks,environmentalvariables,andtheregistry.
UNSAFEenablesassembliesunrestrictedaccesstoresources,bothwithinandoutsideaninstanceofSQLServer.CoderunningfromwithinanUNSAFEassemblycancallunmanagedcode.
SecurityNote:
SAFEistherecommendedpermissionsettingforassembliesthatperformcomputationanddatamanagementtaskswithoutaccessingresourcesoutsideaninstanceofSQLServer.WerecommendusingEXTERNAL_ACCESSforassembliesthataccessresourcesoutsideofaninstanceofSQLServer.EXTERNAL_ACCESSassembliesincludethereliabilityandscalabilityprotectionsofSAFEassemblies,butfromasecurityperspectivearesimilartoUNSAFEassemblies.ThisisbecausecodeinEXTERNAL_ACCESSassembliesrunsbydefaultundertheSQLServerserviceaccountandaccessesexternalresourcesunderthataccount,unlessthecodeexplicitlyimpersonatesthecaller.Therefore,permissiontocreateEXTERNAL_ACCESSassembliesshouldbegrantedonlytologinsthataretrustedtoruncodeundertheSQLServerserviceaccount.Formoreinformationaboutimpersonation,seeCLRIntegrationSecurity.SpecifyingUNSAFEenablesthecodeintheassemblycompletefreedomtoperformoperationsintheSQLServerprocessspacethatcanpotentiallycompromisetherobustnessofSQLServer.UNSAFEassembliescanalsopotentiallysubvertthesecuritysystemofeitherSQLServerorthecommonlanguageruntime.UNSAFEpermissionsshouldbegrantedonlytohighlytrustedassemblies.OnlymembersofthesysadminfixedserverrolecancreateandalterUNSAFEassemblies.

做完上述修正后,再次运转网页,提交表单,不再呈现非常了。
5.小结:
看来这个存储历程会见权限的办理是从上面两个方面举行:起首翻开数据库的内部会见选项,同意数据库的模块会见内部资本;接着设置谁人存储历程dll的PERMISSION_SET,即设置这个dll的会见权限为同意会见内部资本。如许,存储历程就能够会见数据库了。

支持多种存储引擎。
飘灵儿 该用户已被删除
沙发
发表于 2015-1-19 10:02:40 | 只看该作者
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
莫相离 该用户已被删除
板凳
发表于 2015-1-27 07:31:34 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
因胸联盟 该用户已被删除
地板
发表于 2015-2-5 04:15:10 | 只看该作者
比如日志传送、比如集群。。。
蒙在股里 该用户已被删除
5#
发表于 2015-2-11 04:29:20 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
不帅 该用户已被删除
6#
发表于 2015-3-1 21:42:48 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
山那边是海 该用户已被删除
7#
发表于 2015-3-11 00:36:32 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
分手快乐 该用户已被删除
8#
发表于 2015-3-17 17:09:48 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
活着的死人 该用户已被删除
9#
发表于 2015-3-24 14:42:06 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 18:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表