设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1416|回复: 0

sqlserver简便创建用户并授权

[复制链接]

16

主题

176

金钱

267

积分

入门用户

发表于 2019-8-13 15:19:39 | 显示全部楼层 |阅读模式

  很多研发人员程序连接SQL Server直接用的就是SA帐号。如果对数据库管理稍微严格一点的话,就不应该给应用程序这种权限,通常应用程序只需要进行增删改查,而很少有DDL操作,因此配置帐号时应该遵循“最小权限分配”的原则仅仅赋予所需的权限。

    对于应用程序来说,最小的权限通常就是就是给予读权限,写权限和执行存储过程权限。由于为了防止SQL注入导致的数据库信息泄漏,则还需要考虑拒绝帐号的查看定义权限,但值得注意的是,如果拒绝了查看定义的权限,则Bulk Insert会失败。完整的权限定义如下:
  1. ALTER ROLE [db_datareader] ADD MEMBER 用户名
  2. ALTER ROLE [db_datawriter] ADD MEMBER 用户名
  3. grant execute to 用户名
  4. deny view definition to 用户名
复制代码


  在SQL Server中,实例级别的是登录名,而数据库级别的才是用户名,登录名在创建完成后可映射到具体的库。因此找了一个完整的脚本,同时创建登录名,用户,以及赋予对应的权限,脚本如下:
  1. --创建用户的存储过程,

  2. --示例EXEC sp_CreateUser 'UserName','rw','DatabaseName'
  3. --EXEC sp_CreateUser 'tesefx','r','Test','0xE39CA97EBE03BB4CA5FF78E50374EEBB'

  4. CREATE PROC sp_CreateUser
  5. @loginName VARCHAR(50) ,
  6. @IsWrite VarCHAR(3) ,
  7. @DatabaseName VARCHAR(50),
  8. @Sid VARCHAR(100) ='1'
  9. AS
  10. PRINT('示例:EXEC sp_CreateUser ''UserName'',''rw'',''DatabaseName''')
  11. PRINT('示例:EXEC sp_CreateUser ''UserName'',''rwv'',''DatabaseName'',''0xE39CA97EBE03BB4CA5FF78E50374EEBB''')
  12. PRINT('r为只读权限,rw为读写权限,rwv为读写加View Definition权限')


  13. IF EXISTS ( SELECT name
  14. FROM sys.syslogins
  15. WHERE name = @loginName )
  16. BEGIN
  17. PRINT N'登录名已存在,跳过创建登录名步骤'
  18. END
  19. ELSE
  20. BEGIN

  21. DECLARE @CreateLogin NVARCHAR(1000)
  22. DECLARE @pwd VARCHAR(50)
  23. PRINT @Sid
  24. SET @pwd=NEWID()
  25. IF(@sid='1')
  26. BEGIN
  27. SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N'''
  28. + @Pwd
  29. + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;'
  30. PRINT N'登录名已创建,密码为:'+@pwd
  31. END
  32. ELSE
  33. BEGIN
  34. SET @CreateLogin = 'CREATE LOGIN [' + @loginName + '] WITH PASSWORD=N'''
  35. + @Pwd
  36. + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,sid='+@Sid+';'
  37. PRINT N'已经使用SID创建登录名:'+@loginName

  38. END
  39. EXEC (@CreateLogin)

  40. --DECLARE @sidtemp NVARCHAR(50)
  41. --SELECT @sidtemp=sid FROM sys.server_principals WHERE name=@loginName
  42. --PRINT(N'登录名为:'+@loginName+N' SID为: 0x'+CONVERT(VARCHAR(50), @sidtemp, 2) )
  43. END



  44. DECLARE @DynamicSQL NVARCHAR(1000)
  45. --切换数据库上下文
  46. SET @DynamicSQL = N'Use [' + @DatabaseName + ']; ' + 'IF EXISTS(SELECT name FROM sys.database_principals WHERE name='''+@loginName+''') Begin Print(''用户名已存在,跳过创建用户名的步骤'') end else begin CREATE USER ['
  47. + @loginName + '] FOR LOGIN ' + @loginName + ' end;IF ('''
  48. + @IsWrite
  49. + '''=''rw'' or '''
  50. + @IsWrite
  51. + '''=''rwv'') BEGIN ALTER ROLE [db_datareader] ADD MEMBER ' + @loginName
  52. + ';ALTER ROLE [db_datawriter] ADD MEMBER ' + @loginName
  53. + '; END ELSE BEGIN ALTER ROLE [db_datareader] ADD MEMBER '
  54. + @loginName + ';
  55. ALTER ROLE db_datawriter DROP MEMBER '
  56. + @loginName + '
  57. ;End;grant execute to ' + @loginName + ';
  58. if('''+@IsWrite+'''<>''rwv'') begin deny view definition to ' + @loginName + '; end else begin grant view definition to ' + @loginName + '; end'

  59. EXEC (@DynamicSQL)
复制代码


该存储过程用于创建应用程序连接SQL Server所需的登录名,用户以及对应权限,当用户或登录名存在时还会跳过该步骤,使用该存储过程的示例如:
  1. EXEC sp_CreateUser 'UserName','rw','DatabaseNam'
  2. EXEC sp_CreateUser 'tesefx','r','Test','0xE39CA97EBE03BB4CA5FF78E50374EEBB'
复制代码


上述执行的第一行是创建一个标准的帐号,账户名UserName,赋予对DatabaseNam的库的读写权限,并返回生成的GUID密码。第二个存储过程是使用第四个参数sid创建登录名,由于在AlwaysOn或镜像的环境中,两端登录名需要有相同的SID,因此提供了在该情况下使用SID创建登录名的办法。

如果需要,可以将该存储过程按照自己的需要去修改。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表