爱飞 发表于 2015-1-16 22:23:14

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

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

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

比如日志传送、比如集群。。。

蒙在股里 发表于 2015-2-11 04:29:20

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。

不帅 发表于 2015-3-1 21:42:48

对于微软系列的东西除了一遍遍尝试还真没有太好的办法

山那边是海 发表于 2015-3-11 00:36:32

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

分手快乐 发表于 2015-3-17 17:09:48

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。

活着的死人 发表于 2015-3-24 14:42:06

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
页: [1]
查看完整版本: MSSQL网页编程之SQLServer存储历程会见数据库权限非常问...