SQL SERVER 2005/2008 中关于架构的理解(二)

本文上接SQL SERVER 2005/2008 中关于架构的理解(一)     

架构的作用与示例

用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVER 2000及以前版本中“用户离开公司"问题,也就是在拥有该对象的用户离开公司,或离开该职务时,不必要大费周章地更改该用户所有的对象属于新的用户所有。另外,也可让 DBA 在安装某个套装软件时,设置该套装软件所用的数据库对象都属于某个特定的架构,容易区别。也就是说,在单一数据库内,不同部门或目的的对象,可以通过架构区分不同的对象命名原则与权限。

在 SQL Server 2005 /2008中,架构独立于创建它们的数据库用户而存在。可以在不更改架构名称的情况下转让架构的所有权。并且可以在架构中创建具有用户友好名称的对象,明确指示对象的功能。例如,除了 cus.app.entry.customEntry 外,您还可以创建名为 cus.app.manifest.customEntry 的架构。因为“manifest”不是用户,所以从数据库中删除用户后,无需更改此名称。这就简化了数据库管理员和开发人员的工作。

SQL Server 2005/2008 还引入了“默认架构”的概念,用于解析未使用其完全限定名称引用的对象的名称。在 SQL Server 2000 中,首先检查的是调用数据库用户所拥有的架构,然后是 DBO 拥有的架构。在 SQL Server 2005 /2008中,每个用户都有一个默认架构,用于指定服务器在解析对象的名称时将要搜索的第一个架构。可以使用 CREATE USER 和 ALTER USER 的 DEFAULT_SCHEMA 选项设置和更改默认架构。如果未定义 DEFAULT_SCHEMA,则数据库用户将把 DBO 作为其默认架构。

下面的显示SQL Server权限层次结构的图可能会给我们一个直观的认识:

SQL Server 2005/2008 Database Engine 管理着可以通过权限进行保护的实体的分层集合。这些实体称为“安全对象”。在安全对象中,最突出的是服务器和数据库,但可以在更细的级别上设置离散权限。SQL Server 通过验证主体是否已获得适当的权限来控制主体对安全对象执行的操作。

安全对象关系如下图:

下面举个具体的示例来说明以一下架构的作用。

--命令对架构进行操作

use master

go

setuser

go

--创建测试数据库

create database schTest

go 

create login df with password=‘sj1234‘,default_database=schTest

create login xhl with password=‘sj1245‘,default_database=schTest

go

use schTest

go

 -- 创建两个用户时没有指定属于哪个架构

create user df for login df 

create user xhl for login xhl

-- 这个表没指定属于哪个架构属于默认DBO 架构

go

create table tb1 (姓名 varchar(8),性别 char(2))

 go

--这个表就属于sch架构

create schema sch

go

create table sch.tb2(姓名 varchar(8),性别 char(2),年龄 int)

go

-- 赋予schTest这个用户查询sche架构中的对象的权限. 

grant select on schema::sch to df 

go

setuser ‘df‘  --切换用户df

select * from  tb2

-- 此时报告"对象名无效" 是因为没有指定tb2的架构,系统默认为dbo,而我们的tb2属于sch架构.

--带上架构名称,就可以查询了

go

select * from sch.tb2

go

setuser  -- 切换到sa

---切换到xhl

setuser ‘xhl‘

--不能查询,是因为没有权限

select * from sch.tb2 

go

setuser --切换sa

--给df用户赋默认架构

alter user df with default_schema=sch

go

setuser ‘df‘  --切换df

-- 此时不需要指定sch 也可以了,如果架构中还有其他对象,也可以查询

select * from tb2

go

setuser  --切换sa

--创建第三张测试表,同样的是sch架构下

create table sch.tb3 (id int,uname varchar(8))

go

--切换用户df

setuser ‘df‘

---可以进行查询

select * from tb3

go

---但是无法进行数据插入,因为没有插入权限

insert into tb3 values (1,‘abcde‘)   --拒绝了insert权限

go

setuser

--赋插入权限

grant  insert on schema::sch to df

--切换用户df

setuser ‘df‘

go

---可以进行数据插入

insert into tb3 values (1,‘abcde‘)   --OK! 

---查询结果

select * from tb3

GO

Grant alter on schema::sch to df --  使schTest 这个用户对所有的架构都有可更改的能力。

--错误

--无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。

GO

Use master

 go

Grant control server to df  -- 使schTest这个用户能够控制服务器。

--错误

--无法对sa、dbo、实体所有者、information_schema、sys 或您自己授予、拒绝或撤消权限。

setuser

go

use schtest

go

--创建架构sch1

create schema sch1

go
-- 修改对象的架构tb2表的架构由sch 转移到sch1

alter schema sch1 transfer sch.tb2

go

--创建一个新用户,同时指定默认schema,默认属于DBO 

create login yhy with password=‘sj1234‘,default_database=master

GO

use schTest

GO

create user yhy for login yhy with default_schema=sch --属于sch

--切换用户yhy

setuser ‘yhy‘

--查询表,对象名‘tb2‘ 无效。

select * from tb2

go

setuser

--赋架构权限

grant select on schema::sch1 to yhy

--切换用户yhy

setuser ‘yhy‘

go

select * from tb2   ---还是无效,因为不在同一个schema

go

setuser

go

alter user yhy with default_schema=sch1   --更改yhy的默认架构

GO

--由于yhy不是当前用户,所以无法进行查询

select * from tb2  

--显示当前用户

GO

select user

GO

--切换用户yhy

setuser ‘yhy‘

-- 此时就可以进行查询了,如果架构中还有其他对象,也可以查询

go

select * from tb2  

--显示当前用户

select user

go

--切换用户

Setuser

--切换用户为df

setuser ‘df‘

-- 此时由于tb2的架构由sch变为了sch1,所以df就不可以查询tb2了

go

--查询报错
select * from tb2  

--显示当前用户
select user

go

setuser

go

use master

go

---删除用户

drop user df

drop user xhl

drop user yhy

---删除登录名

drop login df

drop login yhy

drop login xhl

--删除数据库

drop database schTest

时间: 2024-10-26 10:02:01

SQL SERVER 2005/2008 中关于架构的理解(二)的相关文章

SQL SERVER 2005/2008 中关于架构的理解(一)

引用:http://www.cnblogs.com/chillsrc/p/3383098.html 在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询,提示“对象名'CustomEntry' 无效.”.当带上了架构名称之后(如“cus.CustomEntry”),却又能查询到表中的数据了,但是查询语句是已经写死在了应用程序中的,如果要进行更改,就有很大的工作量, 这是一件很郁闷的事情.于是想从数据库层面上解决此问题

SQL SERVER 2005/2008 中关于架构的理解(转载)

在一次的实际工作中碰到以下情况, 在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询,提示“对象名'CustomEntry' 无 效.”.当带上了架构名称之后(如“cus.CustomEntry”),却又能查询到表中的数据了,但是查询语句是已经写死在了应用程序中的,如果要进 行更改,就有很大的工作量, 这是一件很郁闷的事情.于是想从数据库层面上解决此问题,在查询了大量的资料之后,对于SQL SERVER中的架构有所了 解,并解决以上问题. 下面来

SQL Server 2005/2008压缩数据库日志的方法

适用于SQL Server 2005的方法 1 Backup Log DNName WITH no_log 2 GO 3 DUMP TRANSACTION DNName WITH no_log 4 GO 5 USE DNName 6 DBCC SHRINKFILE (2) 7 GO 说明:由于SQL Server 2008对文件和日志管理进行了优化,所以以上语句在SQL2005中可以运行但在SQL2008中已经被取消. 适用于SQL Server 2008的方法 1 USE [master] 2

【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结

Sql server 7.0/2000下 SqlCacheDependency使用轮询的方式进行缓存失效检查, 虽然ms说对服务器压力不大, 但还是有一些的, 而且对于不常改动的混存内容无休止的轮询感觉有点浪费, 不很经济. Sql server 2005/2008下增加使用查询通知方式进行缓存失效检查, 它通过Sql Server内部的消息队列进行异步通知, 这样就大大减轻了服务器的压力, 实现的很经济, 下面就是具体的步骤: 1.检测是否已经启用Service Broker Select D

SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法

在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你. SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本文我们主要要介绍的内容,情况是这样的:我们在用SQL Server 2008 建完表后,插入或修改任意列时,提示:当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改. 如果强行更改会出现以下提示:不允许保存更改.您所做的更改要求删除并重新

SQL Server 2005,2008 正则表达式 替换函数应用详解

CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace varchar(1000), --替换值 @globalReplace bit = 1, --是否是全局替换 @ignoreCase bit = 0 --是否忽略大小写 ) returnS varchar(1000) AS begin declare @hr integer declare @objReg

解决SQL Server 2005数据库中datetime时间字段在前端显示时分秒的问题

SQL Server 2005中时间类型datetime的格式是"年月日时分秒",直接读出来该字段,为了不让它在前端显示"时分秒"若是显示在dataGridView中,可以修改控件的某一列格式,如: dataGridView1.Columns[10].DefaultCellStyle.Format = "yyyy-MM-dd"; 但是要在listview控件中的话,就有点困难了,貌似没有类似的属性,这样的话,考虑从数据源入手. 1.获取当前年月日

SQL Server 2005/2008备份数据库时提示“无法打开备份设备”

错误描述: 今天备份sqlserver 2008数据库时候,想要将备份文件放在f盘的根目录下,结果提示如下信息:备份对于服务器“服务器名”失败.(Microsoft.SqlServer.Smo)其他信息:System.Data.SqlClient.SqlError:无法打开备份设备'f:\abc.bak'.出现操作系统错误5(拒绝访问.).(Microsoft.SqlServer.Smo) 解决方法: 因为Sql Server 2005 可能存在一个小Bug,不能将备份文件放在根目录下,必须放在

Sql Server 2005/2008数据库被标记为“可疑”的解决办法

日常对Sql Server 2005关系数据库进行操作时,有时对数据库(如:Sharepoint网站配置数据库名Sharepoint_Config)进行些不正常操作如数据库在读写时而无故停止数据库,从而导致Sql Server 2005数据库不正常中断,当再次打开数据库时会发现某些数据库会被标记为"可疑"(suspect),即在数据库名旁加上了黄色的惊叹号,这时数据库就不能再被打开了,但数据库的结构及数据内容都还是存在的. 解决方法: 当数据库发生这种操作故障时,按如下操作步骤可解决此