一、用户的设置与授权
SQL Server用户的设置与授权除了将不同的数据库开放给不同的用户以外,还有一个就是提供一个通道给其它程序访问,毕竟直接使用Windows身份验证有点不太专业。
在实验之前,我们先设置两个数据库,一个test还有一个是aaa。实现一个创建pc用户,仅授权它访问test的功能。
1、在创建用户之前,我们先要对SQL2005进行设置,否则其默认是不提供给任何用户访问的。
一个是对数据库实例的属性进行设置,如下图,在安全性中,设置服务器身份验证为“SQL Server和Windows身份验证模式”同时设置登录审核为“失败和成功的登录”
之后,我们在SQL数据库中进行如下的查询:
create login pc with password='admin', default_database=[test]; --登陆帐户名为:pc,登陆密码:admin,默认连接到的数据库:test --这时候,pc帐户就可以连接到SQL Server服务器上了。但是此时还不能 访问数据库中的对象 --严格的说,此时pc帐户默认是guest数据库用户身份,可以访问guest能够访问的数据库对象 create user pc for login pc with default_schema=[dbo]; --并指定数据库用户pc的默认schema是dbo。 --意味着用户pc在执行select * from t,实际上执行的是select * from dbo.t。 --所有查询补个dbo.前缀为了与低版本SQL Server导过来的表相同 use [test]; go exec sp_addrolemember 'db_owner', 'pc'; go --在test数据库中 --通过加入数据库角色,赋予数据库用户“db_owner”权限 --此时pc可以随意操作数据库test
而最后一条语句大家可能疑惑,为何要加一段go呢?这两个go还是不能省,毕竟它是用于确保use[test]和exec sp_addrolemember 'db_owner', 'pc';这两条语句不分裂,否则sp_addrolemember这个SQL保留的存储过程(这个概念也就是类似编程语言函数、过程、方法那些东东)是无法执行的,找不到你是指哪个数据库。
同时关于dbo是这样的:dbo是默认用户也是架构,dbo作为架构是为了更好的与2000兼容,这样2000中的代码移植到2005中就不会报错(dbo在2005中是默认的架构,创建表时,如不指定架构,则默认为属于dbo为个架构)。
以上的查询执行之后:
你可以很明显地发现在数据库中,多了pc用户,右击属性,可以发现其test被这个pc用户映射,且其身份就是db_owner数据库拥有者,意思就是想搞啥都行。
此时,还不能直接用这个pc登录SQL,因为,你还要如下图,打开开始菜单的配置工具中的“服务和连接的外围应用配置器”,开始本地连接与远程连接,设置为同时使用TCP/IP和named pipes。
设置完,还要如下图重启MSSQLSERVER与SQLEXPRESS两个服务。
如果你不这样设置,可能会出现,如下的错误:
已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233)
2、此时,你终于可以在登录的时候,在身份验证选择“SQL Server 身份验证”,登录名与密码就是你刚才在T-SQL语句中设置的密码。
3、用这个pc登录之后,默认就登录在数据库test中,如果你要使用use aaa;其它没有权限的数据库,则会出现如下的结果:
4、做完上述实验,如果不想要这个pc用户,可以在Windows身份验证中,按顺序执行以下两个查询,这两句也可以同时执行,执行之后pc就被删除了。
--删除数据库用户: drop user pc --删除 SQL Server登陆帐户: drop login pc
1、在安装SQL2005的时候,曾经设置过一个超级管理员sa用户,然而,在SQL Server并不能像其它数据库的root账号一样直接用来登录的。如果你要在SQL Server身份验证中使用sa来登录,必须做如下的设置:
如下图,首先要对sa的属性中的状态,设置其允许登录。
同时,需要在“常规”上将密码重打一次,同时关闭“强制实施密码策略”。
点击确定,如上,重启SQL服务,就可以使用SQL Server身份验证中使用这个sa用户登录。
三、查询一个数据库中有多少张表
1、在SQL如果要查询一个数据库中有多少张表,很简单,
首先你要明白利用:
SELECT * FROM sysobjects WHERE (xtype = 'U')
后面的条件xtype,是这样的:
xtype这个值还不一定等于U,还可以是下列对象类型中的一种,对sysobject理论上可以查询这个数据库的任何东西:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程
2、不过一般情况下,如果我们单纯查询有多少张表,查询所有表名,或者表的数量就可以了,一般使用如下的语句:
SELECT name FROM sysobjects WHERE (xtype = 'U') --查询这个数据库所有的表明 SELECT count(*) FROM sysobjects WHERE (xtype = 'U') --查询这个数据库表的数量