SQL Server的结构与Oracle不同,SQL Server里边可以包括很多的database,每个database有自己的表,用户等信息。比如目前有一个应用,应用的每个数据集都是一个database,致使在SQL Server中有多达1000+的database。

我们可以通过以下语句查看SQL Server中的所有数据库。

1 SELECT Name FROM Master..SysDatabases ORDER BY Name

SQL Server的用户也分为两种,一种是登录SQL Server的用户,一种是SQL Server中每个数据库中的用户。通常情况下,我们会将登录用户与数据库用户取同样的名字,然后通过用户映射赋予登录用户权限。

创建登录SQL Server用户语句如下:

1 --创建登录用户“dba”,密码为abcd1234@,默认数据库是mydb
2 create login dba with password='abcd1234@', default_database=mydb

创建数据库中的用户的语句如下:

1 --创建数据库用户“dba”,与登录用户同名
2 create user dba for login dba with default_schema=dbo

赋予数据库用户相应的权限

1 --通过加入数据库角色,赋予数据库用户“db_owner”权限
2 exec sp_addrolemember 'db_owner', 'dba'

其他相关语句可参考这边博文,点我。

在维护某系统时,需要根据数据库命名规则批量detach一些数据库,比如数据库名已R16开头的,通过以下SQL可以拼出sql语句,然后批量执行。

1 select 'EXEC  sp_detach_db ['+[name]+']'+CHAR(10) from master..sysdatabases where substring(name, 1,3) in ('E15','E16','R15','R16') ORDER BY Name

===============================================================================

下面说说我遇到的需求,一个SQL Server数据库有1000多个database。需要建一个用户,使这个用户对每个database具有只读权限,需要写脚本实现。无意中在互联网上发现了一篇博文。与我的需求完全一致,准备在测试环境里边实验一下。

也不是原创,直接把代码贴过来吧。

 1 Use master
 2 GO
 3
 4 DECLARE @dbname VARCHAR(50)
 5 DECLARE @statement NVARCHAR(max)
 6
 7 DECLARE db_cursor CURSOR
 8 LOCAL FAST_FORWARD
 9 FOR
10 SELECT name
11 FROM MASTER.dbo.sysdatabases
12 WHERE name NOT IN ('master','model','msdb','tempdb','distribution')
13 OPEN db_cursor
14 FETCH NEXT FROM db_cursor INTO @dbname
15 WHILE @@FETCH_STATUS = 0
16 BEGIN
17
18 SELECT @statement = 'use '+@dbname +';'+ 'CREATE USER [TipsDemoUser]
19 FOR LOGIN [TipsDemoUser]; EXEC sp_addrolemember N''db_datareader'',
20 [TipsDemoUser];EXEC sp_addrolemember N''db_datawriter'', [TipsDemoUser]'
21
22 exec sp_executesql @statement
23
24 FETCH NEXT FROM db_cursor INTO @dbname
25 END
26 CLOSE db_cursor
27 DEALLOCATE db_cursor 

这篇博文也可参考。

======================================================================

具体执行上述脚本遇到的问题:

1、拼的@statement这个sql中必须给@dbname两边加上"["和"]",要不然汇报语法错误,折腾了好久;

2、实际的数据库中可能有只读的库,执行到只读库的时候脚本就终止了,所以需要将只读的库剔除。

通过互联网,找到两种找到只读库的方法。一是通过databasepropertyex这个函数得到数据库的读写状态,具体说明见微软官方文档。

以下是我写的代码,将所有只读库放到一个中间表里边。但是最终也没有成功,主要是不能把动态SQL的结果传给一个变量,下面用的方法也是网上找到,但是没有成功。

 1 use master
 2 go
 3 declare @dbname_ro varchar(100)
 4 declare @statement_ro nvarchar(max)
 5 declare @states_ro nvarchar(20)
 6 declare db_cursor_ro cursor
 7 local fast_forward
 8 for
 9 SELECT name
10 FROM MASTER.dbo.sysdatabases
11 WHERE name NOT IN ('master','model','msdb','tempdb','distribution')
12 open db_cursor_ro
13 fetch next from db_cursor_ro into @dbname_ro
14 while @@fetch_status = 0
15 begin
16 select @statement_ro = 'select databasepropertyex(' + '''' + @dbname_ro + '''' + ',''updateability'')'
17 exec sp_executesql @statement_ro, N'@states_ro nvarchar(20) output', @states_ro output
18 if @states_ro = 'READ_ONLY'
19     insert into [ProgramUse].dbo.database_ro(db_names, db_state) values ('@dbname_ro', 'READ_ONLY')
20 fetch next from db_cursor_ro into @dbname_ro
21 end
22 close db_cursor_ro
23 deallocate db_cursor_ro

最后通过系统的一个视图可以方便的查找只读的数据库,sys.databases,其中is_read_only为1的就是只读状态的数据库。

最终完成为所有数据库建立一个只读用户的目的。最终代码如下:

 1 Use master
 2 GO
 3 DECLARE @dbname VARCHAR(100)
 4 DECLARE @statement NVARCHAR(max)
 5 DECLARE db_cursor CURSOR
 6 LOCAL FAST_FORWARD
 7 FOR
 8 SELECT name
 9 FROM MASTER.dbo.sysdatabases
10 WHERE name NOT IN ('master','model','msdb','tempdb','distribution','IED2008_JPEFEI_CT_JPY_EDM110') and name not in (select name from sys.databases where is_read_only = 1)
11 OPEN db_cursor
12 FETCH NEXT FROM db_cursor INTO @dbname
13 WHILE @@FETCH_STATUS = 0
14 BEGIN
15 SELECT @statement = 'use '+ '[' + @dbname + ']' + ';' + 'CREATE USER reapsro FOR LOGIN reapsro; EXEC sp_addrolemember ''db_datareader'',''reapsro'''
16 exec sp_executesql @statement
17 FETCH NEXT FROM db_cursor INTO @dbname
18 END
19 CLOSE db_cursor
20 DEALLOCATE db_cursor

转载于:https://www.cnblogs.com/xidabei/p/8359310.html

SQL Server初探相关推荐

  1. sql server 内存初探

    原文:sql server 内存初探 一. 前言 对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在 ...

  2. 引用:初探Sql Server 执行计划及Sql查询优化

    引用:初探Sql Server 执行计划及Sql查询优化 原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之-- ...

  3. 04.千淘万漉虽辛苦,吹尽黄沙始到金——SQL Server大数据群集初探

    04.千淘万漉虽辛苦,吹尽黄沙始到金--SQL Server大数据群集初探 [TOC] 上一篇终于创建好了群集,但是如何使用呢?首选需要理解SQL Server 2019 大数据群集的概念,从开始SQ ...

  4. SQL Server Integration Services 包的开发与部署初探

    说到数据库之间的数据同步,我们经常会结合的SQL Server 2000中的DTS和作业功能来实现按时.按条件的数据传输.但是SQL Server 2005 以后,不再支持SQL Server 200 ...

  5. SQL Server 2005 Service Broker 初探

    发布日期 : 11/4/2004| 更新日期 : 11/4/2004 Roger Wolter 适用于: Microsoft SQL Server 2005 Transact SQL (T-SQL) ...

  6. 初探SQL Server 2017 on Docker@macOS

    编者语:假期到了最后一天,或者你人在旅途,或者你睡了8天,而我在家修炼了几天,完成了一堆好玩的,慢慢和大家分享下. 9月27日SQL Server 2017 正式发布,看点一堆,而这次发布不仅有传统的 ...

  7. 初探SQL Server 2008商业智能

    这个是我在网上找到的一个比较全面的关于什么是SQL SERVER 2008 BI 方面的视频: http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV-HQ/BB26. ...

  8. SQL Server 2005 Service Broker 初探 [摘抄]

    <!----> <!--Content type: DocStudio. Transform: devdiv2mtps.xslt.--> 发布日期 : 11/4/2004| 更 ...

  9. Microsoft SQL Server Reporting Services 初探

    1.安装 SQL Server Reporting Services (SQLServerReportingServices.exe) 下载: Microsoft SQL Server 2017 Re ...

最新文章

  1. android RefBase、sp、wp
  2. CentOS\fedora使用yum update更新时不升级内核的方法
  3. SAP配置webdynpro完全手册
  4. ubuntu修改mongodb的数据库储存位置
  5. (四)JS基础知识一(深入分析变量类型和计算)【不会变量,别说你会JS】
  6. 【JS 逆向百例】XHR 断点调试,Steam 登录逆向
  7. ausam3x 嵌入式linux,ATSAM3X8EA-AU - 微控制器, 32位, SAM3X系列, ARM 皮质-M3, 84nb
  8. 提取PCA变换后的图像的各主成分(matlab代码)
  9. html生成图片有色差,引起打印的产品和电脑图片有色差的原因有哪些?
  10. TFT工业串口屏方案
  11. matlab 叉乘变点乘,向量点乘和叉乘
  12. Edge浏览器无法登录Microsoft账户
  13. 思科ccna认证怎么样关于思科ccnaDLSW技术简述
  14. 上火了该如何是好 五招让你轻松消火
  15. oracle查表的更新时间,Oracle 查询倒叙查询所有表更新时间
  16. FTP上传文件提示550错误原因分析。
  17. 如何把两个文件合并成pdf文件?
  18. 多人同时编辑excel,只需一招就搞定
  19. ESL第七章 模型评估及选择 【期望】测试误差、模型偏差估计偏差、【平均】乐观、AIC、参数有效数、BIC、最小描述长度、VC/结构风险最小化、一标准误差准则/广义交叉验证、【留一】自助/.632估计
  20. information_schema.columns 学习

热门文章

  1. php 获取字符串长度 包含空格,php中常用的字符串长度函数strlen()与mb_strlen()实例解释...
  2. java Paths
  3. itertools chain
  4. jinja Import
  5. Python Pandas General functions(静态方法)
  6. Ubuntu 安装R/Rstudio
  7. 数据算法之二叉树查找(BinaryTreeL Search)的Java实现
  8. matlab输入excel高版本,『matlab读取excel指定列』excel中大量数据如何导入matlab当中?超过1000个数据无法一个一个输入...
  9. weblogic 替换默认错误页面_weblogic 部署后出现Error 404–Not Found
  10. Nutanix 以现代化 IT 基础架构推动医共体建设