AspDotNet

The leaves of the tree are so exuberant ,because the root of the tree is so deep.
posts - 11, comments - 0, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2010年10月20日

SQL 中的登陆,用户,角色

      原文:http://www.oeom.cn/sql-login-user-role

      登陆:SQL Server2005中,有两种创建登录的方式:一种是Windows验证登录;另一种是SQL Server身份验证方式。“登录方式”就好比办公楼上使用不同类型的锁,一旦选择了使用什么类型的锁,就可以开始为每位员工配发钥匙,而这个钥匙就是 “登录”。或称“登录名”,但员工只有进入大楼的权利,但却没有权限查看和使用里面的资源(比如档案柜)。如果是sysadmin或 securityadmin固定服务器角色的成员,则可以创建两种类型的登录之一:标准登录(比如前面比喻中的金属钥匙)和Windows登录(比如较新 型的电子出入卡)。

      用户:既然员工拥有了进入大楼的钥匙,就应该拥有适当的管理性访问权,他们需要通过访问其他资源来完成工作。例如,如果打算允许财务部访问账目文件,就需要给他们一把文件柜的钥匙。员工现在有两把钥匙:一把是打开大门的钥匙,一把是打开文件柜的钥匙。

      同样,一旦用户已登录到了SQL Server上,就需要允许用户访问数据库。为此,需要创建数据库用户账户,然后给这些用户账户授予权限。一旦这个过程结束,SQL Server用户就拥有了多把钥匙:一把打开大门的钥匙(登录),以及一把打开他们需要访问的每个文件柜(数据库)的钥匙。

     角色:会计需要签发公司支票,这个权限可以用两种方式之一来授予。第一,可以给每名会计分别提供一本从同一账户中支取的支票簿,并授予从该支票簿中开支票 的权限。在这种情况下,需要设法跟踪当月已经开出的全部支票,否则这种方法可能会造成可怕的后果。完成这项工作的最佳方法是让整个公司账户只使用一本支票 簿,并给所有会计授予从这本支票簿中开支票的一个组权限。

 

      在SQL Server中,当几个用户需要访问数据库的权限时,比较容易的方法是将所有的权限作为一个组授给他们,而不是设法分别管理每个用户。

      言归正传,先用存储过程实现以上操作:

 

–创建一个简单的登录,登录名为:newlogin;登录密码:123456;默认数据库:master,默认数据库也可以不指定。

EXEC sp_addlogin 'newlogin','123456','master'

–创建用户

–创建一个简单的用户,如果不指定用户名,则添加到当前数据库登录名中,如果不指定角色,则该用户默认属于public角色。下为添加newlogin登录名。

EXEC sp_adduser 'newlogin'

–创建一个带用户名的用户,用户可以与登录名相同(同上一种类似),也可以不同,但要设定当前登录名,用户角色可选,默认为public。下为将用户newuser添加到newlogin登录名中。

EXEC sp_adduser 'newlogin','newuser'

–创建角色

EXEC sp_addrole 'newrole'

–下为将用户下为将用户newuser添加到newlogin登录名中。并指定newrole角色。

EXEC sp_adduser 'newlogin','newuser','newrole'

–为角色newrole赋予jobs表的所有权限

GRANT ALL ON jobs TO newrole

–为角色newrole赋予sales表的查、改权限

GRANT SELECT,UPDATE ON sales TO newrole

–禁止角色newrole使用employees表的插入权限

DENY INSERT ON employees TO newrole

另一种创建用户和赋予角色的方式

–为登录newlogin在数据库中添加安全账户newuser

EXEC sp_grantdbaccess 'newlogin,'newuser'

–添加newuser为角色newrole的成员

EXEC sp_addrolemember 'newrole','newuser'

–数据库用户、角色、登录的删除操作

–删除当前数据库用户

EXEC sp_revokedbaccess 'newuser';

–删除数据库登录

EXEC sp_droplogin 'newlogin'

–删除数据库角色

EXEC sp_droprole 'newrole'

–从数据库角色(newrole)中删除用户(newuser)

EXEC sp_droprolemember 'newrole', 'newuser'

–用SQL代码新建登录、用户

–创建带密码的mylogin登录名,MUST_CHANGE 选项需要用户首次连接服务器时更改此密码。

CREATE LOGIN mylogin WITH PASSWORD = '123456' MUST_CHANGE;

–创建映射到凭据的登录名。

–以下示例将创建mylogin登录名。此登录名将映射到mycredential凭据。

CREATE LOGIN mylogin WITH PASSWORD = '123456',   CREDENTIAL = mycredential;

–从Windows 域帐户创建登录名

–如果从Windows 域帐户映射登录名,则登录名必须用方括号([ ]) 括起来。

CREATE LOGIN [jack\xiangzhao] FROM WINDOWS;

–如果指定用户名,则不使用默认登录名作为该数据库用户

CREATE USER myuser FOR LOGIN mylogin

–以下示例将创建用户myuser拥有的数据库角色myrole

CREATE ROLE myrole AUTHORIZATION myuser;

–以下示例将创建db_role固定数据库角色拥有的数据库角色myrole

CREATE ROLE myrole AUTHORIZATION db_role;

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


数据库所有者

dbo是具有在数据库中执行所有活动的暗示性权限的用户,将固定服务器角色 sysadmin 的任何成员都映射到每个数据库内称为 dbo 的一个特殊用户上。另外,由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。

如果用户 laone是固定服务器角色 sysadmin 的成员,并创建表 Table1,则表 Table属于 dbo,并以
dbo.Talble 而不是 laone.Table1 进行限定。相反,如果 laone不是固定服务器角色 sysadmin
的成员,而只是固定数据库角色 db_owner 的成员,并创建表 Table1,则 Table1属于 laone,并限定为
laone.Table1。

无法删除 dbo 用户,且此用户始终出现在每个数据库中。只有由 sysadmin 固定服务器角色成员(或 dbo
用户)创建的对象才属于 dbo。由任何其他也不是 syadmin 固定服务器角色成员的用户(包括 db_owner
固定数据库角色成员)创建的对象:属于创建该对象的用户,而不是 dbo,用创建该对象的用户名限定。

如何修改数据库的所有者

更改当前数据库的所有者。

语法
sp_changedbowner [ @loginame = ] 'login'
[ , [ @map = ] remap_alias_flag ]

参数
[@loginame =] 'login'


前数据库新所有者的登录 ID。login 为 sysname,没有默认值。login 必须是已存在的 SQL Server 登录或
Windows  用户。如果 login
通过当前数据库内的现有别名或用户安全帐户已拥有访问该数据库的权限,则不能成为该数据库的所有者。为了避免这种情况,应先除去当前数据库中的别名或用
户。

[@map =] remap_alias_flag

值为 true 或 false,表示旧数据库所有者
(dbo) 的现有别名是映射到当前数据库的新所有者还是要除去。remap_alias_flag 的数据类型为 varchar(5),默认值为
NULL,表示旧 dbo 的任何现有别名均映射到当前数据库的新所有者。false 表示除去旧数据库所有者的现有别名。

返回代码值
0(成功)或 1(失败)

注释
执行 sp_changedbowner 之后,新所有者称为数据库中的 dbo 用户。dbo 拥有执行数据库中所有活动的暗示性权限。

不能更改 master、model 或 tempdb 系统数据库的所有者。

若要显示有效 login 值的列表,请执行 sp_helplogins 存储过程。

执行只有 login 参数的 sp_changedbowner 会将数据库所有权改为 login,并将先前别名为 dbo 的用户别名映射到新数据库所有者。

权限
只有 sysadmin 固定服务器角色的成员可以执行 sp_changedbowner。

示例
下面的示例使用户 Albert 成为当前数据库的所有者,并将旧数据库所有者的现有别名映射到 Albert。

EXEC sp_changedbowner 'Albert'

posted @ 2010-10-20 16:14 Apple Yang 阅读(447) 评论(0) 编辑

2010年5月26日

摘要: C# Excel操作类转自http://www.cnblogs.com/ztmdsbt/archive/2010/01/12/Ztmdsbt.html经常碰到需要操作Excel的情况,特别是涉及到DataTable和GridView之类东东的时候,导入导出Excel,并定制样式,调整字段等等的操作就成了家常便饭.[代码]阅读全文

posted @ 2010-05-26 09:54 Apple Yang 阅读(89) 评论(0) 编辑

2010年5月25日

应用程序经常需要与Excel进行数据交互,在上一篇文章ADO.NET 如何读取 Excel (上)阐述了基于ADO.NET 读取Excel的基本方法与技巧。今天这里要介绍是如何动态的读取Excel数据,这里的动态指的是事先不知道Excel文件的是什么样的结构,或者无法预测,比如一张.xls文件有多少张sheet,而且每张sheet的结构可能都不一样等等。
其实我们可以通过获取Excel的“架构信息”来动态的构造查询语句。这里的“架构信息”与数据库领域的“数据库架构信息”意义相同(也称“元数据”),对于整个数据库,这些“元数据”通常包括数据库或可通过数据库中的数据源、表和视图得到的目录以及所存在的约束等;而对于数据库中的表,架构信息包括主键、列和自动编号字段等。
ADO.NET 如何读取 Excel (上)提到

 


在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的
工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)
这里我们将Excel也当作一个“数据库”来对待,然后利用OleDbConnection.GetOleDbSchemaTable 方法
要获取所需的架构信息,该方法获取的架构信息与ANSI SQl-92是兼容的:

 

 


注意:对于那些不熟悉 OLE DB 架构行集的人而言,它们基本上是由 ANSI SQL-92 定义的数据库构造的标准化架构。
每个架构行集具有为指定构造提供定义元数据的一组列(称作 .NET 文档中的“限制列”)。这样,如果请求架构信息
(例如,列的架构信息或排序规则的架构信息),则您会明确知道可以得到哪种类型的数据。如果希望了解更多信息,
请访问 Appendix B:Schema Rowsets。
以下是读取Excel文件内“表”定义元数据,并显示出来的的程序片断:
Code
接着是一段利用“架构信息”动态读取Excel内部定义的表单或者命名区域的程序片断:

 

 

Code
这里我们就不需要对SELEC 语句进行“硬编码”,可以根据需要动态的构造FROM 字句的“表名”。

不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息:
Code

 

在ADO.nET 1.x 时候只有OleDb提供了GetOleDbSchemaTable 方法,而SqlClient或者OrcaleClient没有对应的方法,因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对于Sql Server:

Code
而在ADO.NET 2.0中每个xxxConnenction都实现了基类System.Data.Common.DbConnection的 GetSchemal 方法
来获取数据源的架构信息。

posted @ 2010-05-25 12:01 Apple Yang 阅读(120) 评论(0) 编辑

ADO.NET 如何读取 Excel (上)

作者: 晓风残月  来源: 博客园  发布时间: 2008-09-09 19:50  阅读: 5770 次  原文链接   字体: [收藏]  

经常需要在数据库与Execl之间互导数据。net时代,ADO.NET可以使用使用Microsoft.Jet.OleDb访问访问Excel,网上已经有很多类似的资源,最典型也是最简单的可能如下:(asp.net环境)

Code
// 连接字符串
string xlsPath = Server.MapPath("~/app_data/somefile.xls"); // 绝对物理路径
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Extended Properties=Excel 8.0;" +
"data source=" + xlsPath;
// 查询语句
string sql = "SELECT * FROM [Sheet1$]";

DataSet ds
= new DataSet();
OleDbDataAdapter da
= new OleDbDataAdapter(sql, connStr);
da.Fill(ds);
// 填充DataSet

// 在这里对DataSet中的数据进行操作

// 输出,绑定数据
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
很简单吧?!一切就像操作数据库一样,只是需要注意的是:
1。数据提供程序使用Jet,同时需要指定Extended Properties 关键字设置 Excel 特定的属性,不同版本的Excel对应不同的属性值:

用于 Extended Properties 值的有效 Excel 版本。
对于 Microsoft Excel
8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 Excel 8.0

对于 Microsoft Excel
5.07.0 (95) 工作簿,请使用 Excel 5.0

对于 Microsoft Excel
4.0 工作簿,请使用 Excel 4.0

对于 Microsoft Excel
3.0 工作簿,请使用 Excel 3.0
2。数据源路径使用物理绝对路径(同Access)

 

3。如何引用表名?


对 Excel 工作簿中表(或范围)的有效引用。
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:

select
* from [Sheet1$]
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如:

select
* from [Sheet1$A1:B10]
若要引用指定的范围,请使用该范围的名称。例如:

select
* from [MyNamedRange]
说明:
可以引用Excel 工作簿中的三种对象:
• 整张工作表:[Sheet1$]  ,Sheet1 就是工作表的名称
• 工作表上的命名单元格区域:[MyNamedRange] (不需要指定工作表,因为整个xls中命名区域只能唯一)
XLS命名方法:选中单元格范围》插入》名称》定义
• 工作表上的未命名单元格区域 :[Sheet1$A1:B10]
(在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)

 

 

注意:
•必须使用[](方括号),否将报:
FROM 子句语法错误
•必须跟$(美元符号),否则报:
Microsoft Jet 数据库引擎找不到对象'Sheet2'。请确定对象是否存在,并正确地写出它的名称和路径。
•如果工作表名称不对,或者不存在,将报:
'Sheet2$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。
•在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据   中提到可以使用
~  和 '(波浪线和单引号)代替[],使用ADO。NET测试没有成功,报:
FROM 子句语法错误
•当引用工作表明名([Sheet1$])时,数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,C 列开始,第3行,C列之前以及第1、2行全为空,则只会显示从第3行,C列开始的数据;以最后表最大范围内的非空单元结束;
•因此,如需要精确读取范围,应该使用命名区域 [NamedRange],或者指定地址:[Sheet1$A1:C10]

 

4。如何引用列名?
•根据默认连接字符串中,数据提供程序会将有效区域内的第一行作为列名,如果此行某单元格为空则用F1、F2表示,其中序数,跟单元格的位置一致,从1开始;
•如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO
默认值为:HDR=NO应该为 HDR=YES,即默认将第一行作为列名,竟然一直没有发现这个错误,汗upadted 2007年8月18日)格式如下:

Code
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Extended Properties=\"Excel 8.0;HDR=NO\";" +
"data source=" + xlsPath;
注意: Excel 8.0;HDR=NO  需要使用双引号(这里的反斜扛,是C#中的转义)

 

 

5。为什么有效单元格数据不显示出来?
出现这种情况的可能原因是,默认连接中,数据提供程序根据前面单元格推断后续单元个的数据类型。
可以通过 Extended Properties 中指定 IMEX=1

 


“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取

posted @ 2010-05-25 12:00 Apple Yang 阅读(224) 评论(0) 编辑

2010年3月26日

有时候会遇到这种情况,数据库查询返回多行记录,且每行记录由另外符合条件的多条记录内容合并,遇到这种情况,我们可以选择下面两种方式:

1.从数据库中先查询符合条件的记录,存放于一个DataTable中,在使用c#等开始遍历这张表,利用DataRow中的主键,再去读取相应的符合条件的多条记录,合并这些第二次读取到的记录内容,返回给前面的这个DataRow数据行。这样做没有错,但是如果数据量大,我们可能面临无数次的打开断开数据库链接,速度效率将会很低。

2.从数据库中一次读取数据到一张表中返回并显示到UI层。说起来谁都想这么做,但是以前太笨,没有去研究这个,今天因为数据量较大的原因,让我不得不想些其他办法来提高点效率。

Google~hk一下,果真有答案,然后依葫芦画瓢,自己写了一个

目的是获取不定量的符合条件的兼职记录,并将每个兼职参与项目情况记录到某几个字段当中,然后一次返回Table

 

代码
Create function Fn_GetJobListByPID--创建自定义函数获取指定兼职参与的所有项目编号及项目数量
(
    
@ParttimerID int 
)
returns @t table(Jobs varchar(5000),ParttimerID int,TotalCount int)
as
begin
declare @sql varchar(5000),@TotalCount int
set @sql=''
set @TotalCount=0
select @sql=@sql+j.JobNo+'-'+j.JobWave+'  ',@TotalCount=@TotalCount+1
from ONJB_JobApplication a,ONJB_Jobs j
where a.ParttimerID=@ParttimerID
and a.Result='V'
and a.JobID=j.JobID
insert @t values(@sql,@ParttimerID,@TotalCount)
return 
end

 引用

 

代码
--...........................
--
做过项目
left join (select Jobs,ParttimerID,TotalCount From Fn_GetJobListByPID(@ParttimerID)) as j1
on p.ParttimerID=j1.ParttimerID
--在做项目
left join (select CurJobs,ParttimerID,CurCount From Fn_GetCurJobsByPID(@ParttimerID)) as j2
on p.ParttimerID=j2.ParttimerID
where p.ParttimerID=@ParttimerID

 

 

 

posted @ 2010-03-26 16:46 Apple Yang 阅读(632) 评论(0) 编辑

2009年5月21日

substring(replace(CONVERT(varchar(100), GETDATE(), 23),'-',''),3,6)

相当于 Select CONVERT(varchar(100), GETDATE(), 12)

常用的SQL 获取指定格式的时间

Select CONVERT(varchar(100), GETDATE(), 8): 16:07:10

Select CONVERT(varchar(100), GETDATE(), 24): 16:07:10

Select CONVERT(varchar(100), GETDATE(), 108): 16:09:12

Select CONVERT(varchar(100), GETDATE(), 12): 090521

Select CONVERT(varchar(100), GETDATE(), 23):2009-05-21

 

posted @ 2009-05-21 16:14 Apple Yang 阅读(189) 评论(0) 编辑

2008年11月27日

摘要: QQ群中遇到一位网友,提到这么一个问题:如何将下述记录集姓名 科目 分数张三 语文 30张三 数学 50张三 英语 70李四 语文 50李四 数学 80李四 英语 90 通过SQL查询转变成姓名 语文 数学 英语 张三 30 50 70李四 50 80 90 他人(三叶虫)提供的一个解决方案值得借鉴:select 姓名 as 姓名 , max(case 科目 when '语文' then 分数 e...阅读全文

posted @ 2008-11-27 22:04 Apple Yang 阅读(365) 评论(0) 编辑

2008年11月14日

摘要: 维护一个代理商管理系统,要嵌套查询,绕来绕去,最后差点晕了,突然想到SQL也有自定义函数,于是尝试着用自定义函数来解决困难。如下,先定义一个函数:[代码]调用这个函数的方法,dbo.CheckEvaluateStatus(c.SprID+c.ContractID). 见以下存储过程:[代码]阅读全文

posted @ 2008-11-14 20:41 Apple Yang 阅读(99) 评论(0) 编辑

摘要: 最近维护一个系统,在一个存储过程中涉及到对多个数据库的操作,然后遇到这么一个错误‘equal to 操作的排序规则冲突’,费了好大劲才把他弄好,原来还真是不同表中字段的排序规则不同造成的。解决方法就是在字段后面加上 COLLATE +排序规则(比如COLLATE Chinese_PRC_CI_AS),以使涉及到的不同表的字段排序规则一致。贴上一段SQL脚本,以备今后参考。[...阅读全文

posted @ 2008-11-14 12:04 Apple Yang 阅读(73) 评论(0) 编辑

2008年10月23日

摘要: 做报表时经常要对数据的显示进行调整,而且老板的要求经常会很古怪。先前一直用C# 做,现在用下vb,很久没有接触,都不怎么熟悉了下面代码因为赶时间,有空稍微注释一下[代码]阅读全文

posted @ 2008-10-23 14:26 Apple Yang 阅读(187) 评论(0) 编辑