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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 移动端fastClick使用

    移动端fastClick使用作为一个新手,插件原理什么的研究不透,看的也是似懂非懂的,网上有很多大牛写的博文相当的好   在这里我只是简单的记录下简单的用法,还请大牛们不吝赐教     为什么存在延迟?     从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约300毫秒的等待时间。为什么这么设计呢?因为它想看看你是不是要进行双击(doubletap)操作。1、引入插件的jav…

    2022年6月19日
    38
  • SQL学习收获与心得

    SQL学习收获与心得SQL或结构化查询语言是一种语言,旨在允许技术和非技术用户查询,操作和转换关系数据库中的数据。由于其简单性,SQL数据库为数百万个网站和移动应用程序提供安全且可扩展的存储。有许多流行的SQL数据库,包括MySQL,MSSQL和Oracle等等。所有这些都支持通用的SQL语言标准,这是该网站将要教授的内容,但每个实现可以在它支持的附加功能和存储类型方面有所不同。基本的sql语句:选择:se…

    2022年8月21日
    5
  • 面向对象和面向过程的区别理解_c是面向对象还是面向过程

    面向对象和面向过程的区别理解_c是面向对象还是面向过程一、面向对象和面向过程面向对象面向过程编程是一种以过程为中心的编程思想,分析出解决问题的步骤,然后用函数把这些步骤一步一步实现。面向过程编程,数据和对数据的操作是分离的,函数本身只

    2022年8月16日
    3
  • XSL教程(1)

    XSL教程(1)

    2021年7月22日
    50
  • PyCharm如何安装torch

    PyCharm如何安装torch运行Pycharm中的代码时候提示ModuleNotFoundError:Nomodulenamed‘torch’。试了很多种方法都不行,然后进入官网查了下具体的安装方法,附上网址添加链接描述。摘取一段放在这里供大家参考。#CUDA10.0pipinstalltorch===1.2.0torchvision===0.4.0-fhttps://download.pytorch.org/whl/torch_stable.html#CUDA9.2pipinstalltor

    2022年10月29日
    0
  • linux tar命令打包整个文件夹详解,Linux tar打包命令详解

    linux tar命令打包整个文件夹详解,Linux tar打包命令详解Linux系统中,最常用的归档(打包)命令就是tar,该命令可以将许多文件一起保存到一个单独的磁带或磁盘中进行归档。不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包。使用tar命令归档的包通常称为tar包(tar包文件都是以“.tar”结尾的)。tar命令做打包操作当tar命令用于打包操作时,该命令的基本格式为:[root@localhost~]#…

    2022年5月31日
    52

发表回复

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

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