数据库相关知识点
- SQL, 对表的理解, 对表的主键, 外键的理解, 视图, 为什么要有视图, 视图有什么功能, 视图与表有什么区别
- 主键是唯一标识的一条记录,不能重复,不能为空.
- 表的外键是另一个表的主键,可以重复,可以为空
- 索引,字段没有重复值,可以有空值,可以有一个或者多个唯一索引.
视图- 是一个或者多个表按照条件组合成的结果集
- 对表用增删改查等SQL进行操作,对视图权用select操作
- 表是物理存在的,视频是虚拟的内存表
- 存储过程, 什么是存储过程
- 是一组完成特定功能的程序集,编译存放数据库中,用户指定名称和参数就可以执行,接受参数,返回单个或多个结果集
- 储存过程创建编译时存在Precedure Cache中,所以比SQL执行要快
- 储存过程存在服务器端,容易修改,而SQL存在客户端,修改后部署比较麻烦
- 如何通过Dataset更新数据
- 使用DataAdpater的批量更新,好处是不用写具体的sql脚本,尤其是做web服务这个优势非常吸引人。
- 使用DataAdpater的批量更新,好处是不用写具体的sql脚本,尤其是做web服务这个优势非常吸引人。
- sql server中Join有几种
- JOIN: 如果表中有至少一个匹配,则返回行 (也就是 inner join)
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
- JOIN: 如果表中有至少一个匹配,则返回行 (也就是 inner join)
- dataset强类型和弱类型的区别
- 弱类型 DataSet 和强类型 DataSet 在性能上肯定是有区别的,但这种区别非常细微,完全可以忽略不计,总的来说强类型 DataSet 应用起来简单,不容易出错
- 弱类型 DataSet 和强类型 DataSet 在性能上肯定是有区别的,但这种区别非常细微,完全可以忽略不计,总的来说强类型 DataSet 应用起来简单,不容易出错
- 事实
- 事务具有原子性,一致性,隔离性,持续性.
- 事实是应用程序一列表操作,所有操作必须成功完成,否则每个操作中所有的更改会被取消.
- 事务有两种结果,1.当所有操作全部执行,事务提交.2.如果其中一步失败,发生回滚操作.撤销所有的操作.(select, update,delete).
- 游标
- 定位结果集的行,通过判断全局变量@@Fetch_Status是否到最后不等于0表示到最后
-
触发器类型?区别?
事前触发器和事后触发器。事前触发器是在事件触发之前完成,而事后触发器是在事件完成之后触发。
语句级触发器和行级触发器。语句级触发器可以在语句执行完之前或者之后执行,而行级触发器发生在触发器所影响的每一行后触发。
-
聚集索引和非聚集索引?
聚集索引,索引的顺序就是物理存储顺序,而非聚集索引却没有这么规定。
- 什么是SQL 注入,如何防范。
欺骗服务器执行恶意的SQL命令。
第一:替换单引号,即把所有单独出现的单引号改成两个单引号
第二:删除用户输入内容中的所有连字符
⑵ 用存储过程来执行所有的查询
⑶ 限制表单或查询字符串输入的长度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。
⑸ 将用户登录名称、密码等数据加密保存。
⑹ 检查提取数据的查询所返回的记录数量。
如何防范SQL注入式攻击?
好在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。
⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,"SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'"显然会得到与"SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'"不同的结果。
第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如"SELECT * from Users WHERE login = 'mas' -- AND password =''"之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。
第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如 RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。
⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了"消毒"处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。 System.Web.Security.FormsAuthentication类有一个 HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。
⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理