现在的位置: 首页 > 综合 > 正文

系统视图,系统表,系统存储过程的使用

2019年06月01日 ⁄ 综合 ⁄ 共 10538字 ⁄ 字号 评论关闭


系统视图,系统表,系统存储过程的使用

获取数据库中用户表信息

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、获取当前库中表的字段及类型信息

1select
'
字段名'=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('
表名')

syscolumnssys.columns表用法类似。

 

获取索引或主键信息

  1. 获取对象及对应的索引的信息

    select
    '
    对象名'=A.name,

          
    '
    对象类型'=a.type,

          
    '
    索引名'=B.name,

          
    '
    索引类型'=case
    b.type
    when 1 then
    '
    聚集索引'

                     
    when2 then
    '
    非聚集索引'

                     
    when3 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. 获取表的主键及对应的字段

    1select
    '
    表名'=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

    2SELECT
    '
    表名'=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

    3select
    '
    所属架构'=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 execsp_spaceused ''?'''

GO

SELECT
*

FROM
#TB_TEMP_SPACE

ORDER
BY REPLACE(DATA,'KB','')+0
DESC

 

获取触发器的相关信息

1、查看触发器定义及相关属性信息

1exec 
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
旧名,新名

 

 

 

SQL语句创建登录名,数据库用户,数据库角色及分配权限

使用到的存储过程解释说明:

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
角色名

--返回SQLServer
固定服务器角色的列表

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表中的项。有参数时会同时删除对应的物理备份设备的文件。

  1. 查询数据库引擎中备份设备的信息

    select
    * from
    master
    ..sysdevices

    select
    * from
    sys
    .backup_devices

  2. 备份数据库

    backup
    database mail
    to
    disk=
    备份文件

    backup
    database
    数据库名
    to
    备份设备

  3. 数据恢复

     

数据库快照恢复

----------------------------------创建数据库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创建数据表T1T2

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数据库的T1T2插入数据

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

----------------------------------------在数据库快照和数据库中查询T1T2

use
DemoDB_dbsnapshot_200510201600

select
* from
dbo
.T1

select
* from
dbo
.T2

go

use
DemoDB  --
在数据库中查看表T1T2

select
* from
dbo
.T1

select
* from
dbo
.T2

go

---------------------------------------------在数据库中修改T1T2

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

------------------------------在数据库快照和数据库中查询T1T2

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

------------------------------------在数据库快照和数据库中查询T1T2

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

-----------------------------------------数据库快照和数据库中查询T1T2

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

----------------------------------数据库快照和数据库中查询T1T2

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        
--
删除数据库

 


转载自:http://wenku.baidu.com/link?url=2TnLqDON6Lv_xY9j800t98axR_wswnGCepl8SPeMaaDtaKSSJKFXaR4Z2M0DS3Fd1udxmKLEkN7zX5kC79tUr1l6BU4p5uho5a3KszdrdbK

【上篇】
【下篇】

抱歉!评论已关闭.