5 . 4 . 3 架构

5 . 4 . 3 架构

大家好,又见面了,我是你们的朋友全栈君。

5 . 4 . 3 架构
SQL Server 2008按 ANSI标准中的定义实现了数据库架构。SQL Server 2008中几乎每个对 
象都存在于一个已定义的架构中。架构只是一种组织数据库对象并为它所包含的对象指派权限 
的方法。架构本身可为任意数据库主体(包括数据库角色和应用程序角色)所有,同时包含多个 
由不同用户拥冇的对象。在架构中,对象的名称不能重复。然而,如果它们存在于不同的架构 
中,那么可以有相同的名称。例如,如果在服务器AughtEight上的Sales架构中创建了一个名 
为 Inventory的表,这个表名称就变成AughtEight.Sales.lnventory。在 Marketing染构中可以创建 另一个名为Inventory的表,它的名称则是AughtEight.Marketing.Inventory。尽管这是可行的, 
但我认为这并不是个好主意,因为这会使不熟悉该数据库的用户感到困惑,在以后也可能生成 
意外的查询结果。架构真正的强大之处在于它构成了 一个安全作用域,数据库管理员可以使用 
这个安全作用域来控制对架构中的所有对象的访问。第6 章对此有详细介绍。
在 SQL Server 2008中,数据库主体被赋予一个架构的所有权,而该架构又拥有表、视 图、存储过程和函数等组成对象。如果需要删除拥有某个架构的用户,那么必须首先把该 
架构的所有权赋予另一个用户。最简单的解决方案就是使dbo用户拥有所有架构。dbo用 户是一个内置用户,映射至固定服务器角色sysadmin的任意成员。dbo用户总是存在,且 不能被删除,因此它是架构所有权的最理想候选人。要了解有关dbo用户、固定服务器角 
色和SQL Server 2008安全性的更多信息,请参阅第6 章。

1. 架构和名称解析
由于架构只是对象容器,因此在SQL Server 2008中引用数据库对象时,设定对象引用 的上下文是很重要的。每个用户都被指派一个默认的架构。当他们登录到SQL Server并引 用数据库对象时,这个默认架构将在该对象的引用方式中发挥独特的作用。
例如,假设在AdventureWorks2008数据库中创建了一个名为FredF的用户,并把默认 
架构Sales指派给他。如果FredF登录并执行SELECT* FROM CreditCard査询,由于其默 认染构是 Sales,CreditCard 表将被解析为 Adventureworks2008.Sales.CreditCard。 由于 
Sales.CreditCard表存在,因此查询将返回该表的内容。
如果 FredF 执行 SELECT * FROM Person 查询,Person 表将被解析为 Adventureworks2008. 
Salesperson,这是一个并不存在的表。由于SQL Server在 FredF的默认架构中找不到Person 表,它将默认去dbo架构中寻找AdventureWorks2008.dbo.Person表,同样这也不会成功。 
此时,SQL Server就会返回错误“无效的对象名称”。
2. 创建架构
要创建架构,唯一需要的信息就是架构的名称。架构所有权默认属于运行创建脚本的 
用户,但可以把任何有效的数据库用户指定为所有者。最简单的方法就是将dbo指定为架 构所有者,但在有些情况下,把一个锌通用户指定为所有者比较合适。CREATE SCHEMA 
语句的语法和例子如下所示:
CREATE SCHEMA Schema_Name [ AUTHORIZATION owner ]
USE AdventureWorks2008 GO
CREATE SCHEMA Operations AUTHORIZATION dbo
该 CREATE SCHEMA语句之后的任何架构作用域的语句都将位于刚才创建的架构的 
作用域内,如下例所示:
USE AdventureWorks2008 GO
CREATE SCHEMA Operations AUTHORIZATION dbo
CREATE TABLE DeliveryDriver (DriverlD int IDENTITY NOT NULL ,LName varchar(75) NOT NULL 
, FName v a rc h a r(75) NOT NULL)
GRANT SELECT ON DeliveryDriver TO FredF
虽 然 在 CREATE TABLE语句中没有指定架构,此 脚本仍将DeliveryDriver表放入 
Operations架构中。甚至GRANT SELECT语句也会成功,尽管在该语句中未指派架构,它 默认使用Operations架构,因为CREATE SCHEMA语句为批处理中的其余语句设定了该 架构的作用域。如果对脚本稍做改变,使 GRANT SELECT语句处于另一个批处理中,那 
么 GRANT SELECT就会运行失败。

 

CREATE SCHEMA Operations AUTHORIZATION dbo CREATE TABLE DeliveryDriver (DriverlD int IDENTITY NOT NULL ,LName varchar(75) NOT NULL ,FName varchar(75) NOT NULL)
GO
GRANT SELECT ON DeliveryDriver TO FredF
Msg 15151, Level 16, State 1, Line 1 Cannot find the object 1 DeliveryDriver’, because it does not exist or you do not have permission.
GO关键字将GRANT SELECT语句放在创建架构的批处理之外,这样执行上下文就
变成执行脚本的用户上下文。作为最佳实践,应该总是指定对象的架构以避免不可预料的
结果。
CREATE SCHEMA Operations AUTHORIZATION dbo CREATE TABLE Operations.DeliveryDriver (DriverlD int IDENTITY NOT NULL ,LName varchar(75) NOT NULL ,FName varchar(75) NOT NULL) GRANT SELECT ON Operations.DeliveryDriver TO FredF
记住,架构作用域解析总是起始于用户的默汄架构,如果一个被引用的对象不是作用
域限定的,解析将返回到dbo架构。

3 .架构维护
如果试图删除一个包含对象的架构,将产生如下例所示的错误:
DROP SCHEMA Operations
Msg 3729, Level 16, State 1, Line 1 Cannot drop schema ‘Operations * because it is being referenced by object *DeliveryDriver*.
如果仍然需要该架构中的对象,可以使用ALTER SCHEMA语句把它转移到另一个架
构中。
ALTER SCHEMA Production TRANSFER Operations.DeliveryDriver
这个例子把表DeliveryDriver从 Operations架构转移到Production架构中。因为这是架
构中仅剩的对象,所以现在可以删除架构。但是要注意,将一个对象从一个架构移动到另
一架构会清除在该对象上设定的任何权限。
不能从数据库中删除拥有架构的对象,这就是为什么让dbo用户拥有所有架构的原因

之一。要想改变一个架构的所有权,需要改变该架构的AUTHORIZATION属性。下面的
例子将Operations架构的所有权改授予FredF:
ALTER AUTHORIZATION ON SCHEMA::Operations TO FredF

转载于:https://www.cnblogs.com/zhouwansheng/p/9313518.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107417.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《老友记》典故集解 Season 1-10

    《老友记》典故集解 Season 1-10第一季第一集Mr.PotatoHead瑞秋和众人谈到了她逃婚的原因,她说这是因为她突然发现她的未婚夫巴里医生长得活像“薯头先生(Mr.PotatoHead)”,这是在美国家喻户晓的卡通人物。如果大家看过《玩具总动员(ToyStory)》,就会在里面发现他和他的夫人“薯头太太(Mrs.PotatoHead)”叽叽歪歪,经常批评这、批评那的形象。尽管“薯头先生”很…

    2022年7月11日
    18
  • [TensorFlowJS只如初见]实战三·使用TensorFlowJS拟合曲线

    [TensorFlowJS只如初见]实战三·使用TensorFlowJS拟合曲线问题描述拟合y=x*x-2x+3+0.1(-1到1的随机值)曲线给定x范围(0,3)问题分析在直线拟合博客中,我们使用最简单的y=wx+b的模型成功拟合了一条直线,现在我们在进一步进行曲线的拟合。简单的y=wx+b模型已经无法满足我们的需求,需要利用更多的神经元来解决问题了。代码<html><head><script…

    2022年7月16日
    20
  • 安装EIGEN库_安装第三方库的方法

    安装EIGEN库_安装第三方库的方法官网:https://eigen.tuxfamily.org/index.php?title=Main_Page源码链接:https://gitlab.com/libeigen/eigen/-/releases/3.4.0解压出来:安装使用方法在文件下:我们按照自己习惯来:安装完成下次在cmake就可以使用了

    2022年10月19日
    4
  • DB2错误代码_db2错误码57016

    DB2错误代码_db2错误码570161前言作为一个程序员,数据库是我们必须掌握的知识,经常操作数据库不可避免,but,在写SQL语句的时候,难免遇到各种问题。例如,当咱们看着数据库报出的一大堆错误代码时,是否有种两眼发蒙的感觉呢?咳咳,莫要否认,你有、我有,全都有啊!不过,值得庆幸的是,已经有人帮咱们整理出一份关于DB2的错误代码大全啦,以后再遇到数据库报错,直接拎出看看,岂不爽哉?当然,在此对原作者送上万分的感谢。2错误

    2025年12月14日
    7
  • c#之splitcontainer类(接口)

    c#之splitcontainer类(接口)tcbs系统中用到,故大约了解下用法:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.splitcontainer.aspx下面的代码示例演示…

    2022年7月18日
    13
  • 微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」

    微商分销代理商城源码带代理等级和升级条件 thinkphp框架「建议收藏」  介绍:微商分销代理商城源码基于think框架开发是一款微商分销代理商城源码,可以自己设置代理等级和升级条件(如购买指定商品、消费额度)网站搭建方式介绍:测试环境php7.0+mysql5.6数据库配置文件applicationdatabase.php后台/admin用户:admin密码:123456下载链接:thinkphp框架微商分销代理商城源码-代理等级和升级条件…

    2022年5月17日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号