请教数据库中关于schema的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教数据库中关于schema的理解相关的知识,希望对你有一定的参考价值。

参考技术A mysql中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL
Server和Orcal数据库中好像又不一样.
目前我只能理解,在mysql中
schema<==>database。
数据库中User和Schema的关系
假如我们想了解数据库中的User和Schema究竟是什么关系,首先必须了解一下数据库中User和Schema到底是什么概念。
在SQL
Server2000中,由于架构的原因,User和Schema总有一层隐含的关系,让我们很少意识到其实User和Schema是两种完全不同的概念,不过在SQL
Server2005中这种架构被打破了,User和Schema也被分开了。
首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们可以可以把Database看作是一个
大仓库
,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了J。,然后床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床,
User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),其实User是对应与数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。

MVC中关于Membership类跟数据库的问题

当用到Membership这些关于管理用户啊什么的这些类的时候就会自动创建一个名叫ASPNETDB的数据库。。而像Membership啊。。MembershipUser啊。。MembershipProvider啊。。这几个类所连接到的是这个ASPNETDB数据库吧。。都在这个数据库进行数据读取啊修改啊什么的。。那现在可不可以设置连接到自己的数据库呢。。可以的话具体要怎么做。。不可以的话。。那像我这样需要进行网页用户管理之类的操作。。自己写方法写类来实现的吗。。诚心求高手详细解说。。

Membership它们用的是ASPNETDB这个数据库,但我们可以使用我们自定义的数据库,然而除非我们自定义的数据库有着跟这个ASPNETDB一样的模式,否则ASP.NET提供的默认的SqlMembershipProvider将无法被使用。
也就是说,如果我们还要用ASP.NET提供的SqlMembershipProvider,我们就必须ASPNETDB这个数据库文件或是它的拷贝。明显,这不是我们要的。
为此,若我们使用了自定义的数据库(而非ASPNETDB的拷贝),那么我们就必须写自己的MembershipProvider。步骤如下。
1,定义好自己的数据库,此例中为TestDB01。在我的TestDB01下有一表UserInfo,其下有字段UserID,UserName,UserAge。
2,写自己的MembershipProvider,这个类继承自命名空间System.Web.Security下的MembershipProvider类。这一步很简单,创建一个空类,举例名为MyMembershipProvider,技术上说我们可以把它放在应用程序的任何位置,但我把它放在了项目下的一个名为Infrastructure(自己加的)的文件夹下。
这一步的初始代码形式大概如下:
namespace MvcApplication5.Infrastructure

public class MyMembershipProvider : System.Web.Security.MembershipProvider/*我把命名空间写这了*/



当然,它是空的,它需要我们往里面再加一些东西。。
此时我们把光标放到“System.Web.Security.MembershipProvider”上并右击鼠标,在弹出的下拉框上我们可以看到“实现虚拟类”(我用的是英文版,我不知道有没有翻译对,原内容是“Emplement Abstract Class”),单击这一选项我们的MyMembershipProvider这个类顿时多了N多个方法,此时它的形式如下(我只截了一部分):
public class MyMembershipProvider : System.Web.Security.MembershipProvider

public override string ApplicationName

get

throw new NotImplementedException();

set

throw new NotImplementedException();



public override bool ChangePassword(string username, string oldPassword, string newPassword)

throw new NotImplementedException();


//...

public override bool ValidateUser(string username, string password)

throw new NotImplementedException();


可以看到,这些方法什么都没做,除了抛出一个NotImplementedException异常。当然,这不是我们希望的,这些方法需要我们自己去填充,要不然怎么叫“自定义”呢。。
呃,现在先把我们先不管别的方法,只看最后的这个ValidateUser()方法。顾名思义,这个正是我们用来验证用户的方法,对其修改如下:
public override bool ValidateUser(string username, string password)

SqlConnection sqlconn = new SqlConnection("Data Source=HCNG-PC;Initial Catalog=TestDB01;Integrated Security=True");/*用你的数据源名替换HCNG-PC,且TestDB01是我用来测试的自定义数据库*/
SqlCommand sqlcmd = new SqlCommand("select UserID, UserName from [UserInfo] where UserName = @userName and UserAge = @userAge", sqlconn);/*这些相信你都明白,若有不明,请补充问题*/

try

sqlconn.Open();

sqlcmd.Parameters.Add(new SqlParameter("@userName", SqlDbType.NVarChar, 50));
sqlcmd.Parameters["@userName"].Value = username.Trim();
sqlcmd.Parameters.Add(new SqlParameter("@userAge", SqlDbType.SmallInt, 2));
sqlcmd.Parameters["@userAge"].Value = password;

SqlDataReader sqlRd = sqlcmd.ExecuteReader();
if (sqlRd.HasRows)

return true;


return false;

catch (Exception ex)

throw new Exception(ex.Message);


至此,我们的自定义MembershipProvider算是完成。
3,配置web.config。把此配置文件下的<system.web>节点下的默认的<membership>节点换成如下:
<system.web>
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" <!--前三行要用到的名字。。-->type="MvcApplication5.Infrastructure.MyMembershipProvider"/><!--注意不要漏了命名空间的名字。。-->
</providers>
</membership>
4,工作基本完成,只剩查看效果了。
在项目下加一个Default1Controller,在此Default1Controller下加如下action:
[HttpPost]
public ActionResult Index(string username, string password)

if (Membership.ValidateUser(username, password))

ViewData["message"] = "OK";

else

ViewData["message"] = "NO";


return View();

发现了吧,用个Membership.ValidateUser()就行了。

相信同时你也发现了,这样的自定义MembershipProvider似乎实在是没起到什么特别的作用,至少我是这么认为的。。
而且在MVC中最好不用登录控件,所以我们若在MVC中自定义MembershipProvider跟写自己的会员管理逻辑已没什么差别。。

如果你确实要使用自定义的MembershipProvider的话,那么以上代码显然是不够的,比如System.Web.Security.MembershipProvider的第一个方法ChangePassword(),它用来更改用户密码,这需要我们自己写的代码来实现它的逻辑。。
然后是第二个方法ChangePasswordQuestionAndAnswer()用来为用户提供更改问题答案功能,第三个方法CreateUser()来用创建新用户。。

以上是MembershipProvider,接下来还有RoleProvider,下面是一个自定义RoleProvider的一部分:
public class MyRoleProvider : RoleProvider

public override string[] GetRolesForUser(string username)

if (username == "Steve")
return new string[] "ApprovedMember", "CommentsModerator" ;
else
return new string[] ;

/* 被省略的部分 */

当然,有关RoleProvider,要说的还有它的web.config节点配置,希望你上网查查,如果你还是确定你要用它的话。。

还有就是自定义ProfileProvider,跟前二者差不多,同样如果你确定想用它的话。。

对于你的问题,概括地回答是:
1,问:那现在可不可以设置连接到自己的数据库呢?答:可以设置连接到自己的数据库。
2,问:可以的话具体要怎么做?答:如上所示。。
3,问:不可以的话?答:没有不可以的话。。只是,如果“不想这样做的话”,找本书或是网上下个例子就知道了。。

最后的话:
我之所以把自定义MembershipProvider写的稍微详细一点,并不是为了告诉你这个东西有多好用,只是告诉你它的原理。呃,我看这个东西就是出于这个目的。。
之所以很是简单地讲了一点自定义RoleProvider跟自定义ProfileProvider,除了实现它们的做法差不多外,更多的是因为打字并不是一件美差。。
而至于为什么我们能如此简单地自定义这些Provider,有兴趣看看设计模式中的“策略模式”吧。

如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。
参考技术A 我也是想自己自己动手写类,而不是直接调用微软的类库 参考技术B 无中生有何时明 高人啊!
受教了!

以上是关于请教数据库中关于schema的理解的主要内容,如果未能解决你的问题,请参考以下文章

请教关于SV中关于队列的问题

请教Express中关于get方法带中文参数转码问题

新手请教C#中关于静态函数和静态变量

数据结构中关于结构代码硬是不能理解,求高手相信解答!

ES中关于analyzer的再理解

labview中关于波形图的问题