在SQL Server中添加供应用程序使用的帐号

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

    对于应用程序来说,最小的权限通常就是就是给予读权限,写权限和执行存储过程权限。由于为了防止SQL注入导致的数据库信息泄漏,则还需要考虑拒绝帐号的查看定义权限,但值得注意的是,如果拒绝了查看定义的权限,则Bulk Insert会失败。完整的权限定义如下:

ALTER ROLE [db_datareader] ADD MEMBER 用户名
ALTER ROLE [db_datawriter] ADD MEMBER 用户名
grant execute to 用户名
deny view definition to 用户名

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

--创建用户的存储过程, 

--示例EXEC sp_CreateUser ‘UserName‘,‘rw‘,‘DatabaseName‘
--EXEC sp_CreateUser ‘tesefx‘,‘r‘,‘Test‘,‘0xE39CA97EBE03BB4CA5FF78E50374EEBB‘ 

CREATE PROC sp_CreateUser
@loginName VARCHAR(50) ,
@IsWrite VarCHAR(3) ,
@DatabaseName VARCHAR(50),
@Sid VARCHAR(100) =‘1‘
AS
PRINT(‘示例:EXEC sp_CreateUser ‘‘UserName‘‘,‘‘rw‘‘,‘‘DatabaseName‘‘‘)
PRINT(‘示例:EXEC sp_CreateUser ‘‘UserName‘‘,‘‘rwv‘‘,‘‘DatabaseName‘‘,‘‘0xE39CA97EBE03BB4CA5FF78E50374EEBB‘‘‘)
PRINT(‘r为只读权限,rw为读写权限,rwv为读写加View Definition权限‘) 

IF EXISTS ( SELECT name
FROM sys.syslogins
WHERE name = @loginName )
BEGIN
PRINT N‘登录名已存在,跳过创建登录名步骤‘
END
ELSE
BEGIN 

DECLARE @CreateLogin NVARCHAR(1000)
DECLARE @pwd VARCHAR(50)
PRINT @Sid
SET @pwd=NEWID()
IF(@sid=‘1‘)
BEGIN
SET @CreateLogin = ‘CREATE LOGIN [‘ + @loginName + ‘] WITH PASSWORD=N‘‘‘
+ @Pwd
+ ‘‘‘, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;‘
PRINT N‘登录名已创建,密码为:‘[email protected]
END
ELSE
BEGIN
SET @CreateLogin = ‘CREATE LOGIN [‘ + @loginName + ‘] WITH PASSWORD=N‘‘‘
+ @Pwd
+ ‘‘‘, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,sid=‘[email protected]+‘;‘
PRINT N‘已经使用SID创建登录名:‘[email protected] 

END
EXEC (@CreateLogin) 

--DECLARE @sidtemp NVARCHAR(50)
--SELECT @sidtemp=sid FROM sys.server_principals WHERE [email protected]
--PRINT(N‘登录名为:‘[email protected]+N‘ SID为: 0x‘+CONVERT(VARCHAR(50), @sidtemp, 2) )
END 

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

EXEC (@DynamicSQL) 

   该存储过程用于创建应用程序连接SQL Server所需的登录名,用户以及对应权限,当用户或登录名存在时还会跳过该步骤,使用该存储过程的示例如:

EXEC sp_CreateUser ‘UserName‘,‘rw‘,‘DatabaseNam‘
EXEC sp_CreateUser ‘tesefx‘,‘r‘,‘Test‘,‘0xE39CA97EBE03BB4CA5FF78E50374EEBB‘ 

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

 

    如果需要,可以将该存储过程按照自己的需要去修改。

时间: 2024-10-19 18:11:37

在SQL Server中添加供应用程序使用的帐号的相关文章

1 sql server中添加链接服务器

1  链接到另一个sql server 的实例 exec sp_addlinkedserver @server= '服务器的地址',@srvproduct='SQL Server' go 分布式查询中不支持xml数据类型的返回 2 sql server 连接到外部数据源 条件ole db提供程序是可以用的   当电子表格在excel中处于打开状态时,sql server不能执行访问excel表格的分布式查询 exec sp_addlinkedserver @server='Template', 

SQL Server 中添加表注释

今天在创建完表之后,发现没有办法给表添加注释说明,字段的注释可以在建表的时候就添加,上网查了一下使用SQL给表添加注释的方法,方法如下: -- 表加注释 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'注释内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'表名' --例如: EXEC sys.sp_

根据SQL Server中的数据向矢量图层中添加点对象

SQL Server中的数据已有坐标信息(LAT,LNG) 在FormLoad事件中从SQL里获取数据并存储在DataSet. //在顶部定义SqlConnection对象 // public static string conStr = "server=(local);database=DbName;uid=sa;pwd=123"; //public SqlConnection conn = new SqlConnection(conStr); conn.Open();//打开数据库

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

Sql Server中的标识列(自增长字段)

一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3.列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列. 由于以上特点,使得标识列在数据库的设计中得到广泛的使用. 二.标识列的组成创建一个标识列,通常要指定三个内容:1.类型(type)在SQL Server 2000中,标识列类型必须是数值类型,如下:de

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Server导入导出向导”中的数据源没有原来的丰富,缺少对DBF文件的支持. 1.右击数据库,选择“任务”>“导入数据”,打开“SQL Server导入和导出向导”对话框.2.在“数据源”中选择Microsoft OLE DB Provider for Visual FoxPro,单击“属性”按钮,打开“

SQL Server中关于跟踪(Trace)那点事

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用

SQL Server中的查询

      本博文简单介绍一下SQL Server中常用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCommand类的方法之一,执行查询,并返回查询所返回的结果集中的第一行第一列.        class Program { static void Main(string[] args) { string strCon = "Data Source=192.168.24.193;Initial Cat

在sql server中创建一个只读login

在SQL Server中创建一个Login,并为这个login授予只读的权限 --create Login Name create login [domain\login] from windows; --create --UserName Create User DWReadOnly for login [domain\login] --Grant readonly ALTER ROLE [db_datareader] add MEMBER DWReadOnly Appendix 服务器角色参