摘要:Sql Server自带的系统存储过程有许多,但大部分我们是不常用的。我在实践中根据自己的体会,总结整理了一些比较常用的,加上一些实例介绍给大家。本期介绍:
l sp_attach_db
l sp_attach_single_file_db
l sp_changedbowner
l sp_changeobjectowner
l sp_column_privileges
1.1. sp_attach_db
将数据库附加到服务器。
语法
sp_attach_db [ @dbname = ]’dbname’, [ @filename1 = ]’filename_n’ [ ,...16 ]
参数
[@dbname =]’dbname’
要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。
[@filename1 =]’filename_n’
数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。
返回代码值
0(成功)或 1(失败)
结果集
无
注释
只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库执行 sp_attach_db。如果必须指定多于 16 个文件,请使用带有 FOR ATTACH 子句的 CREATE DATABASE。
如果将数据库附加到的服务器不是该数据库从中分离的服务器,并且启用了分离的数据库以进行复制,则应该运行 sp_removedbreplication 从数据库删除复制。
权限
只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。
实例
如何从一台电脑上把SQL server数据库test拷贝到另外一台SQL server电脑上使用?
1. 先拷贝数据库test的两个文件,如:
D:\Program Files\Microsoft SQL Server\MSSQL\data\test.MDF 和
D:\Program Files\Microsoft SQL Server\MSSQL\data\test.LDF
2. 再执行:
EXEC sp_attach_db @dbname = N'test',
@filename1 = N'D:\Program Files\Microsoft SQL Server\MSSQL\data\test.MDF',
@filename2 = N'D:\Program Files\Microsoft SQL Server\MSSQL\data\test.LDF'
1.2. sp_attach_single_file_db
将只有一个数据文件的数据库附加到当前服务器。
语法
sp_attach_single_file_db [ @dbname = ]’dbname’ , [ @physname = ]’physical_name’
参数
[@dbname =]’dbname’
要附加到服务器的数据库的名称。dbname 的数据类型为 sysname,默认值为 NULL。
[@physname =]’phsyical_name’
据库文件的物理名称,包括数路径。physical_name 的数据类型为 nvarchar(260),默认值为 NULL。
返回代码值
0(成功)或 1(失败)
结果集
无
注释
当使用 sp_attach_single_file_db 将数据库附加到服务器时,它创建一个新的日志文件并执行额外的清除工作,从新附加的数据库中删除复制。
仅对以前使用显式 sp_detach_db 操作从服务器分离的数据库执行 sp_attach_single_file_db。
权限
只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。
实例
我们也可以通过下列方法实现:如何从一台电脑上把SQL server数据库test拷贝到另外一台SQL server电脑上使用。
1. 只拷贝数据库test的一个文件,如:
D:\Program Files\Microsoft SQL Server\MSSQL\data\test.MDF
2. 再执行:
EXEC sp_attach_single_file_db @dbname = N'test',
@physname = N'D:\Program Files\Microsoft SQL Server\MSSQL\data\test.MDF'
1.3. sp_changedbowner
更改当前数据库的所有者。
语法
sp_changedbowner [ @loginame = ]’login’ [ , [ @map = ] remap_alias_flag ]
参数
[@loginame =]’login’
当前数据库新所有者的登录 ID。login 的数据类型为 sysname,没有默认值。login 必须是已存在的 Microsoft?? SQL Server?? 登录或 Microsoft Windows NT?? 用户。如果 login 通过当前数据库内的现有别名或用户安全帐户已拥有访问该数据库的权限,则不能成为该数据库的所有者。为了避免这种情况,应先除去当前数据库中的别名或用户。
[@map =] remap_alias_flag
值为 true 或 false,表示旧数据库所有者 (dbo) 的现有别名是映射到当前数据库的新所有者还是要除去。remap_alias_flag 的数据类型为 varchar(5),默认值为 NULL,表示旧 dbo 的任何现有别名均映射到当前数据库的新所有者。false 表示除去旧数据库所有者的现有别名。
返回代码值
0(成功)或 1(失败)
注释
执行 sp_changedbowner 之后,新所有者称为数据库中的 dbo 用户。dbo 拥有执行数据库中所有活动的暗示性权限。
不能更改 master、model 或 tempdb 系统数据库的所有者。
若要显示有效 login 值的列表,请执行 sp_helplogins 存储过程。
执行只有 login 参数的 sp_changedbowner 会将数据库所有权改为 login,并将先前别名为 dbo 的用户别名映射到新数据库所有者。
权限
只有 sysadmin 固定服务器角色成员的成员或当前数据库的所有者才能执行 sp_changedbowner。
实例
当你不想让其他应用使用sa登陆SQL server的test数据库时,可以建立一个新的登陆名称如user01,然后将需要访问的数据库的所有者更改为user01即可。如:
Use test
go
Sp_changedbowner ’user01’
go
1.4. sp_changeobjectowner
更改当前数据库中对象的所有者。
语法
sp_changeobjectowner [ @objname = ]’object’ , [ @newowner = ]’owner’
参数
[@objname =]’object’
当前数据库中现有的表、视图或存储过程的名称。object 的数据类型为 nvarchar(517),没有默认值。object 可用现有对象所有者限定,格式为 existing_owner.object。
[@newowner =]’owner’
即将成为对象的新所有者的安全帐户的名称。owner 的数据类型为 sysname,没有默认值。owner 必须是当前数据库中有效的 Microsoft?? SQL Server?? 用户或角色或 Microsoft Windows NT?? 用户或组。指定 Windows NT 用户或组时,请指定 Windows NT 用户或组在数据库中已知的名称(用 sp_grantdbaccess 添加)。
返回代码值
0(成功)或 1(失败)
注释
对象所有者(或拥有对象的组或角色的成员)对对象有特殊的权限。对象所有者可以执行任何与对象有关的 Transact-SQL 语句(例如 INSERT、UPDATE、DELETE、SELECT 或 EXECUTE),也可以管理对象的权限。
如果拥有对象的安全帐户必须要除去,但同时要保留该对象,请使用 sp_changeobjectowner 更改对象所有者。该过程从对象中删除所有现有权限。在运行 sp_changeobjectowner 之后,需要重新应用要保留的任何权限。
由于这个原因,建议在运行 sp_changeobjectowner 之前,编写现有权限的脚本。一旦更改了对象的所有权,可能要使用该脚本重新应用权限。在运行该脚本之前需要在权限脚本中修改对象所有者。
可以使用 sp_changedbowner 更改数据库的所有者。
权限
只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色成员,或既是 db_ddladmin 固定数据库角色又是 db_securityadmin 固定数据库角色的成员,才能执行 sp_changeobjectowner。
实例
将表testtable的所有者修改为user02(假设已经存在),执行:
sp_changeobjectowner ’testtable’,’user02’
这样若以非user02登陆的连接,就不能直接看到testtable表中的数据了.但是若有读取权限可以使用user01前缀,如:
Select * from user01.testtable
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。