关键词:SqlServer面试题 DBA面试题 数据库面试题
本文地址:http://www.teecool.com/post/2007080405.html
内容正文:
使用视图控制用户对数据访问
问:我的Microsoft Access 2000应用程序由后端的SQL Server 2000数据库写入数据。为防止Access的用户看到SQL Server 2000表中的全部数据,我想使用一种只允许用户浏览授权数据行的视图。可以创建一种限制用户访问SQL Server数据的视图吗?
答:可以。如果每位用户以唯一的用户ID登录到Access,您就可以创建一种限制用户访问SQL Server数据的视图。以下的示例语句就可以创建这样一种视图:
Create VIEW v_data AS
Select <column_list>
FROM dbo.mytable AS a
INNER JOIN dbo.authtable AS b
ON (a.Pkey = b.DataKey
AND b.userid = suser_sname())
该视图按userid限制用户的访问权。它要求您保存一份与数据表(mytable)中特定主键相匹配的用户名的表(authtable)。如果您的情况相对比较简单——您无需管理多个用户的行访问权,则您可以将userid列插入到数据表中,如下列代码所示:
Create VIEW v_data AS
Select <column_list>
FROM dbo.mytable AS a
Where a.userid = suser_sname()
—Microsoft SQL Server 开发团队
--------------------------------------------------------------------------
检查端口号
问:我创建了一个使用TCP/IP网络图书馆的服务器别名。客户端服务器别名被配置为动态确定所使用的端口。怎样才能找出客户所使用的端口以便我设置自己的防火墙?
答:客户端用于联络SQL Server实例的端口与该实例用于监听客户端请求实例的端口是一样的。您有几种方法来确定正被使用的端口号。请记住,当服务器首次被安装时,SQL Server 动态地选择端口。以后每次服务器暂停工作和重新启动时使用的端口号都是一样的。动态端口分配是一次性的事件。
要查看正被SQL Server实例使用的端口号,可以选择以下的任何一种方法:
打开Server网络实用工具,点击启用的协议列表中TCP/IP条目的属性。
查看特定实例的错误日志。您会在错误日志中看到与下面相似的条目:
SQL Server listening on 127.0.0.1: 1362.
冒号后的四位数是SQL Server正用于监听IP地址的端口,冒号左边是详细的信息。
查看注册表。根据您安装和升级SQL Server的方式,具体的注册表子键会有所不同,但您会看到和下面相似的键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
InstanceName\MSSQLServer\SuperSocketNetLib\Tcp\
InstanceName是您正在使用的SQL Server实例的名称(对于默认实例,InstanceName为MSSQLServer)。该键有一个名为TcpPort的条目,其中包含了正在被使用的端口号。
您需要这个端口号来设置客户端和服务器之间的防火墙。客户端向SQL Server的UDP 1434端口发送特殊的请求,以确定使用哪一个端口。SQL Server返回可用的服务器实例的列表,以及每个实例正在使用的端口。如果屏蔽了UDP 1434端口,则通过防火墙与SQL Server实例的连接将无法实现。
--------------------------------------------------------------------------
如何识别真实和自动创建的索引?
问:我发现sysindexes索引表中的很多条目并不是我自己创建的。听说它们并不是真正的索引,而是SQL Server查询优化器自动创建的统计。怎样才能识别哪些是真正的索引,哪些是SQL Server自动创建的统计呢?
答:按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计。然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案。分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys。
您还可以使用INDEXPROPERTY()函数的IsAutoStatistics属性来区分一个索引是真正的还是自动创建的统计,让SQL Server优化器选择需要创建的统计。您还可以为您管理的数据库启用“自动创建统计表”选项。
很多人忽略了下面的明显的结论。自动创建统计的存在意味着某个真正的索引可能会从中受益。请考虑下列代码的输出:
USE tempdb
GO
IF OBJECTPROPERTY(OBJECT_ID('dbo.orders'), 'IsUserTable')=1
Drop TABLE dbo.orders
GO
Select * INTO tempdb..orders FROM northwind..orders
GO
Select * FROM tempdb..orders Where orderid = 10248
GO
Select * FROM tempdb..sysindexes Where id = object_id('orders')
AND name LIKE
'_wa_sys%'
GO
该代码在tempdb中复制Northwind orders表,选择一行,然后检查SQL Server是否添加了一个统计。很显然,该表没有OrderId列的索引,所以SQL Server自动创建了名为_WA_Sys_OrderID_58D1301D 的统计。OrderId列统计表的存在表明Northwind orders表将得益于附加的索引。
以下查询显示了为数据库中每个用户表自动创建的统计的数量,该数据库至少有一个自动创建的统计。
Select
object_name(id) TableName
,count(*) NumberOfAutoStats
FROM
sysindexes
Where
OBJECTPROPERTY(id, N'IsUserTable') = 1
AND INDEXPROPERTY ( id , name , 'IsAutoStatistics' ) = 1
GROUP BY
object_name(id)
orDER BY
count(*) DESC
并不是所有的统计都可被真正的索引所替代。在某些情况下,SQL Server会为一个表自动创建超过50个统计。很明显,这些表的索引策略很差劲。对表及自动创建的与之相关联的统计的快速记数可以帮助您确定哪些表需要索引。
—Microsoft SQL Server开发团队
SqlServer面试题(实际应用四)一文有面试题库网收集自互联网,并非本站原创,如原作者发现SqlServer面试题(实际应用四)一文,请及时告知本站,本站会作出相关处理,谢谢!!!(联系方式:百度空间留言)