我一直在向我的同事们讲述如何在SQL查询中使用参数,特别是在.NET应用程序中。 我甚至已经承诺给予他们免于SQL注入攻击。 但是我开始怀疑这是否属实。 是否有任何已知的SQL注入攻击将成功参数化查询? 你可以例如发送一个string,导致服务器上的缓冲区溢出? 当然还有其他一些考虑要确保一个Web应用程序是安全的(比如清理用户input和所有这些东西),但现在我正在考虑SQL注入。 我特别感兴趣的是对MsSQL 2005和2008的攻击,因为它们是我的主数据库,但是所有的数据库都很有趣。 编辑:澄清我的意思是参数和参数化查询。 通过使用参数我的意思是使用“variables”,而不是build立一个string的SQL查询。 所以不要这样做: SELECT * FROM Table WHERE Name = 'a name' 我们这样做: SELECT * FROM Table WHERE Name = @Name 然后在查询/命令对象上设置@Name参数的值。
SQL中单引号和双引号之间的区别是什么?
我知道sqlite在超大型的数据库文件中performance不佳,即使它们被支持(曾经有一个关于sqlite网站的评论,指出如果你需要大于1GB的文件大小,你可能要考虑使用企业rdbms。再也找不到了,可能与旧版本的sqlite有关)。 但是,为了我的目的,我想先了解一下在考虑其他解决scheme之前它究竟有多糟糕。 我正在谈论2 GB以上的千兆字节范围内的sqlite数据文件。 任何人有任何这方面的经验? 任何提示/想法?
我正在学习如何将实体关系图解释为SQL DDL语句,我对表示法的差异感到困惑。 考虑一个不相交的关系,如下图所示: 这可以表示为: 车辆,2WD和4WD表(2WD和4WD将指向车辆的PK); 要么 只有2WD和4WD表(和NO车辆表),这两个表将会复制车辆将具有的属性? 我认为这是写作关系的其他方式: 我正在寻找一个清楚的解释,关于你最终将为每个图表的差异。
例如,mysql引用表名称使用 SELECT * FROM `table_name`; 注意` 其他数据库是否使用不同的字符引用其表名
这个查询是否等价于一个LEFT OUTER连接? //assuming that I have a parameter named 'invoiceId' of type int from c in SupportCases let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId) where (invoiceId == 0 || invoice != null) select new { Id = c.Id , InvoiceId = invoice == null ? 0 : invoice.Id }
是否有可能为两个不同的集合中的文档生成相同的Mongo ObjectId? 我意识到这绝对不太可能,但这有可能吗? 没有太具体的问题,我要问的原因是,在我正在开发的一个应用程序中,我们展示了民选官员的公开档案,我们希望他们能够转换成我们网站的全面用户。 我们为用户和当选的官员单独collections,他们目前不是我们网站的成员。 还有各种其他文件,其中包含关于当选官员的各种数据,全部使用他们当选的官方ObjectId映射回该人。 创build帐户后,我们仍然突出显示与当选官员关联的数据,但现在他们也是用户集合的一部分,并具有相应的用户ObjectId,以将其configuration文件映射到与应用程序的交互。 几个月前,我们已经开始将我们的应用程序从MySql转换到Mongo,而在转换过程中,我们为这两种数据types存储了传统的MySql ID,而且现在我们也开始将选定的官方Mongo ObjectId存储在用户将文件映射回选出的官方数据。 我正在思索,只是指定新的用户ObjectId作为以前选定的官方ObjectId,使事情变得更简单,但要确保它不可能与任何现有的用户ObjectId发生冲突。 感谢您的洞察力。 编辑:发布这个问题后不久,我意识到我提出的解决scheme不是一个好主意。 最好保留我们现有的模式,并链接到用户文档中选出的官方“_id”。
这更多的是“为什么这样做”这个问题,而不是“我不知道该怎么做”这个问题。 所以关于拉你知道你要使用的相关logging的福音是使用:include因为你会得到一个连接,并避免了一大堆额外的查询: Post.all(:include => :comments) 但是,当您查看日志时,不会发生任何连接: Post Load (3.7ms) SELECT * FROM "posts" Comment Load (0.2ms) SELECT "comments.*" FROM "comments" WHERE ("comments".post_id IN (1,2,3,4)) ORDER BY created_at asc) 它正在采取一个捷径,因为它一次拉出所有的注释,但它仍然不是一个连接(这是所有的文件似乎说)。 我能得到一个连接的唯一方法是使用:joins而不是:include : Post.all(:joins => :comments) 日志显示: Post Load (6.0ms) SELECT "posts".* FROM "posts" INNER JOIN "comments" ON "posts".id = "comments".post_id 我错过了什么吗? 我有一个半打协会的应用程序,并在一个屏幕上显示所有的数据。 似乎有一个联合查询而不是6个人会更好。 我知道性能方面,并不总是更好的做一个连接,而不是单个的查询(事实上,如果你花时间去看,上面的两个单独的查询看起来比连接快),但毕竟文档我一直在阅读,我很惊讶地看到:include不按照广告。 也许Rails 是认识到性能问题,除了在某些情况下不join?
我记得听说Joel Spolsky在播客014中提到他几乎没有使用过外键(如果我没记错的话)。 不过,对我来说,避免整个数据库中的重复和后续数据完整性问题似乎非常重要。 人们为什么(为了避免与Stack Overflow原则一致的讨论)有一些坚实的理由? 编辑: “我还没有理由创build一个外键,所以这可能是我第一个真正build立一个外键的原因。
MySQL的MySQL手册涵盖了这一点。 通常我只是转储数据库并重新导入一个新的名字。 对于非常大的数据库,这不是一个选项。 显然RENAME {DATABASE | SCHEMA} db_name TO new_db_name; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 做坏事,只存在于less数几个版本中,总体上是一个坏主意 。 这需要与InnoDB协同工作,它存储的内容与MyISAM非常不同。