数据库中User和Schema的关系!

本文详细阐述了SQL Server中用户(User)与架构(Schema)的概念及其关系,通过形象的比喻帮助理解两者区别及如何创建表与指定权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果我们想了解数据库中的User和Schema到底什么关系,那么让我们首先来了解一下数据库中User和Schema到底是什么概念。
       在SQL Server2000中,由于架构的原因,User和Schema总有一层隐含的关系,让我们很少意识到其实User和Schema是两种完全不同的概念,不过在SQL Server2005中这种架构被打破了,User和Schema也被分开了。      
       首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是Column,什么是Row,什么是User?我们可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了J。,然后床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,【所以Schema包含的是Object,而不是User】,其实User是对应于数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,当然也可以拆除一个房间(Remove Schema)。呵呵,和现实也太相似了吧。我(仓库的管理员)还可以给User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。
OK,我们话题继续!
       在SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认Schema 【Bosco】。Schema的名字和User的名字相同,这也是我们分不清楚用户和Schema的原因。
       在SQL Server2005中,为了向后兼容,当你用sp_adduser 存储过程创建一个用户的时候,SQL Server2005同时也创建了一个和用户名相同的Schema,然而这个存储过程是为了向后兼容才保留的,我们应该逐渐熟悉用新的DDL语言Create User和Create Schema来操作数据库。在SQL Server2005中,当我们用Create User创建数据库用户时,我们可以为该用户指定一个已经存在的Schema作为默认Schema,如果我们不指定,则该用户所默认的Schema即为dbo Schema,dbo 房间(Schema)好比一个大的公共房间,在当前登录用户没有默认Schema的前提下,如果你在大仓库中进行一些操作,比如Create Tabe,如果没有指定特定的房间(Schema),那么你的物品就只好放进公共的dbo房间(Schema)了。但是如果当前登录用户有默认的Schema,那么所做的一切操作都是在默认Schema上进行(比如当前登录用户为login1,该用户的默认Schema为login1,那么所做的所有操作都是在这个login1默认Schema上进行的。实验已经证明的确如此)。估计此时你会有一点晕,为什么呢?我刚才说dbo是一个Schema,但是你可以在数据库中查看到,dbo同时也是一个user,晕了吧,呵呵。
       在SQL Server2005中创建一个数据库的时候,会有一些默认Schema被创建,被默认创建的Schema有:dbo,INFORMATION_SCHEMA, guest,sys等等(还有一些角色Schema,不提了,又晕了)。
       我在上文中已经提到了,在SQL Server2005中当用存储过程sp_adduser创建一个user时,同时SQL Server2005也为我们创建了一个默认的和用户名相同的Schema,这个时候问题出来了,当我们create table A时,如果没有特定的Schema做前缀,这个A表创建在了哪个Schema上,即进入了哪个房间?答案是:
  1. 如果当前操作数据库的用户(可以用Select current_user查出来)有默认的Schema(在创建用户的时候指定了),那么表A被创建在了默认的Schema上。
  2.  如果当前操作数据库的用户没有默认的Schema(即在创建User的时候默认为空),但是有一个和用户名同名的Schema,那么表A照样被创建在了dbo Schema上,即使有一个和用户名同名的Schema存在,由于它不是该用户默认的Schema,所以创建表的时候是不会考虑的,当作一般的Schema来处理,别看名字相同,可是没有任何关系哦。
  3. 如果在创建表A的时候指定了特定的Schema做前缀,则表A被创建在了指定的 Schema上(有权限吗?)

       现在问题又出来了,在当前操作数据库的用户(用select current_user可以查看到,再次强调)没有默认Schema的前提下,当我们用Create table A语句时,A表会去寻找dbo Schema,并试图创建在dbo Schema上,但是如果创建A表的用户只有对dbo Schema的只读权限,而没有写的权限呢?这个时候A表既不是建立不成功,这个就是我以后会提及到的Login,User, Role和Schema四者之间的关系。在这里,为了避免混淆和提高操作数据库的速度(在少量数据范围内,对我们肉眼来说几乎看不到差异),我们最好每次在操作数据库对象的时候都显式地指定特定的Schema最为前缀。

       现在如果登录的用户为Sue,该用户有一个默认Schema也为Sue,那么如果现在有一条查询语句为Select * from mytable, 那么搜寻每个房间(Schema)的顺序是怎样的呢?顺序如下:

  1. 首先搜寻 sys.mytable   (Sys Schema)
  2. 然后搜寻 Sue.mytable   (Default Schema)
  3. 最后搜寻 dbo.mytable      (Dbo Schema)

       执行的顺序大家既然清楚了,那么以后在查询数据库表中的数据时,最好指定特定的Schema前缀,这样子,数据库就不用去扫描Sys Schema了,当然可以提高查询的速度了。

       另外需要提示一下的是,每个数据库在创建后,有4个Schema是必须的(删都删不掉),这4个Schema为:dbo,guest,sys和INFORMATION_SCHEMA,其余的Schema都可以删除。

<think>首先,用户的问题是关于GoldenDB中schema、用户数据库之间的关系。我需要参考提供的引用信息,但要注意,引用可能不是直接相关的,所以我必须基于GoldenDB的通用知识引用中的线索来回答。 从引用中: - 引用[1]提到GoldenDBGaussDB中,有管理组件GTM对sequence维护管理。 - 引用[2]讨论Oracle数据库中的实例、用户表空间概念,但用户指定GoldenDB,所以我不能直接复制。 - 引用[3]是数据库发展的一般信息,不具体。 用户的上一次问题是关于GoldenDB中的schema、用户数据库关系,所以我需要专注于那个。 在关系数据库中,如GoldenDB(基于MySQL或类似),常见的概念是: - **数据库 (Database)**: 一个容器,包含多个schema或表。 - **Schema**: 在MySQL中,schema通常等同于数据库;在Oracle中,schema是用户拥有的对象集合。 - **用户 (User)**: 拥有权限访问数据库的对象。 GoldenDB是中兴开发的分布式数据库,基于MySQL。在MySQL中: - "Database" "Schema" 是同义词;创建一个数据库就是创建一个schema。 - 用户是独立的实体,可以访问特定的数据库。 在GoldenDB中,类似MySQLschema通常指数据库对象。 参考引用[2]:它提到在Oracle中,用户是在实例下建立的,用户表空间是多对多关系,但用户有默认表空间。在GoldenDB中,可能类似,但GoldenDB是基于MySQL的。 我需要构建一个清晰的回答: 1. 解释每个概念。 2. 描述它们之间的关系。 3. 使用中文回答。 4. 结构清晰,逐步解决问题。 5. 生成相关问题。 6. 在回答中,如果引用段落,自然地添加引用标识,但引用不直接相关,所以我可能不需要直接引用,除非适用。 回答结构: - 先介绍GoldenDB背景(基于引用[3])。 - 然后定义schema、用户、数据库。 - 解释关系。 - 确保使用LaTeX格式:行内数学用$...$,独立公式用$$...$$,但这里可能不需要数学,除非有等式。 - 最后生成相关问题。 定义关系: - 在GoldenDB中: - **数据库 (Database)**: 一个逻辑容器,包含多个schema或表。在MySQL兼容系统中,数据库就是schema。 - **Schema**: 等同于数据库;一个命名空间,包含表、视图等。 - **用户 (User)**: 一个账户,可以访问数据库;用户可以被授予对特定数据库的权限。 关系: - 一个数据库可以有多个用户访问。 - 一个用户可以访问多个数据库。 - 用户数据库关系是通过权限(grants)管理的。 引用[1]提到GTM管理sequence,但可能不直接相关。引用[2]讨论实例、用户、表空间,但GoldenDB可能不同。 我应该基于通用知识: - 在GoldenDB,类似MySQL: - 实例 (Instance):一个运行的数据库服务。 - 数据库 (Database):在实例中创建的逻辑容器。 - Schema:同义词于数据库。 - 用户:在实例级别创建,然后授予数据库权限。 所以,关系: - 用户是在数据库实例级别定义的。 - 数据库(或schema)是在实例中创建的。 - 用户可以被授予访问一个或多个数据库的权限。 - 因此,用户数据库是多对多关系。 回答步骤: 1. 介绍GoldenDB。 2. 定义每个概念。 3. 解释关系。 4. 总结。 5. 生成相关问题。 最后,添加相关问题。</think>### GoldenDB中schema、用户数据库之间的关系 GoldenDB是中兴通讯开发的一款分布式关系数据库,基于MySQL内核,支持高并发、高可用分布式事务处理[^3]。在GoldenDB中,schema、用户数据库是核心概念,它们之间的关系类似于其他关系数据库(如MySQL),但具有分布式特性。下面我将逐步解释每个概念及其相互关系,帮助您清晰理解。 #### 1. **概念定义** - **数据库 (Database)**: 数据库是GoldenDB中的一个逻辑容器,用于存储管理数据对象(如表、视图、索引等)。一个GoldenDB实例可以包含多个数据库,每个数据库独立存在,用于隔离不同应用的数据。例如,创建数据库SQL语句为:`CREATE DATABASE db_name;`。在GoldenDB中,数据库通常与schema概念高度重叠(见下文)。 - **Schema**: Schema在GoldenDB中(基于MySQL协议)本质上是数据库的同义词。它表示一个命名空间,包含一组相关的数据对象(如表、函数等)。创建schema等同于创建数据库:`CREATE SCHEMA schema_name;`。在GoldenDB的上下文中,schema主要用于组织数据结构权限控制,而不是一个独立的实体。这意味着在SQL操作中,schema数据库可以互换使用,例如`USE db_name;` 或 `USE schema_name;`。 - **用户 (User)**: 用户是GoldenDB实例中的账户实体,用于身份验证权限管理。每个用户拥有唯一的用户名密码,可以登录到数据库实例。用户本身不直接存储数据,而是通过权限被授予访问特定数据库(或schema)的权限。创建用户的SQL语句为:`CREATE USER 'user_name'@'host' IDENTIFIED BY 'password';`。用户权限包括SELECT、INSERT、UPDATE等操作,通过`GRANT`语句分配。 #### 2. **三者之间的关系** 在GoldenDB中,schema、用户数据库关系可以从以下角度理解: - **用户与数据库关系**: 用户数据库之间是多对多关系。一个用户可以被授予访问多个数据库的权限,同时一个数据库可以被多个用户访问。权限管理通过`GRANT``REVOKE`语句实现,例如: ```sql GRANT ALL PRIVILEGES ON db_name.* TO 'user_name'@'host'; -- 授予用户对数据库的完全权限 ``` 这确保了数据隔离安全性:用户只能操作自己有权限的数据库对象。在GoldenDB中,用户默认没有访问任何数据库的权限,必须显式授权[^2]。 - **Schema数据库关系**: 如前所述,在GoldenDB(兼容MySQL)中,schema数据库是等价概念。创建数据库时自动创建同名的schema,反之亦然。这意味着: - 一个数据库对应一个schema(例如,数据库`sales_db`对应schema `sales_db`)。 - 数据库作为schema的容器,schema作为数据对象的组织单元(如表`sales_db.customers`)。 这种设计简化了数据管理,避免了Oracle等数据库schema与用户的强绑定(在Oracle中,schema通常由用户拥有)。 - **整体关系模型**: GoldenDB实例是最高层实体,包含多个数据库(即schema)。用户独立于数据库创建在实例级别,然后通过权限关联到特定数据库关系可总结为: - 实例 → 多个数据库(每个数据库是一个schema) → 多个数据对象(表等)。 - 用户 → 通过权限关联到多个数据库。 例如,在GoldenDB的分布式环境中,GTM(Global Transaction Manager)组件可能管理全局序列(如sequence),但用户、schema数据库关系由核心引擎处理[^1]。 #### 3. **关键点总结** - **权限控制核心**:用户与数据库的交互完全基于权限。GoldenDB支持细粒度权限管理,确保数据安全,例如限制用户只能访问特定schema中的表。 - **分布式特性**:GoldenDB作为分布式数据库,用户schema的访问可能涉及多节点协调,但逻辑关系与单机MySQL一致。 - **最佳实践**:创建用户时建议指定默认数据库(如`ALTER USER 'user_name'@'host' DEFAULT DATABASE db_name;`),以避免每次操作都需显式指定schema[^2]。 总之,在GoldenDB中,schema数据库是同一概念的不同表述,而用户是独立的权限实体,三者通过权限机制形成多对多关系。这种设计便于数据隔离灵活访问控制,适用于金融、电信等高并发场景[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值