系统视图,系统表,系统存储过程的使用
Posted 每天进步多一点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统视图,系统表,系统存储过程的使用相关的知识,希望对你有一定的参考价值。
获取数据库中用户表信息
1、获取特定库中所有用户表信息
select * from sys.tables
select * from sys.objects where type=\'U\' --用户表
第二条语句中当type=\'S\'时是系统表
2、获取表的字段信息
select * from sys.columns where object_id=object_id(\'表名\')
select * from syscolumns where id=OBJECT_ID(\'表名\' )
3、获取当前库中表的字段及类型信息
(1)select \'字段名\'=a.name,
\'类型名\'=b.name,
\'字段长度\'=a.max_length,
\'参数顺序\'=a.column_id
from sys.columns a left join sys.types b
on a.user_type_id=b.user_type_id
where object_id=object_id(\'表名\')
syscolumns与sys.columns表用法类似。
获取索引或主键信息
1、 获取对象及对应的索引的信息
select \'对象名\'=A.name,
\'对象类型\'=a.type,
\'索引名\'=B.name,
\'索引类型\'=case b.type when 1 then \'聚集索引\'
when 2 then \'非聚集索引\'
when 3 then \'xml索引\'
else \'空间索引\' end,
\'主键否\'=case when b.is_primary_key=1 then \'主键\'
else \'\' end
FROM sys.objects A JOIN sys.indexes B ON A.object_id=B.object_id
WHERE A.type=\'U\' AND B.name IS NOT NULL order by a.name
2、 获取表的主键及对应的字段
(1)select \'表名\'=d.name ,\'主键名\'=a.name,\'字段名\'=c.name
from sys.indexes a join sys.index_columns b
on a.object_id=b.object_id and a.index_id=b.index_id
join sys.columns c on a.object_id=c.object_id and
c.column_id=b.column_id
join sys.objects d on d.object_id=c.object_id
where a.is_primary_key=1
(2)SELECT \'表名\'=OBJECT_NAME(b.parent_obj),
\'主键名\'=c.name,
\'字段名\'=a.name
FROM syscolumns a,sysobjects b,sysindexes c,sysindexkeys d
WHERE b.xtype = \'PK\' AND b.parent_obj = a.id AND c.id = a.id
AND b.name = c.name AND d.id = a.id
AND d.indid = c.indid AND a.colid = d.colid
(3)select \'所属架构\'=s.name ,
\'表名\'=t.name,
\'主键名\'=k.name ,
\'列名\'=c.name,
\'键列序数\'=ic.key_ordinal
from sys.key_constraints as k
join sys.tables as t
on t.object_id = k.parent_object_id
join sys.schemas as s
on s.schema_id = t.schema_id
join sys.index_columns as ic
on ic.object_id = t.object_id
and ic.index_id = k.unique_index_id
join sys.columns as c
on c.object_id = t.object_id
and c.column_id = ic.column_id where k.type = \'pk\';
(4)使用系统存储过程获取指定表的主键信息
EXEC sp_pkeys \'表名\' --表名只能是当前数据库下的单独表名不能带上架构名
3、 查询哪些表创建了主键
select \'表名\'=a.name from
(select name,object_id from sys.objects where type=\'u\') a
left join
sys.indexes b
on a.object_id=b.object_id and b.is_primary_key=1
where b.name is not null
注:查询哪些表没有创建主键,将where条件改成 is null 即可。
查找视图信息
1、 查看视图属性信息
exec sp_help \'视图名\'
2、 查看创建视图脚本
exec sp_helptext \'视图名\'
3、 查看当前数据库所有视图基本信息
select * from sys.views
select * from sys.objects where type=\'V\'
select * from INFORMATION_SCHEMA.VIEWS
4、 查看视图对应的字段及字段属性
select \'视图名\'=a.name,
\'列名\'=b.name,
\'字段类型\'=TYPE_NAME(b.system_type_id),
\'字段长度\'=b.max_length
from sys.views a join sys.columns b
on a.object_id=b.object_id order by a.name
5、 获取视图中的对象信息
exec sp_depends \'视图名\'
查看存储过程信息
1、基本信息
select * from sys.procedures
select * from sys.objects where type=\'P\'
2、查看存储过程创建文本
sp_helptext 存储过程名称
select text from syscomments where id=object_id (存储过程名称)
3、查看存储过程的参数信息
(1)select \'参数名称\' = name,
\'类型\' = type_name(xusertype),
\'长度\' = length,
\'参数顺序\' = colid
from syscolumns
where id=object_id(存储过程名称)
(2)select \'参数名称\' = name,
\'类型\' = type_name(system_type_id),
\'长度\' = max_length,
\'参数顺序\' =parameter_id
from sys.parameters
where object_id=object_id(存储过程名称)
返回当前环境中可查询的指定表或视图的列信息。
exec sp_columns 表名
select * from sys.columns where object_id=OBJECT_id(表名)
select * from sys.syscolumns where id=OBJECT_ID(表名)
select * from information_schema.columns where TABLE_NAME=表名
查询存储过程或函数的参数的详细信息
select * from sys.parameters where object_id=object_id(函数或存储过程名称)
获取所有数据库信息
1、获取数据库的基本信息
select name from sysdatabases order by name
2、获取某个数据库的文件信息
select * from [数据库名].[架构名].sysfiles
3、获取数据库磁盘使用情况
exec sp_spaceused
4、获取数据库中表的空间使用情况
IF OBJECT_ID(\'tempdb..#TB_TEMP_SPACE\') IS NOT NULL DROP TABLE #TB_TEMP_SPACE
GO
CREATE TABLE #TB_TEMP_SPACE(
NAME VARCHAR(500)
,ROWS INT
,RESERVED VARCHAR(50)
,DATA VARCHAR(50)
,INDEX_SIZE VARCHAR(50)
,UNUSED VARCHAR(50)
)
GO
SP_MSFOREACHTABLE \'INSERT INTO #TB_TEMP_SPACE exec sp_spaceused \'\'?\'\'\'
GO
SELECT *
FROM #TB_TEMP_SPACE
ORDER BY REPLACE(DATA,\'KB\',\'\')+0 DESC
获取触发器的相关信息
1、查看触发器定义及相关属性信息
(1)exec sp_help \'触发器名\'
(2)查看表中指定类型的触发器的属性信息
exec sp_helptrigger [\'表名\'][,[\'触发器类型\']]
--参数2可选,省略参数2时返回该表中所有类型的触发器属性
2、获取触发器的创建脚本
exec sp_helptext \'触发器名\'
3、查看表中禁用的触发器
select name from sys.triggers where parent_id=object_id(\'表名\') and is_disabled=1
注:is_disabled=0时为启用的触发器。
4、获取触发器的父类名,触发器名,触发器状态和触发器类型信息
select \'父类名\'=a.name,
\'对象类型\'=a.type,
\'触发器名\'=b.name,
\'触发器状态\'=case when b.is_disabled=1 then\'禁用\' else \'启用\'end,
\'触发器类型\'=case when b.is_instead_of_trigger=1 then \'instead of\' else \'after\' end
from sys.objects a join sys.triggers b on a.object_id=b.parent_id
注:查询单个表或视图的触发器信息加上a.object_id=object_id(表名)条件。
5、禁用和启用触发器命令
禁用:alter table表名disable trigger触发器名
启用:alter table表名enable trigger触发器名
注:禁用或启用多个触发器,触发器名之间用逗号隔开
禁用或启用表中全部触发器,将触发器名换成ALL。
6、指定第一个或最后一个触发的after触发器。
exec sp_settriggerorder \'触发器名\', \'执行顺序\', \'触发事件\'
查询触发触发器的对应事件
select * from sys.trigger_events where object_id=object_id(\'触发器名\')
7、重命名触发器
exec sp_rename 旧名,新名
使用到的存储过程解释说明:
sp_addlogin 新增登录账号存储过程
语法:sp_addlogin [ @loginame = ] \'login\' --登录名
[ , [ @passwd = ] \'password\' ] -–登录密码
[ , [ @defdb = ] \'database\' ] --默认数据库
[ , [ @deflanguage = ] \'language\' ] --默认语言
[ , [ @sid = ] sid ] --安全标识号
[ , [ @encryptopt= ] \'encryption_option\' ] –密码传输方式
sp_grantlogin 创建sql server 登录名
语法:sp_addlogin [ @loginame = ] \'login\' --登录名
sp_droplogin 删除登录帐号存储过程
语法:sp_droplogin [ @loginame = ] \'login\' --登录名
sp_grantdbaccess 将数据库用户添加到当前数据库
语法:sp_grantdbaccess [ @loginame = ] \'login\' --登录名
[ , [ @name_in_db = ] \'name_in_db\' [ OUTPUT ] ] --数据库用户名
sp_addrole 创建数据库角色
语法:sp_addrole [ @rolename = ] \'role\' –角色名
[ , [ @ownername = ] \'owner\' ] --角色所有者
sp_addrolemember 为角色添加成员
语法:sp_addrolemember [ @rolename = ] \'role\', --角色名
[ @membername = ] \'security_account\' --成员用户
sp_droprolemember 删除角色成员
sp_helprole [ [ @rolename = ] \'role\' ]
返回当前数据库中有关角色的信息
1、创建登录名
(1)exec sp_addlogin \'登录名\',\'密码\',\'默认数据库\'
(2)create login 登录名 with password=\'密码\',default_database=默认数据库
2、为指定登录名为创建指定数据库上的用户
use 指定数据库
(1)execute sp_grantdbaccess \'登录名\',\'用户\'
(2)create user 用户名 for login 登录名
3、授予用户拥有表的权限
grant 权限 on 对象 to 用户
4、添加数据库角色
execute sp_addrole \'角色名\'
create role 角色名 authorization 拥有新角色的数据库用户或角色
5、添加角色的成员
execute sp_addrolemember \'角色名\',\'用户名\'
6、设置角色拥有对象的权限
grant 权限 on 对象名 to 角色名
--=================================================================
创建用户并分配权限
--新增登录名
create login administor with password=\'123\',default_database=Mail
--新增用户
use Mail
create user admins for login administor
--为用户分配权限
grant select on A_Area to admins
--取消分配的权限
revoke select on A_Area to admins
--新增角色
create role ins
--为角色分配权限
grant select on A_MailZT to ins with grant option
--删除角色对表A_MailZT的查询权限
revoke select on a_mailzt to ins CASCADE
--添加角色ins成员admins
exec sp_addrolemember \'ins\',\'admins\'
--删除角色ins成员admins
exec sp_droprolemember \'ins\',\'admins\'
--删除角色
drop role ins --必须先删除角色中所有成员
--删除用户
drop user admins
--删除登录账户
drop login administor
--==================================================================
查看数据库关于权限的信息
--查询当前数据库角色信息
exec sp_helprole 角色名
--提供有关每个数据库中的登录及相关用户的信息
exec sp_helplogins 登录名
--报告有关当前数据库中数据库级主体的信息。
exec sp_helpuser 当前数据库用户或角色名
--返回有关当前数据库中某个角色的成员的信息
exec sp_helprolemember 角色名
--返回SQL Server 固定服务器角色的列表
exec sp_helpsrvrole 固定服务器角色名
sql数据库批量分配权限
declare @sql varchar(max)=\'\'
select @sql=@sql+\'grant insert on \'+ name + \' to admins \'+CHAR(10) from sysobjects where name like \'a_%\'
exec (@sql)
????如何创建windows用户登录????
备份和还原数据库
1、创建备份设备
sp_addumpdevice [ @devtype = ] \'device_type\' --备份设备类型
, [ @logicalname = ] \'logical_name\' --备份设备逻辑名称
, [ @physicalname = ] \'physical_name\' –物理名称
EXEC sp_addumpdevice \'disk\', \'mydiskdump\', \'d:\\dump1.bak\';
注:添加逻辑名为mydiskdump物理名为dump1.bak 的disk类型的备份设备
2、删除备份设备
sp_dropdevice [ @logicalname = ] \'device\' --备份设备逻辑名称
[ , [ @delfile = ] \'delfile\' ] --指定物理备份设备文件是否应删除
exec sp_dropdevice \'mydiskdump\',\'delfile\';
注:参数\'delfile\'不选时只将备份设备的逻辑名从数据库引擎中删除,并删除对应master..sysdevices表中的项。有参数时会同时删除对应的物理备份设备的文件。
3、 查询数据库引擎中备份设备的信息
select * from master..sysdevices
select * from sys.backup_devices
4、 备份数据库
backup database mail to disk=备份文件
backup database 数据库名 to 备份设备
5、 数据恢复
6、 数据库快照恢复
----------------------------------创建数据库DemoDB
create database DemoDB
on primary
(name=\'DemoDB_data\',filename=\'d:\\Demodb_log.mdf\',size=5MB,maxsize=10MB)
log on
(name=\'DemoDB_log\',filename=\'d:\\Demodb_log.ldf\',size=2MB,maxsize=10MB)
go
-------------------------------------在DemoDB创建数据表T1和T2
use DemoDB
create table T1(id int,name char(8),address char(13))
go
create table T2(id int,name char(8),address char(13))
go
---------------------------------------在DemoDB数据库的T1和T2插入数据
use DemoDB
Insert into T1 values(1,\'jacky\',\'suzhou\')
Insert into T1 values(2,\'Hellen\',\'shanghai\')
Insert into T2 values(1,\'Tom\',\'beijing\')
Insert into T2 values(2,\'Alice\',\'hangzhou\')
Go
--------------为DemoDB数据库创建数据库快照DemoDB_dbsnapshot_200510201600
create database DemoDB_dbsnapshot_200510201600
on
(name=\'DemoDB_data\',filename=\'d:\\DemoDB_dbsnapshot_201203091700.mdf\')
as snapshot of DemoDB
go
----------------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB_dbsnapshot_200510201600
select * from dbo.T1
select * from dbo.T2
go
use DemoDB --在数据库中查看表T1和T2
select * from dbo.T1
select * from dbo.T2
go
---------------------------------------------在数据库中修改T1和T2
use DemoDB
update T1
set name=\'Tony\' where id=1 --在DemoDB中更新数据
go
delete from T1 where id=2 --在DemoDB中删除数据
go
drop Table T2 --删除T2表
go
------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB_dbsnapshot_200510201600
select * from T1
select * from T2
go
use DemoDB
select * from T1
select * from T2
go
------------------使用数据库快照还原在DemoDB数据库的T1表误删除和更新的数据
update DemoDB.dbo.T1
set name=(select name from DemoDB_dbsnapshot_200510201600.dbo.T1 where id=1) where id=1
go
insert into DemoDB.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1 where id=2
go
----------------------------使用数据库快照还原在DemoDB数据库误删除的T2表
use DemoDB
--复制进剪贴板中的创建T2的语句
go
select *into DemoDB.dbo.T2 from DemoDB_dbsnapshot_200510201600.dbo.T2
go
------------------------------------在数据库快照和数据库中查询T1和T2表
use DemoDB
select * from T1
select * from T2
go
use DemoDB_dbsnapshot_200510201600
select * from T1
select * from T2
go
------------------------------------------
--注:如果需要周期创建快照,可以创建作业
------------------------------------------在DemoDB中更新数据
use DemoDB
update T1 set name=\'Funny\' where id=1
go
-----------------------------------------数据库快照和数据库中查询T1和T2表
select * from Demodb.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T2
----------------------------------------在DemoDB中更新数据
use DemoDB
update T1 set name=\'Bob\' where id=1
go
----------------------------------数据库快照和数据库中查询T1和T2表
select * from Demodb.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T2
-----------------------------------------------
/*使用数据库快照还原整个数据库*/
-------------------------------------------使用数据库快照恢复DemoDB数据库
use master
restore Database DemoDB from Database_snapshot=\'DemoDB_dbsnapshot_200510201600\'
-------------------------------------------
select * from DemoDB.dbo.T1
select * from DemoDB_dbsnapshot_200510201600.dbo.T1
-------------------------------------------
use master
drop database DemoDB_dbsnapshot_200510201600 --删除数据库快照
drop Database DemoDB --删除数据库
以上是关于系统视图,系统表,系统存储过程的使用的主要内容,如果未能解决你的问题,请参考以下文章