<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>database &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/database/</link>
	<description>Feed of posts on WordPress.com tagged "database"</description>
	<pubDate>Mon, 07 Jul 2008 14:01:15 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Designing a Database ER Model with Dia]]></title>
<link>http://vailo.wordpress.com/?p=85</link>
<pubDate>Mon, 07 Jul 2008 07:35:28 +0000</pubDate>
<dc:creator>vailo</dc:creator>
<guid>http://vailo.wordpress.com/?p=85</guid>
<description><![CDATA[When it comes to web development many people seem to forget one important thing. They all start with]]></description>
<content:encoded><![CDATA[<p>When it comes to web development many people seem to forget one important thing. They all start with designing the graphics and page layouts and making sure the code follows every standard and conventions there is, but sadly that's it. Many don't think of database design as a important piece in the development. When you work on your code and you are connected to a MySQL database, how many times have you been forced to edit the database schema? If you answer is: many times. Boy, we have some work to do. The problem with designing a database might not occur when you are working alone or in pair but as soon as you start out with a three member team or larger a database design is highly recommended.</p>
<p><!--more--></p>
<p>What do I mean with designing a database? First of all we need to figure out what makes a database. If we take a look at a database, any database, we can easily divide it into three layers:</p>
<ul>
<li>The conceptual layer</li>
<li>The implementation layer</li>
<li>The physical layer</li>
</ul>
<p>The conceptual layer is where we design. This is where we design the database schema with the tables, constraints and relationships. The design we create here can be transferred to any database because it's not connected to a specific database type. The conceptual layer is an <em>easy to understand explanations of the database</em>. This is where we are going to look deeper today.</p>
<p>The implementation layer is where we actually implement our conceptual database schema.  This is where you choose which type of database we want to work with, for example a relational database such as MySQL. Since the conceptual layer is just an explanation of a database of any type we can use the conceptual design in many different implementation layers.</p>
<p>Lastly the physical layer. This is where we actually store our database and data on the hard drive. Here we setup how we want to access files, index and more.</p>
<p>OK, we go back to the conceptual layer and we are going to introduce a program to use when we want to design a database conceptual schema. The program is called Dia and is available for free.</p>
<ul>
<li><a title="Download Dia for Windows" href="http://sourceforge.net/project/downloading.php?groupname=dia-installer&#38;filename=dia-setup-0.96.1-7.exe&#38;use_mirror=surfnet" target="_blank">Download Dia for Windows</a></li>
<li><a title="Download Dia for Linux" href="http://live.gnome.org/Dia" target="_blank">Download Dia for Linux</a></li>
</ul>
<p>If  you are totally new to the concept of relational database and have absolutely no clue about what I went through earlier I will try to explain a few things before start with designing a test database. When we design we will look upon three different types of objects.</p>
<ul>
<li>A relation is the same as a table, but we call it a relation. When we design we are looking for any type of real world object like a car, books or users. A relation is displayed as a rectangular.</li>
<li>A relationship is the constraint between two relations. A car must be owned by a user for example. A relationship is displayed as a diamond shape.</li>
<li>A attribute. A relation has attributes and as we might know it different fields. A user might have id, username, password and email attribute. These are connected to a relation via a thin line and the attribute itself is surrounded by a circle.</li>
</ul>
<p>So now we have three different objects we can use and it looks fairly easy now doesn't it? We basically have all the tools we need to create a conceptual design everyone can look at. As I mentioned the important thing about designing a database is that it's crucial not to change the database schema. Of course you might have to do it during development and in rare cases when the site is online but as a ground rule you shouldn't change the database schema due to the fact that many other applications and users might depend on it.</p>
<p>OK, when you have downloaded the Dia program, install it and run it. On startup two different windows will popup: a workbench and a menu box. In the menu box there is a drop down menu with the default value 'Diverse'. Click on that and on the second link from the bottom there is a little arrow pointing to the right, click on that and choose the 'ER'. This stands for Entity-Relationship module. Why do we say Entity-Relationship module when we just talked about Relation, Relationships and Attributes? A relation is sometimes also called a Entity. What we changed in the menu is that now the Dia program is in the ER mode. Under the drop down menu we just entered a few new icons have popped up.</p>
<ul>
<li>E inside of a rectangular: this is our relation/entity button</li>
<li>E inside of a double rectangular: this is also our relation/entity button but for weak entities.</li>
<li>R in a diamond: our relationship button</li>
<li>A in a circle: our attribute button</li>
</ul>
<p>Simple isn't it? Now we can start designing our conceptual database schema. We will start with a simple example. Lets say we want to save users in our database. Each user has a unique id, username, password, email and gender. How can we display this? We start with dragging out a Entity box. Double click on it to access the settings. Name it to 'User' and click apply. The entity is done. Now we should add the attributes. Click on the circle with the A inside. First we create the id attribute, make sure to check the 'key' option in the attribute settings panel. When you press apply the attribute will be underlined, this shows that the attribute is a key. Continue adding the username, password, email and gender attribute but don't apply the key option. Finally draw a line between each attribute and connect it to the entity box. I used the line tool and not the double lined button found under the Entity button. Make sure you don't use arrows, just a straight line. We should come up with something like this:</p>
[wp_caption id="attachment_127" align="alignnone" width="262" caption="Dia example 1"]<a href="http://vailo.files.wordpress.com/2008/07/dia_example1.png"><img class="size-medium wp-image-127" src="http://vailo.wordpress.com/files/2008/07/dia_example1.png?w=262" alt="Dia example 1" width="262" height="177" /></a>[/wp_caption]
<p>Next we add a new entity Car. It will have two attributes: a registration number and color. The registration number will be the unique attribute for a car and the color attribute can be multivalued. Even though the normalization rules tells us that multivalued fields in a database is wrong, we need to remember that we are working on the conceptual design. We do not think of terms like implementation or MySQL.</p>
<p>We add a new Entity and name it Car. We add the registration number attribute and add the 'key' option. For the color attribute we make it multivalued by simple adding that option key. The attribute will be boxed in by a double lined circle, this is telling us that the attribute is multivalued. We take our design one step further. Each User is able to own several cars but one Car can only be owned by one User. How do we display this? We use the Relationship object! Insert a Relationship object between our User and Car entity. Name it owns. Double click to access the settings panel in the left cordiality enter 'n' and in the right enter 1. Finally connect each Entity to the Relationship. It will look something like this:</p>
[wp_caption id="attachment_128" align="alignnone" width="300" caption="Dia example 2"]<a href="http://vailo.files.wordpress.com/2008/07/dia_example2.png"><img class="size-medium wp-image-128" src="http://vailo.wordpress.com/files/2008/07/dia_example2.png?w=300" alt="Dia example 2" width="300" height="109" /></a>[/wp_caption]
<p>Now we have done something really cool. We have created a design of a database with two entities and one relationship between them. It's easy to see the attributes of each entity and the relationships between them. Imaging a very big database, a design like this would certainly ease it up a bit!</p>
<p>This is only a short guide on how to use the ER model. All I wanted to do was to introduce the Dia program and how you can use it. You will find a useful article about the ER model at the link below. OK, that's it. A very short introduction on the ER-modelling and how you can use Dia to create it. Thanks for your time!</p>
<ul>
<li><a title="Wiki" href="http://en.wikipedia.org/wiki/Entity-relationship_model" target="_blank">Wikipedias description of the ER Modelling</a></li>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[SQLAuthority News - Thank You to Awarding Author SQL MVP]]></title>
<link>http://sqlauthority.wordpress.com/?p=674</link>
<pubDate>Mon, 07 Jul 2008 01:30:17 +0000</pubDate>
<dc:creator>pinaldave</dc:creator>
<guid>http://sqlauthority.wordpress.com/?p=674</guid>
<description><![CDATA[I received award from Microsoft for SQL Server Most Valuable Professional a week ago. I have receive]]></description>
<content:encoded><![CDATA[<p>I received award from Microsoft for <strong><a href="https://mvp.support.microsoft.com/default.aspx/profile/pinalkumar.dave" target="_blank">SQL Server Most Valuable Professional</a></strong> a <a href="http://blog.sqlauthority.com/2008/07/01/sqlauthority-news-microsoft-most-valuable-professional-award-for-sql-server-mvp/" target="_blank">week ago</a>. I have received many many congratulations messages from many readers for getting this award. I thank all of you for sending me messages and your wishes.</p>
<p>Honestly, I think this is all of yours award and I am just receiving this award for everybody who is reading and participating on this community forum. My goal is that more and more user participation occurs on this website and I publish few articles which are really contribution from readers.</p>
<p>If you are reading this blog and have any idea which you think can be helpful to other readers, please send it to me at my email address and I will publish article with your name on this blog. I will be happy to have readers contribution. If you want me to review book or speak in your conference please contat me as well at my email address.</p>
<p>Once again, Thank YOU, without all of success of this site is not possible.</p>
<p><strong>Pinal Dave (<a href="http://www.SQLAuthority.com" target="_blank">http://www.SQLAuthority.com</a>)</strong></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[The PHP Series Examples]]></title>
<link>http://vailo.wordpress.com/?p=88</link>
<pubDate>Sun, 06 Jul 2008 08:03:07 +0000</pubDate>
<dc:creator>vailo</dc:creator>
<guid>http://vailo.wordpress.com/?p=88</guid>
<description><![CDATA[Reading a description or tutorial is always interesting but it can be hard to understand everything ]]></description>
<content:encoded><![CDATA[<p>Reading a description or tutorial is always interesting but it can be hard to understand everything and all the features included. This post will use our 6 PHP classes we have created and look upon a few example on how they can interact with each other.</p>
<p>We will begin with a example between the Database and Paging class. We start by including the two classes in our default.php page using 'require'. We create objects of our classes and we simply start with a connection to our database and starts our paging.</p>
<p><!--more--></p>
<blockquote><p><code>$data = new Database('database', 'server', 'user', 'password');<br />
$paging = new Paging('SELECT * FROM person', 5, 'result' ,$data);</code></p></blockquote>
<p>This is what we need to do to instantiate our classes. Next up is to loop through the resultset the paging object gets. In this example we will use the public fetchObject() method in the Paging class.</p>
<blockquote><p><code>while($rs = $paging-&#62;fetchObject()):<br />
echo $rs-&#62;username . '&#60;br/&#62;';<br />
endwhile;</code></p></blockquote>
<p>To finish off this example we need to echo out the paging links.</p>
<blockquote><p><code>echo $paging-&#62;getLinks();</code></p></blockquote>
<p>Simple! We are done! To get the example working you need to make sure database, server, user and password are correct to access your MySQL database. The SQL string needs to be replaced by a real SQL string and lastly, the $rs-&#62;username must be change to a column name in your resultset.</p>
<ul>
<li><a title="Database and Paging class" href="http://www.dosspot.com/example1.rar" target="_blank">Download the Database and Paging example</a></li>
</ul>
<p>Next up a Database and Record class example. We start again by creating objects of our Database and Record class:</p>
<blockquote><p><code>$data = new Database('database', 'server', 'user', 'password');<br />
$record = new Record('person', 'id', $data);</code></p></blockquote>
<p>After that we go straight to save a new record in the person table. In the example I know that there are two fields in the person table: username and password. Since we didn't include fields in the instantiating of the Record class all fields in the person table is open to us.</p>
<blockquote><p><code>$record-&#62;username = 'Niklas';<br />
$record-&#62;password = 'test';</code></p></blockquote>
<p>And lastly we save the record using the save() method making a new record entry in the person table.</p>
<blockquote><p><code>$record-&#62;save();</code></p></blockquote>
<p>We continue with the example and this time we are going to try to find an entry using the find() method and update the password. We are going search for the latest inserted user. Since we just added a new user to the person table we will access that tuple and update the password value.</p>
<blockquote><p><code>$record = new Record('person', 'id', $data);<br />
$id = $data-&#62;fetchTuple('SELECT id FROM person ORDER BY id DESC');<br />
$record-&#62;find($id);</code></p></blockquote>
<p>We be sure we have a record to work with we echo out both the username and the password.</p>
<blockquote><p><code>echo $record-&#62;username;<br />
echo $record-&#62;password;</code></p></blockquote>
<p>The result will be 'Niklas' and 'test'. OK, now we want to update the password from 'test' to 'updated'. Lastly we save the record and echo out the password to see if the task is complete.</p>
<blockquote><p><code>$record-&#62;password = 'updated';<br />
$record-&#62;save();<br />
echo $record-&#62;password;</code></p></blockquote>
<p>The answer: 'updated'. Perfect! To be sure that the value is saved in the database you need to check the table using your MySQL Query Browser or simple create a new Record object and find the id we just updated. Now we have code for saving a new record and updating an existing one.</p>
<ul>
<li><a title="Database and Record class" href="http://www.dosspot.com/example2.rar" target="_blank">Download the Database and Record example</a></li>
</ul>
<p>We continue with another example between the Database and Forms class. We will first create a form from scratch and then try to auto generate one using the generate() method in the Forms class. The last task will be a bit hard to just download and get up and running smoothly since it's tightly integrated with my personal MySQL database. Anyway, you will see the idea on how to use the classes.</p>
<p>We start as we did before with creating objects from our classes:</p>
<blockquote><p><code>$data = new Database('database', 'server', 'user', 'password');<br />
$form = new Form('GET', 'example_database_forms.php');</code></p></blockquote>
<p>We use the same Database settings as before and the Form object will use 'GET' as the method and go to the example_database_forms.php page on submit. We will create two fields, a username field, password field and then include a submit button.</p>
<blockquote><p><code>$form-&#62;addField('username', 'text', array('required'=&#62;true, 'format'=&#62;'letter', 'value'=&#62;'Username', 'min'=&#62;3));<br />
$form-&#62;addField('password', 'password', array('required'=&#62;true, 'format'=&#62;'string', 'value'=&#62;'Password'));<br />
$form-&#62;addField('submit', 'submit', array('value'=&#62;'Submit'));<br />
echo $form-&#62;create();</code></p></blockquote>
<p>Both fields are required, we have set a format pattern, letter and string, and the Username field got a min validation rule. Both fields also got a default value and the labels are showing. We have more validation and styling rules to use on our Form:</p>
<ul>
<li>label: set the label for each field.</li>
<li>showLabel: true or false, decides if the field label should be visible or not.</li>
<li>boxClass: each field is surrounded by a div box, this sets the class of that box.</li>
<li>fieldClass: each field has a class, this sets the class of the field.</li>
<li>snippet: a code snippet which is placed at the very end of the field.</li>
</ul>
<p>To include one more validation rule you simply include a key =&#62; value into the last parameter, the array. This example requires not only the Database and Forms class to be included, the Common class is used by the Forms class and must be included too. We cannot forget about the validation JavaScript either so in the head we insert that.</p>
<p>Now we have created a small form from scratch and now we will auto-generate a form based on a MySQL table. To do this we need to provide a database object and a table name when we create our Forms object.</p>
<blockquote><p><code>$form = new Form('POST', 'example_database_forms.php', array('db'=&#62;$data, 'table'=&#62;'person'));</code></p></blockquote>
<p>The auto-generation of the form is simple. The next line does it all for us.</p>
<blockquote><p><code>$form-&#62;generate();</code></p></blockquote>
<p>Now we have the whole table as a form in our Form object. We can't see anything on the screen because we haven't created the HTML tags yet. In the example we are not using any default values and rules either. The next example is taken care of that. But, back to this example first. All we need to do now is to include a submit button and echo out the form.</p>
<blockquote><p><code>$form-&#62;addField('submit', 'submit', array('value'=&#62;'Submit'));<br />
echo $form-&#62;create();</code></p></blockquote>
<p>These four lines of code have generated a form from a table. You notice will notice a little * in the right corner of the labels, those are required. The generate() method takes care of a lot of cool things.</p>
<p>We stick to the Forms class example for a little while longer. Now we will try to fill an auto-generated Form with default value. Say we want to edit a user in our database. We will also say that each field requires to be longer than 3 chars. To complete this task there are a few things we must look at.</p>
<ol>
<li>First include the Record class so we will be able to get the user values.</li>
<li>Give the generate() method a parameter.</li>
</ol>
<p>So, we still start with including the Record class and then the instantiating of the objects:</p>
<blockquote><p><code>require'(lib/Record.php');<br />
$record = new Record('person', 'id',  $data);<br />
$form = new Form('POST', 'example_database_forms.php', array('db'=&#62;$data, 'table'=&#62;'person'));</code></p></blockquote>
<p>Next we need to fetch the values from a $record object. We start with a search to find the user we are looking for and then fetching the values from that user.</p>
<blockquote><p><code>$id = $data-&#62;fetchTuple('SELECT id FROM person ORDER BY id DESC');<br />
$record-&#62;find($id);<br />
$values = $record-&#62;getValues();</code></p></blockquote>
<p>OK, we search for the last inserted user id and used the find() method in the Record class and saved the values from that class into a local variable $values. All we have to do now is to include those values in the generate() method parameter. We also said that each field must be at least 3 chars long, this is also included in the generate() parameter.</p>
<blockquote><p><code>$form-&#62;generate(array('values'=&#62;$values, 'min'=&#62;3));</code></p></blockquote>
<p>Simple. Now if you look at your result, and everything is OK, you will see that your form has default values and when submitting is check so each field is longer that 3 chars. We end it all with adding a submit button and echo the form out.</p>
<blockquote><p><code>$form-&#62;addField('submit', 'submit', array('value'=&#62;'Submit'));<br />
echo $form-&#62;create();</code></p></blockquote>
[wp_caption id="attachment_124" align="aligncenter" width="300" caption="Database and Forms example"]<a href="http://vailo.files.wordpress.com/2008/07/example_df.png"><img class="size-medium wp-image-124" src="http://vailo.wordpress.com/files/2008/07/example_df.png?w=300" alt="Database and Forms example" width="300" height="245" /></a>[/wp_caption]
<ul>
<li><a title="Database and Form class" href="http://www.dosspot.com/example3.rar" target="_blank">Download the Database and Forms example</a></li>
</ul>
<p>The final example will be between the Database, Forms and Record classes again. We will take a look how you fast and easy can save a whole form using just a few lines. Our header will look like this:</p>
<blockquote><p><code>require('lib/Database.php');<br />
require('lib/Common.php');<br />
require('lib/Form.php');<br />
require('lib/Record.php');<br />
session_start();</code></p></blockquote>
<p>We have included everything we need and we start off by creating our Database object:</p>
<blockquote><p><code>$data = new Database('database', 'server', 'user', 'password');</code></p></blockquote>
<p>Nothing new there, the Database object has been the same throughout all these examples. Next we do a check if a $_GET['create'] has been provided. If it is, we are going to save the incoming information otherwise we echo out our form. Now, you shouldn't use 'GET' when you are posting things, especially not registration forms. This is just a example so we are able to see which information we are sending. Do NOT use 'GET' in real applications.</p>
<p>The Form object will not look that different from before. We have added a hidden field named 'create' to the form just so we can catch that in our if / else statement.</p>
<blockquote><p><code>if(isset($_GET['create'])) {<br />
$record = new Record('person', 'id', $data);<br />
$record-&#62;set($_GET);<br />
$record-&#62;save();<br />
echo 'User is saved!';<br />
} else {<br />
$form = new Form('GET', 'example_database_forms_record.php');<br />
$form-&#62;addField('username', 'text', array('required'=&#62;true, 'format'=&#62;'letter', 'min'=&#62;3));<br />
$form-&#62;addField('password', 'password', array('required'=&#62;true, 'format'=&#62;'string'));<br />
$form-&#62;addField('create', 'hidden', array('value'=&#62;true));<br />
$form-&#62;addField('submit', 'submit', array('value'=&#62;'Submit'));<br />
echo $form-&#62;create();<br />
}</code></p></blockquote>
[wp_caption id="attachment_125" align="aligncenter" width="300" caption="Database, Form and Record example"]<a href="http://vailo.files.wordpress.com/2008/07/example_dfr.png"><img class="size-medium wp-image-125" src="http://vailo.wordpress.com/files/2008/07/example_dfr.png?w=300" alt="Database, Form and Record example" width="300" height="264" /></a>[/wp_caption]
<p style="text-align:left;">So there you have it! A few examples on how to use the classes we have been working on! Everyone is available for download so you can check them out more carefully. Just remember to change the parameters so they will work in your machine and towards your MySQL database. Enjoy!</p>
<ul>
<li><a title="Database, Form and Record class" href="http://www.dosspot.com/example4.rar" target="_blank">Download the Database, Forms and Record example</a></li>
<li><a title="Download all examples" href="http://www.dosspot.com/examples.rar" target="_blank">Download all examples</a></li>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Download Oracle 9i (3 CD Set up)]]></title>
<link>http://tarunreflex.wordpress.com/?p=74</link>
<pubDate>Sun, 06 Jul 2008 07:49:28 +0000</pubDate>
<dc:creator>tarunreflex</dc:creator>
<guid>http://tarunreflex.wordpress.com/?p=74</guid>
<description><![CDATA[Oracle is a leading provide of database technology to support business intelligence. For any company]]></description>
<content:encoded><![CDATA[<p><a href="http://bp1.blogger.com/_xydmfm_YIdQ/SHBhAriJWTI/AAAAAAAAG0Y/BZLG-v2iphQ/s1600-h/oracle-9i-cake.jpg"><img style="float:left;cursor:pointer;margin:0 10px 10px 0;" src="http://bp1.blogger.com/_xydmfm_YIdQ/SHBhAriJWTI/AAAAAAAAG0Y/BZLG-v2iphQ/s320/oracle-9i-cake.jpg" border="0" alt="" /></a><span style="font-weight:bold;">Oracle is a leading provide of database technology to support business intelligence. For any company using their database to support business intelligence or data warehouse applications.</span></p>
<p>- Automated ETL Capabilities Simplifies the Construction and Development of Business Intelligence Solutions and Reduces Their Cost<br />
- Provides Limitless Scalability and Unmatched Performance and Availability For Business Intelligence Applications Without Costly Application or Data Reconfiguration<br />
- Integrated Business Intelligence Infrastructure Speeds Time to Market For Business Intelligence Applications, Optimizes Their Performance, and Simplifies Their Change<br />
- Expands The Role Of The Oracle Database To Become The Platform For Analytical Applications For The Internet.<br />
- Simplifies the Construction, Management, and Maintenance of High Availability Business Intelligence Applications<br />
- Delivers More Value Per Click Through Real-Time Mining and Recommendations For e-Business Customers<br />
- SQL Enhancements / New Features Streamline Business Intelligence Application Development By Facilitating Integration, Compatibility, and Portability With Popular RDBMS’s and Existing ETL Environments<br />
- Reduces Application Specific Security Development and Cost By Integrating Core Security Functionality Into the Database to Be Leveraged Across All Business Intelligence Applications<br />
- Provides Utilities and Wizards to Accelerate and Ease the Migration of Any Business Intelligence Application to Oracle 9i</p>
<p class="MsoNormal"><a href="http://rapidshare.com/files/18982695/cd_123.part01.rar">http://rapidshare.com/files/18982695/cd_123.part01.rar</a> <span> </span><span> </span><br />
<a href="http://rapidshare.com/files/18982699/cd_123.part02.rar">http://rapidshare.com/files/18982699/cd_123.part02.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982694/cd_123.part03.rar">http://rapidshare.com/files/18982694/cd_123.part03.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982702/cd_123.part04.rar">http://rapidshare.com/files/18982702/cd_123.part04.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982713/cd_123.part05.rar">http://rapidshare.com/files/18982713/cd_123.part05.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982709/cd_123.part06.rar">http://rapidshare.com/files/18982709/cd_123.part06.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982704/cd_123.part07.rar">http://rapidshare.com/files/18982704/cd_123.part07.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982716/cd_123.part08.rar">http://rapidshare.com/files/18982716/cd_123.part08.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982708/cd_123.part09.rar">http://rapidshare.com/files/18982708/cd_123.part09.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982711/cd_123.part10.rar">http://rapidshare.com/files/18982711/cd_123.part10.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982703/cd_123.part11.rar">http://rapidshare.com/files/18982703/cd_123.part11.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982718/cd_123.part12.rar">http://rapidshare.com/files/18982718/cd_123.part12.rar</a> <span> </span><br />
<a href="http://rapidshare.com/files/18982526/cd_123.part13.rar">http://rapidshare.com/files/18982526/cd_123.part13.rar</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Building your own Photo Archive]]></title>
<link>http://fauland.wordpress.com/?p=70</link>
<pubDate>Sat, 05 Jul 2008 18:51:39 +0000</pubDate>
<dc:creator>pfauland</dc:creator>
<guid>http://fauland.wordpress.com/?p=70</guid>
<description><![CDATA[
   Murphy&#8217;s Law &#8230; Or Why NOW is the right moment 

   
for buliding your own photo arch]]></description>
<content:encoded><![CDATA[<p><font size="+1"><br />
   <i><b>Murphy's Law ... Or Why <u>NOW</u> is the right moment </b></i><br />
</font><br />
   <br><img src="http://www.fauland-photography.com/newsletter/material/0708/dead_drive.jpg" width="240" height="180" border="1" align="right" hspace="30" vspace="20"><br><br />
<big><b>for buliding your own </big>photo archive.</b> </i><br />
<br>	<br></p>
<p align="justify">
	<big><b>When</big> did you</b> check the air pressure of your tires last time ? Be honest,   you don't even remember ! When did you visit the gas station last time ? Before<br />
	the car runs out of fuel of course.  Some things only come to our mind with a big bang when it's too late. And believe me, a flat tire is annoying but still something that<br />
	can get fixed and after an hour or two you are up and running again.<br />
	Now, think about your photo archive for a moment. Is it really safe ? <i>&#34;Of course, I have my important files ... mmmh ... Probably most of them on DVDs ...&#34;</i> I<br />
	don't want to scare anybody, but it's time to think about some changes. The possibility of loosing the photographs of the honey-moon trip to Hawaii, the first steps of the daughter, or<br />
	loosing a client - who will not recommend you any further - after you had to tell him, that the photographs you took for him are .... <b><i>somehow not available any more</i></b>.<br />
	<br><br><br />
	<big><b>As data storage</big> and archiving</b> is so essential for everybody maintaining a large photo archive, I will to go a bit more<br />
	into detail on the Hard- and Software side of the business.</p>
<p><br></p>
<hr noshade size="2">
<br></p>
<p align="justify">
<p>    	What do we need - Hardware wise ? This depends on three factors :<br><br><br />
	The <big>*importance*</big> of your data (Think for a moment on the consequences in case you<br />
	would lose files).<br><br><br />
	 The <big>*amount*</big> of data (Are we talking about 200 MB, 5 GB or 500 GB ?).<br />
	 <br><br><br />
	 And last but not least the <big>*organization*</big> of your data (Does a &#34;file card system&#34; do the job ? You need a database ?<br />
	With only the file names ? Or with meta-tags, thumbnails and keywords ? You handle everything form your laptop or do other people / colleagues / friends need access via the web?)<br />
    	<br><br><br />
	As usual, money plays also an important role. Professional storage and archiving solutions can cost thousands of Dollars, Euros, etc. But in most cases a decent investment will<br />
	bring the maximum amount of safety that will make you sleep much better.<br />
	<br><br><br></p>
<p><big><i>READ THE FULL ARTICLE <a href="http://www.fauland-photography.com/tutorial_photoarchive">HERE</a></i> ... !</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[CAD Manager, Engineering and Mechanical, Aldermaston]]></title>
<link>http://utilityjobs.wordpress.com/?p=148</link>
<pubDate>Fri, 04 Jul 2008 19:50:10 +0000</pubDate>
<dc:creator>mrcas</dc:creator>
<guid>http://utilityjobs.wordpress.com/?p=148</guid>
<description><![CDATA[CAD Manager, Engineering and Mechanical
Reference: 1215082349
ERS have a Client who is looking for a]]></description>
<content:encoded><![CDATA[<h1>CAD Manager, Engineering and Mechanical</h1>
<h3>Reference: 1215082349</h3>
<p class="synopsis">ERS have a Client who is looking for a CAD Manager for development of application media for the knowledge management of company configuration records.</p>
<h3>Location</h3>
<p>Aldermaston</p>
<h3>Salary</h3>
<p>Competitive salary based on qualifications and experience</p>
<h3>Job Responsibilities</h3>
<p>A working understanding of relevant British and European Standards and legislative requirements.</p>
<p>Compliance of drawings with company standards.</p>
<p>Maintenance of site drawing standards database.</p>
<p>Provision of internal drawing capabilities to all facilities and projects.</p>
<p>Development of an integrated configuration team, looking at application and storage of configuration data.</p>
<p>Completion of drawings to meet programme requirements.</p>
<p>Carry out surveys to support the completion of drawings.</p>
<p>Preparation of work to pass onto draughtsmen for production of drawings.</p>
<p>Verification of the drawings to appropriate company standards.</p>
<p>Reviewing updating of CAD Manual.</p>
<p>Tel: 01454 203 460</p>
<p><a href="mailto:cv@energyrs.co.uk">cv@energyrs.co.uk</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[CAD Manager, Engineering and Mechanical, Aldermaston]]></title>
<link>http://utilityjobs.wordpress.com/?p=148</link>
<pubDate>Fri, 04 Jul 2008 19:50:10 +0000</pubDate>
<dc:creator>mrcas</dc:creator>
<guid>http://utilityjobs.wordpress.com/?p=148</guid>
<description><![CDATA[CAD Manager, Engineering and Mechanical
Reference: 1215082349
ERS have a Client who is looking for a]]></description>
<content:encoded><![CDATA[<h1>CAD Manager, Engineering and Mechanical</h1>
<h3>Reference: 1215082349</h3>
<p class="synopsis">ERS have a Client who is looking for a CAD Manager for development of application media for the knowledge management of company configuration records.</p>
<h3>Location</h3>
<p>Aldermaston</p>
<h3>Salary</h3>
<p>Competitive salary based on qualifications and experience</p>
<h3>Job Responsibilities</h3>
<p>A working understanding of relevant British and European Standards and legislative requirements.</p>
<p>Compliance of drawings with company standards.</p>
<p>Maintenance of site drawing standards database.</p>
<p>Provision of internal drawing capabilities to all facilities and projects.</p>
<p>Development of an integrated configuration team, looking at application and storage of configuration data.</p>
<p>Completion of drawings to meet programme requirements.</p>
<p>Carry out surveys to support the completion of drawings.</p>
<p>Preparation of work to pass onto draughtsmen for production of drawings.</p>
<p>Verification of the drawings to appropriate company standards.</p>
<p>Reviewing updating of CAD Manual.</p>
<p>Tel: 01454 203 460</p>
<p><a href="mailto:cv@energyrs.co.uk">cv@energyrs.co.uk</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[An Epigrammatic Account of SQL]]></title>
<link>http://khatiar2012.wordpress.com/?p=102</link>
<pubDate>Fri, 04 Jul 2008 17:52:43 +0000</pubDate>
<dc:creator>khatiar2012</dc:creator>
<guid>http://khatiar2012.wordpress.com/?p=102</guid>
<description><![CDATA[The time gone by of SQL begins in an IBM laboratory in San Jose, California, where on earth SQL was ]]></description>
<content:encoded><![CDATA[<p><span style="color:black;">The time gone by of SQL begins in an IBM laboratory in San Jose, California, where on earth SQL was urbanized in the late 1970s. The fundamental pose for Structured Query Language and the language itself is time and again referred to as "sequel." It was in the inauguration built-up for IBM's DB2 item for consumption as a basic criterion of a relational database management system, or RDBMS.. In fact, SQL creates an RDBMS achievable. SQL is a nonprocedural language, in disparity to the procedural or third-generation languages such as COBOL and C that had been created up to that time. The quality that categorizes a DBMS from an RDBMS is that the RDBMS provides a set-oriented database language. For most RDBMS, this set-oriented database language is SQL. Two standards association, the American National Standards Institute and the International Standards Organization, currently prop up SQL standards to exchange. The ANSI-92 standard is the customary for the SQL used throughout this article. Although these standard-making bodies systematize standards for database system designers to tag along, all database products differ from the ANSI standard to some degree. In addition, most systems provide some proprietary extensions to SQL that extend the language into a true procedural language. We have used various RDBMS to prepare the examples in this article to give you an idea of what to expect from the common database systems. </span></p>
<p class="MsoNormal" style="text-align:justify;text-indent:0.5in;"><span style="color:black;">It was an inquiring feeling whether there is a modest background on the evolution of databases and database conjecture would facilitate us value the workings of SQL. Database systems stock up in sequence in every feasible business environment. From outsized pathway databases such as airline proviso systems to a child's baseball card collection, database systems store and hand out the data that we depend on. Until the last few years, large database systems could be run only on large mainframe computers. These machines have traditionally been expensive to design, purchase, and maintain. However, today's generation of powerful, inexpensive workstation computers enables programmers to design software that maintains and distributes data quickly and inexpensively. </span></p>
<p class="MsoNormal"><!--[if !supportEmptyParas]--> <!--[endif]--></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Set nocount untuk optimasi Stored Procedures SQL Server ]]></title>
<link>http://namakuma.wordpress.com/?p=15</link>
<pubDate>Fri, 04 Jul 2008 08:45:00 +0000</pubDate>
<dc:creator>namakuma</dc:creator>
<guid>http://namakuma.wordpress.com/?p=15</guid>
<description><![CDATA[  Stored procedures dalam SQL server 2000 itu ada 2 macam yaitu system stored procedures dan user st]]></description>
<content:encoded><![CDATA[<p><!--[if gte mso 9]&#62;  Normal 0   false false false        MicrosoftInternetExplorer4  &#60;![endif]--><!--[if gte mso 9]&#62;   &#60;![endif]--> <!--[if gte mso 10]&#62;--> <!--[endif]-->Stored procedures dalam SQL server 2000 itu ada 2 macam yaitu system stored procedures dan user stored procedures. User stored procedures terbagi lagi menjadi 3 bagian yaitu :</p>
<p style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span>1.<span style="font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span><!--[endif]-->User Defined stored procedures</p>
<p style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span>2.<span style="font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span><!--[endif]-->Trigger</p>
<p style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span>3.<span style="font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span><!--[endif]-->User defined function</p>
<p>Saya tidak akan membahas mengenai pengertian masing-masing stored procedures diatas, namun saya mencoba memberikan salah satu cara untuk optimasi performance dalam eksekusi stored procedures yaitu dengan menggunakan “<strong>Set nocount on</strong>”.</p>
<p>Kalo kita jalankan query dengan menggunakan query analyzer sebagai contoh :</p>
<p>SELECT * FROM authors</p>
<p>Message:</p>
<p>(1 row(s) affected)</p>
<p>maka akan selalu muncul pesan statistik berapa banyak jumlah row dari hasil query, didalam stored procedures terutama yang kompleks akan banyak pesan statistik yang di munculkan. <span lang="SV">Hal ini tentu saja akan menambah waktu proses dan bandwith di jaringan. Oleh sebab itu maka menonaktifkan pesan statistik ini dapat mengurangi proses yg tidak dibutuhkan sehingga performance dari stored procedures akan lebih baik. </span></p>
<p style="margin-bottom:12pt;"><span lang="SV"> </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">create procedure test_coy</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">as </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">begin </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">declare @i int </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">create table test_coy_table (</span></p>
<p style="margin-left:36pt;text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">testID int, [user] varchar (50), description varchar(100) )</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">set @i = 0 </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">while @i &#60; 1000 </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">begin </span></p>
<p style="margin-left:36pt;text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">set @i= @i + 1</span></p>
<p style="margin-left:72pt;"><span style="font-size:10pt;font-family:Tahoma;">insert into test_coy_table (testid,[user]) values(@i, 'user ' + cast(@i as varchar(3)))</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">end </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">select * from test_coy_table</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">end </span></p>
<p style="margin-bottom:12pt;"><span style="font-family:Tahoma;"> </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">exec test_coy</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">message: </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">(1 row(s) affected)</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">(1 row(s) affected)</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">(1 row(s) affected)</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">.</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">.</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">(1000 row(s) affected)</span></p>
<p style="margin-bottom:12pt;">
<p><span style="font-size:10pt;font-family:Tahoma;">Contoh pemakaian set nocount : </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">alter procedure test_coy</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">as </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">begin </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">set nocount on</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">declare @i int </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">create table test_coy_table (</span></p>
<p style="margin-left:36pt;text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">testID int, [user] varchar (50), description varchar(100) )</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">set @i = 0 </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">while @i &#60; 1000 </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">begin </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">set @i= @i + 1</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">insert into test_coy_table (testid,[user]) values(@i, 'user ' + cast(@i as varchar(3)))</span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">end </span></p>
<p style="text-indent:36pt;"><span style="font-size:10pt;font-family:Tahoma;">select * from test_coy_table</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">end </span></p>
<p style="margin-bottom:12pt;"><span style="font-size:10pt;font-family:Tahoma;"> </span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">exec test_coy</span></p>
<p><span style="font-size:10pt;font-family:Tahoma;">message: </span></p>
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p style="margin-bottom:12pt;">
<p class="MsoNormal">
]]></content:encoded>
</item>
<item>
<title><![CDATA[Encylopedia of Life]]></title>
<link>http://sciencevideos.wordpress.com/?p=256</link>
<pubDate>Fri, 04 Jul 2008 04:55:34 +0000</pubDate>
<dc:creator>Stephen</dc:creator>
<guid>http://sciencevideos.wordpress.com/?p=256</guid>
<description><![CDATA[A huge and ambitious project to create an online species database. Here is their &#8216;about us]]></description>
<content:encoded><![CDATA[<p><a href="http://www.eol.org/index"><img class="alignleft" src="http://tbn0.google.com/images?q=tbn:U1DqKMWmABJ9zM:http://www.mbl.edu/news/press_releases/images/eol_logo_globe.jpg" alt="EOL - the Encyclopedia of Life" /></a>A huge and ambitious project to create an <a href="http://www.eol.org/index">online species database</a>. Here is their 'about us' blurb:</p>
<p><em>The Encyclopedia of Life (EOL) is an ambitious, even audacious project to organize and make available via the Internet virtually all information about life present on Earth. At its heart lies a series of Web sites—one for each of the approximately 1.8</em><img class="alignright" src="http://128.128.175.211/fedora/get/data:240976/LocalImage" alt="Cafetaria roenbergensis" width="224" height="158" /><em> million known species—that provide the entry points to this vast array of knowledge. The entry-point for each site is a species page suitable for the general public, but with several linked pages aimed at more specialized users. The sites sparkle with text and images that are enticing to everyone, as well as providing deep links to specific data.</em></p>
<p>Try the example page for <a href="http://www.eol.org/taxa/16222828"><em>Cafetaria roenbergensis</em> here</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[How to perform an aggregate query using SubSonic 2.1's SqlQuery]]></title>
<link>http://jamesewelch.wordpress.com/2008/07/03/how-to-perform-an-aggregate-query-using-subsonic-21s-sqlquery/</link>
<pubDate>Fri, 04 Jul 2008 01:59:49 +0000</pubDate>
<dc:creator>Jim</dc:creator>
<guid>http://jamesewelch.wordpress.com/2008/07/03/how-to-perform-an-aggregate-query-using-subsonic-21s-sqlquery/</guid>
<description><![CDATA[Just recently, I upgraded from SubSonic 2.0 to SubSonic 2.1 RC1. One of the new features is the addi]]></description>
<content:encoded><![CDATA[<p>Just recently, I upgraded from SubSonic 2.0 to <a href="http://monk.thelonio.us/post/SubSonic-21-Release-Candidate-1.aspx" target="_blank">SubSonic 2.1 RC1</a>. One of the new features is the addition of the SqlQuery class and it's ability to perform aggregate queries (along with many other features).</p>
<p>If you're not familiar with <a href="http://subsonicproject.com/" target="_blank">SubSonic</a>, then it is a tool that builds your DAL (Data Abstraction Layer). Each of your database, tables, and rows become classes that you can insert, update, delete, and select from.</p>
<p>By using an ORM instead of embedding SQL statements in your applications, it makes your code easier to test and catch mistakes (such as typos in field or table names). There's pros and cons to ORM versus SQL statements, but this entry won't touch on those issues.</p>
<p>This is an example of how to perform a query to get a count of unique records while grouping by a column.</p>
<p><!--more-->
</p>
<h3>Sample Data</h3>
<p>The below table ("Inventory") will be used throughout these examples. </p>
<table cellspacing="0" cellpadding="2" width="242" border="1">
<thead>
<tr>
<th valign="top" width="81">Year</th>
<th valign="top" width="75">Make</th>
<th valign="top" width="84">Model</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="81">2000</td>
<td valign="top" width="75">Acura</td>
<td valign="top" width="83">Integra</td>
</tr>
<tr>
<td valign="top" width="81">2006</td>
<td valign="top" width="75">Acura</td>
<td valign="top" width="83">RSX</td>
</tr>
<tr>
<td valign="top" width="81">2008</td>
<td valign="top" width="75">BMW</td>
<td valign="top" width="83">Z4M</td>
</tr>
<tr>
<td valign="top" width="81">2008</td>
<td valign="top" width="75">Chevrolet</td>
<td valign="top" width="83">Corvette</td>
</tr>
<tr>
<td valign="top" width="81">2008</td>
<td valign="top" width="75">Ford</td>
<td valign="top" width="84">Mustang</td>
</tr>
</tbody>
</table>
<h3>How to do this using SQL</h3>
<h5>Example SQL Code</h5>
<p><code>SELECT Make, Count(0) MakeCount <br />FROM Inventory <br />GROUP BY Make;</code></p>
<h5>SQL Result</h5>
<table cellspacing="0" cellpadding="2" width="195" border="1">
<thead>
<tr>
<th valign="top" width="86">Make</th>
<th valign="top" width="107">MakeCount</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="87">Acura</td>
<td valign="top" width="107">2</td>
</tr>
<tr>
<td valign="top" width="88">BMW</td>
<td valign="top" width="107">1</td>
</tr>
<tr>
<td valign="top" width="89">Chevrolet</td>
<td valign="top" width="107">1</td>
</tr>
<tr>
<td valign="top" width="90">Ford</td>
<td valign="top" width="107">1</td>
</tr>
</tbody>
</table>
<h3>How to do this using SubSonic 2.1</h3>
<h5>Example SubSonic Code</h5>
<p><code>SubSonic.SqlQuery qry = new SubSonic.Select(<br />&#160;&#160;&#160;&#160; SubSonic.Aggregate.GroupBy(<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inventory.Columns.Make, "Make"), <br />&#160;&#160;&#160;&#160; SubSonic.Aggregate.Count(<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inventory.Columns.Make, "MakeCount")).<br />&#160;&#160;&#160;&#160; From(Inventory.Schema); </code> </p>
<p><code>myGridView.DataSource = qry.ExecuteReader();</code><br />
<h5>SubSonic Result</h5>
<table cellspacing="0" cellpadding="2" width="195" border="1">
<thead>
<tr>
<th valign="top" width="86">Make</th>
<th valign="top" width="107">MakeCount</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="87">Acura</td>
<td valign="top" width="107">2</td>
</tr>
<tr>
<td valign="top" width="88">BMW</td>
<td valign="top" width="107">1</td>
</tr>
<tr>
<td valign="top" width="89">Chevrolet</td>
<td valign="top" width="107">1</td>
</tr>
<tr>
<td valign="top" width="90">Ford</td>
<td valign="top" width="107">1</td>
</tr>
</tbody>
</table>
<h3>How do I do this using a where clause?</h3>
<h5>Example SQL Code</h5>
</p>
<p><code>SELECT Year, Make, Count(0) MakeCount <br />FROM Inventory <br />WHERE Year = 2008<br />GROUP BY Year, Make;</code></p>
<h5>Example SubSonic Code</h5>
<p><code>SubSonic.SqlQuery qry = new SubSonic.Select(<br />&#160;&#160;&#160;&#160; SubSonic.Aggregate.GroupBy(<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inventory.Columns.Year, "Year"),<br />&#160;&#160;&#160;&#160; SubSonic.Aggregate.GroupBy(<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inventory.Columns.Make, "Make"),<br />&#160;&#160;&#160;&#160; SubSonic.Aggregate.Count(<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Inventory.Columns.Make, "MakeCount")).<br />&#160;&#160;&#160;&#160; From(Inventory.Schema).<br />&#160;&#160;&#160;&#160; Where(Inventory.Columns.Year).<br />&#160;&#160;&#160;&#160; IsEqualTo(2008);</code><code>&#160;</code></p>
<p><code>myGridView.DataSource = qry.ExecuteReader();</code><br />
<h5>Query Results (both SQL and SubSonic)</h5>
<table cellspacing="0" cellpadding="2" width="245" border="1">
<thead>
<tr>
<th valign="top" width="56">Year</th>
<th valign="top" width="92">Make</th>
<th valign="top" width="95">MakeCount</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="56">2008</td>
<td valign="top" width="92">BMW</td>
<td valign="top" width="95">1</td>
</tr>
<tr>
<td valign="top" width="56">2008</td>
<td valign="top" width="92">Chevrolet</td>
<td valign="top" width="95">1</td>
</tr>
<tr>
<td valign="top" width="56">2008</td>
<td valign="top" width="92">Ford</td>
<td valign="top" width="95">1</td>
</tr>
</tbody>
</table>
<p>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:901694a9-2ecd-4576-8d05-ef2acdd96811" style="display:inline;margin:0;padding:0;">My Related Posts: <a href="http://jamesewelch.wordpress.com/tag/Technology" rel="tag">Technology</a>, <a href="http://jamesewelch.wordpress.com/tag/Database" rel="tag">Database</a>, <a href="http://jamesewelch.wordpress.com/tag/Programming" rel="tag">Programming</a>, <a href="http://jamesewelch.wordpress.com/tag/.NET" rel="tag">.NET</a></div>
</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fjamesewelch.wordpress.com%2f2008%2f07%2f03%2fhow-to-perform-an-aggregate-query-using-subsonic-21s-sqlquery%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fjamesewelch.wordpress.com%2f2008%2f07%2f03%2fhow-to-perform-an-aggregate-query-using-subsonic-21s-sqlquery%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[YouTube to disclose user information]]></title>
<link>http://vlogz.wordpress.com/?p=428</link>
<pubDate>Fri, 04 Jul 2008 01:03:52 +0000</pubDate>
<dc:creator>VLOGZ</dc:creator>
<guid>http://vlogz.wordpress.com/?p=428</guid>
<description><![CDATA[
Dismissing privacy concerns, a federal judge overseeing a $1 billion copyright-infringement lawsuit]]></description>
<content:encoded><![CDATA[<p><a href="http://vlogz.files.wordpress.com/2008/07/cs.jpg"><img class="alignnone" src="http://www.que20.com/wp-content/uploads/2007/09/youtube_logo.jpg" alt="" width="400" height="297" /></a></p>
<p>Dismissing privacy concerns, a federal judge overseeing a $1 billion copyright-infringement lawsuit against YouTube has ordered the popular online video-sharing service to disclose who watches which video clips and when/</p>
<p>The database includes information on when each video gets played, which can be used to determine how often a clip is viewed. Attached to each entry is each viewer's unique login ID and the Internet Protocol, or IP, address for that viewer's computer</p>
<p>Lawyers for Google Inc., which owns YouTube, said producing 12 terabytes of data _ equivalent to the text of roughly 12 million books _ would be expensive, time-consuming and a threat to users' privacy.</p>
<p>Will Jon Stewart and Stephen Colbert save us ? The court has yet to rule on Google's requests to question comedians.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[YouTube ordered to release user details to Viacom]]></title>
<link>http://whitewraithe.wordpress.com/?p=223</link>
<pubDate>Thu, 03 Jul 2008 23:57:00 +0000</pubDate>
<dc:creator>whitewraithe</dc:creator>
<guid>http://whitewraithe.wordpress.com/?p=223</guid>
<description><![CDATA[This is nothing more than a further invasion of ordinary peoples&#8217; privacy.  The global Jewish ]]></description>
<content:encoded><![CDATA[<p><em><span style="color:#ff6600;"><strong>This is nothing more than a further invasion of ordinary peoples' privacy.  The global Jewish elites (our owners) must be getting really nervous to stoop to this type of surveillance on the web.  What are they going to do - arrest anyone who watches an Alex Jones video?</strong></span></em></p>
<h1>YouTube ordered to hand over user details</h1>
<p><strong>By Andrew Ramadge, Technology Reporter</strong></p>
<div id="article-intro">YOUTUBE has been ordered to give up records of each clip  watched on the popular video-sharing website, along with the date, time and IP  address of each person who watched it, to media giant Viacom.</div>
<p><!-- // #article-intro -->In a ruling that could have major implications for online privacy around the  world, US District Court judge Louis Stanton granted Viacom access to the  records as part of its ongoing copyright infringement lawsuit against Google and  its subsidiary YouTube.</p>
<p>Each time a video is played, YouTube's "Logging" database records the user ID  and IP address of the viewer, the date and time of the request and the ID of the  clip – and includes details of videos embedded on websites other than YouTube.</p>
<p>"While the Logging database is large, all of its contents can be copied onto  a few 'over-the-shelf' four-terabyte hard drives," Judge Stanton said, in  response to Google's claim that providing the data would be too difficult.</p>
<p>"The motion to compel production of all data from the Logging database  concerning each time a YouTube video has been viewed on the YouTube website or  through embedding on a third-party website is granted."</p>
<p>Viacom sought access to the database in a bid to prove that clips allegedly  infringing copyright, such as scenes from TV shows and movies, were more popular  than user-generated videos.</p>
<p>Online rights group Electronic Frontier Foundation said the decision stood at  odds with US privacy laws and was a "setback to privacy rights".</p>
<p>"The court’s order grants Viacom's request and erroneously ignores the  protections of the federal Video Privacy Protection Act (VPPA), and threatens to  expose deeply private information about what videos are watched by YouTube  users," said a statement on the group's website.</p>
<p>"We urge Viacom to back off this overbroad request and Google to take all  steps necessary to challenge this order and protect the rights of its users."</p>
<p>Judge Stanton denied Viacom's requests for access to other Google and YouTube  properties, such as the search engine's source code – including the algorithms  it uses to provide search results.</p>
<p>Viacom began legal action against YouTube in February 2007, when it issued  over 100,000 takedown notices to the website regarding material in breach of  copyright.</p>
<p>In March 2007, the media giant instigated a $US1 billion lawsuit against  Google and YouTube, alleging that the video-sharing website hosted over 150,000  unauthorised clips that had been viewed more than 1.5 billion times.</p>
<p>Viacom's media empire includes Paramount Pictures, MTV, DreamWorks and  Nickelodeon.</p>
<p>It is not known if Google will challenge the decision.</p>
<h2>Links</h2>
<p>Judge Stanton's ruling on <em>Wired</em> (PDF) – <a href="http://blog.wired.com/27bstroke6/files/viacom_youtube.PDF" target="_blank">http://blog.wired.com/27bstroke6/files/viacom_yout…</a><br />
Electronic  Frontier Foundation statement – <a href="http://www.eff.org/deeplinks/2008/07/court-ruling-will-expose-viewing-habits-youtube-us" target="_blank">http://www.eff.org/deeplinks/2008/07/court-ruling-…</a></p>
<p><a href="http://www.news.com.au/technology/story/0,25642,23963774-5014108,00.html" target="_blank">Source</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Gapminder updates]]></title>
<link>http://onderwijstools.wordpress.com/?p=43</link>
<pubDate>Thu, 03 Jul 2008 19:57:03 +0000</pubDate>
<dc:creator>kdewi</dc:creator>
<guid>http://onderwijstools.wordpress.com/?p=43</guid>
<description><![CDATA[Er zijn meer dan 100 nieuwe datasets toegevoegd aan Gapminder, zo valt te lezen op hun blog. Enkele ]]></description>
<content:encoded><![CDATA[<p>Er zijn meer dan 100 nieuwe datasets toegevoegd aan <a title="Gapminder world" href="http://www.gapminder.org/world/#$majorMode=chart$is;shi=t;ly=2003;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$wst;tts=C$ts;sp=6;ti=2006$zpv;v=1$inc_x;mmid=XCOORDS;iid=phAwcNAVuyj1jiMAkmq1iMg;by=ind$inc_y;mmid=YCOORDS;iid=phAwcNAVuyj2tPLxKvvnNPA;by=ind$inc_s;uniValue=8.21;iid=phAwcNAVuyj0XOoBL%5Fn5tAQ;by=ind$inc_c;uniValue=255;gid=CATID0;by=grp$map_x;scale=log;dataMin=199;dataMax=42642$map_y;scale=lin;dataMin=25;dataMax=84$map_s;sma=49;smi=2.65$cd;bd=0$inds=" target="_blank">Gapminder</a>, zo valt te lezen op hun <a title="Gapminder blog" href="http://www.gapminder.org/world/blog/" target="_blank">blog</a>. Enkele onderwijs-ideeën om Gapminder te introduceren aan je studenten vind je <a title="Gapminder onderwijsideeën" href="http://www.digitalgeography.co.uk/archives/2007/01/gapminder-some-teaching-ideas/" target="_blank">hier</a>.  Een handleiding voor Gapminder (doc-formaat, dus te vertalen en aan te passen naar het Nederlands) die je kunt uitprinten voor je leerlingen kun je dan weer <a title="gebruiksaanwijzing Gapminder" href="http://www.juicygeography.co.uk/downloads/Word/gapminder.doc" target="_blank">hier</a> downloaden.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Start]]></title>
<link>http://loonsbury.wordpress.com/?p=3</link>
<pubDate>Thu, 03 Jul 2008 18:41:00 +0000</pubDate>
<dc:creator>loonsbury</dc:creator>
<guid>http://loonsbury.wordpress.com/?p=3</guid>
<description><![CDATA[So this is my first post.  Impressed?
I spent most of this morning overcoming the bad decisions of ]]></description>
<content:encoded><![CDATA[<p>So this is my first post.  Impressed?</p>
<p>I spent most of this morning overcoming the bad decisions of a previous executive director for a client.  Note to self: never register a business domain to my own name on my personal Yahoo! account.  There are many ways to register a domain name for your company.  I think that is one of the most aggravating options.</p>
<p>Getting the business site up soon, we'll see how it turns out.</p>
<p>At the "real" job: mainframe database format changes=bad, mmkay?  I'm rewriting every program because somebody couldn't figure out how to get arrayed fields into SQL Server.  Someone is slow, I get to pick up the pieces.  I know every step of this dance.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Normalisasi dalam Database]]></title>
<link>http://siregarbox.wordpress.com/?p=27</link>
<pubDate>Thu, 03 Jul 2008 18:12:19 +0000</pubDate>
<dc:creator>siregarbox</dc:creator>
<guid>http://siregarbox.wordpress.com/?p=27</guid>
<description><![CDATA[Apa sih normalisasi itu?? Apa fungsinya?? Gimana caranya?? Eitss satu-satu donk! Sekarang saya akan ]]></description>
<content:encoded><![CDATA[<p>Apa sih normalisasi itu?? Apa fungsinya?? Gimana caranya?? Eitss satu-satu donk! Sekarang saya akan mencoba untuk menjelaskan tentang 'Normalisasi dalam Database'. Normalisasi itu teknik untuk mengelompokkan atribut dari suatu relasi sehingga membentuk struktur relasi yang baik(tanpa adanya redudansi). Normalisasi dalam suatu database biasanya hanya mencapai N3(Normalisasi Ketiga), berikut adalah urutan Normalisasi :</p>
<p>1. N1(Normalisasi Pertama)<br />
Mempunyai aturan<br />
~Mendefinisikan primary key<br />
~Tidak ada grup yang berulang<br />
~Semua non-primary key bergantung pada primary key<br />
2. N2(Normalisasi Kedua)<br />
Mempunyai aturan<br />
~Memenuhi aturan N1<br />
~Tidak ada ketergantungan parsial<br />
3. N3(Normalisasi Ketiga)<br />
Mempunyai aturan<br />
~Memenuhi aturan N2<br />
~Tidak ada ketergantungan transitif</p>
<p>Sebagai tambahan normal dalam suatu database seharusnya mencapai bentuk normal tertinggi dan bergerak dari bentuk normal satu dan seterusnya untuk setiap kali membatasi hanya satu jenis redudansi. Jumlah normalisasi seluruhnya ada 5(Lima) dimana 3 bentuk normal pertama menekankan redudansi yang muncul dari Function Dependencies sedangkan N4 dan N5 menekankan redudansi yang muncul dari kasus Multi Valued Dependencies.</p>
<p>Berikut adalah cara singkat melakukan normalisasi<br />
1. Normalisasi Pertama a.k.a N1<br />
Hilangkan duplikasi dengan mencari ketergantungan parsial<br />
2. Normalisasi Kedua a.k.a N2<br />
Field-field yang tergantung pada satu field harus dipisah dengan tepat<br />
3. Normalisasi Ketiga a.k.a N3<br />
Cari hubungan transitif(transitive relation) dimana field non key tergantung pada field non key lainnya</p>
<p>Tabel yang sudah mencapai N3 sudah siap untuk diimplementasikan dalam sebuah proyek, sebenarnya masih ada bentuk normalisasi yang lain yaitu Normalisasi  Boyce-Codd dan N4. Jadi sebelum membuat suatu project normalisasikanlah database-mu.</p>
<p>Happy Learning!!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[SQL Server Indexes]]></title>
<link>http://programmingindexcards.wordpress.com/?p=7</link>
<pubDate>Thu, 03 Jul 2008 16:09:51 +0000</pubDate>
<dc:creator>apcig</dc:creator>
<guid>http://programmingindexcards.wordpress.com/?p=7</guid>
<description><![CDATA[Clustered index
- reorders the way records in the table are physically stored
- a table can have onl]]></description>
<content:encoded><![CDATA[<p><strong>Clustered index</strong><br><br />
- reorders the way records in the table are physically stored<br><br />
- a table can have only one clustered index<br><br />
- the leaf nodes of a contain the data pages.</p>
<p><strong>Nonclustered index</strong><br><br />
- the logical order of the index does not match the physical stored order of the rows on disk<br><br />
- the leaf nodes of a nonclustered index do not consist of the data pages. Instead, they contain index rows.</p>
<p>Sources: <a href="http://www.mssqlcity.com/FAQ/General/clustered_vs_nonclustered_indexes.htm">FAQ: clustered vs nonclustered indexes</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Database - Affiliazione Database profilati ]]></title>
<link>http://affiliazioni.wordpress.com/?p=90</link>
<pubDate>Thu, 03 Jul 2008 15:21:17 +0000</pubDate>
<dc:creator>Directory Affiliazioni</dc:creator>
<guid>http://affiliazioni.wordpress.com/?p=90</guid>
<description><![CDATA[Database - Affiliazioniweb (iscrizione gratuita)
Grazie al Programma di Affiliazioni di Database puo]]></description>
<content:encoded><![CDATA[<p><strong></strong><strong><a href="http://admin.affiliazioniweb.com/affsignup.php?pid=d0faa888" target="_blank"><span style="font-size:medium;font-family:Arial;">Database - <span style="color:#0000ff;">Affiliazioniweb (iscrizione gratuita)</span></span></a></strong></p>
<p><strong>Grazie al Programma di Affiliazioni di Database puoi guadagnare ben 0,05 euro ad ogni Click</strong>!</p>
<p>Vendita database aziendali profilati per categoria merceologica e area geografica. Campagne e-mail e fax marketing.</p>
<p><strong>Commissioni: 0,05 euro per ogni Click</strong></p>
<p><span style="color:#ff0000;">Network di appartenza: <a href="http://admin.affiliazioniweb.com/affsignup.php?pid=d0faa888" target="_blank"><strong>Affilizioniweb</strong> - Clicca qui per iscriverti gratuitamente</a></span></p>
<p>Affiliazioni ideale per Newsletter con molti iscritti e per esperti di Fax Marketing.</p>
<p><a href="http://www.clickpoint.it/db/clk.cp?ID=5414&#38;A=51672" target="_blank"><strong>Monetizza il tuo Blog grazie ai Click di Database</strong> (Affiliazioniweb)</a></p>
<p>Alcuni banner disponibili:</p>
<p><a target="_blank" href='http://www.databaseaziende.net?a_aid=d0faa888&#38;a_bid=608ec787'><img src='http://admin.affiliazioniweb.com/scripts/sb.php?a_aid=d0faa888&#38;a_bid=608ec787' alt="Database aziende" border="0"></a></p>
<p><a target="_blank" href='http://www.databaseaziende.net?a_aid=d0faa888&#38;a_bid=69fb8145'><img src='http://admin.affiliazioniweb.com/scripts/sb.php?a_aid=d0faa888&#38;a_bid=69fb8145' alt="Database aziende" border="0"></a></p>
<p><a target="_blank" href='http://www.databaseaziende.net?a_aid=d0faa888&#38;a_bid=1eb6b5e0'><img src='http://admin.affiliazioniweb.com/scripts/sb.php?a_aid=d0faa888&#38;a_bid=1eb6b5e0' alt="Database aziende" border="0"></a></p>
<p><a target="_blank" href='http://www.databaseaziende.net?a_aid=d0faa888&#38;a_bid=84eb96f7'><img src='http://admin.affiliazioniweb.com/scripts/sb.php?a_aid=d0faa888&#38;a_bid=84eb96f7' alt="Database aziende" border="0"></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PROTOTYPE MIGRASI DATABASE MICROSOFT SQL SERVER DAN MYSQL KE ORACLE DENGAN KOMPONEN ADO, MYSQLDAC DAN ODAC]]></title>
<link>http://prasetyo2008.wordpress.com/?p=9</link>
<pubDate>Thu, 03 Jul 2008 11:28:13 +0000</pubDate>
<dc:creator>prasetyo2008</dc:creator>
<guid>http://prasetyo2008.wordpress.com/?p=9</guid>
<description><![CDATA[Database merupakan jantung dalam sebuah sistem informasi yang mengolah data dalam sebuah instansi. B]]></description>
<content:encoded><![CDATA[<p class="MsoNormal" style="text-align:justify;text-indent:36pt;"><span style="font-size:11pt;">Database merupakan jantung dalam sebuah sistem informasi yang mengolah data dalam sebuah instansi. Beberapa hal yang menjadi pertimbangan utama dalam pemilihan sebuah perangkat lunak database adalah kemudahan dalam penggunaan dan perawatan, kelengkapan fasilitas yang disediakan, keamanan akses data, lisensi pembelian perangkat lunak, kesesuaian dengan sistem operasi yang digunakan. Dengan semakin berkembangnya kebutuhan informasi instansi tersebut maka perangkat lunak database yang digunakan juga harus dapat memenuhi kebutuhan yang diharapkan oleh instansi tersebut.</span></p>
<p class="MsoNormal" style="text-align:justify;text-indent:36pt;"><span style="font-size:11pt;">Jika perangkat lunak yang digunakan oleh instansi tersebut tidak dapat memenuhi kebutuhan yang diharapkan maka lebih baik jika database tersebut dipindahkan dari mesin database lama ke mesin database baru yang dapat memenuhi kebutuhan yang diharapkan. Untuk memindahkan database tersebut diperlukan sebuah sistem yang dapat digunakan untuk memindahkan database dari mesin database<span> </span>yang lama ke mesin database yang baru.</span></p>
<p class="MsoNormal" style="text-align:justify;text-indent:36pt;"><span style="font-size:11pt;">Dengan adanya sistem pemindah database maka pemindahan database menjadi lebih mudah, karena proses pemindahan database yang meliputi pemindahan struktur dan isi tabel dilakukan secara otomatis oleh sistem tersebut. Hasilnya berupa database yang sama di mesin database yang baru.</span></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;"> </span></strong></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;"> </span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;">Kata kunci : database, pemindahan, Microsoft SQL Server, MySQL, Oracle, sistem, informasi.</span></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[the "2nd"]]></title>
<link>http://kumahadamang.wordpress.com/?p=8</link>
<pubDate>Thu, 03 Jul 2008 10:18:05 +0000</pubDate>
<dc:creator>Niko</dc:creator>
<guid>http://kumahadamang.wordpress.com/?p=8</guid>
<description><![CDATA[seken&#8230;
seken&#8230;
apa yg saia kerjakan hari inih???
pagi-hingga rada siang : browsing&#8230;]]></description>
<content:encoded><![CDATA[<p>seken...</p>
<p>seken...</p>
<p>apa yg saia kerjakan hari inih???</p>
<p>pagi-hingga rada siang : <span style="text-decoration:line-through;">browsing...</span> mencari "literatur tertentu" untuk dijadikan sumber, hehe.. kemaren kan dimensi Time ama Geography sudah, sekarang mulai ngeniatin buat ngedesain control flow etl dimensi product, udah sih kemaren sore tp daripada pagi ini saia dikira tidak bekerja, yah dimasukin disini sajah..</p>
<p>ada sedikit masalah di database sumbernya... huh, yang penting bukan salah desain saia.. hwahaha..</p>
<p>sebelum siang : ngetes desain etl tersebut.... banyak yang saia akalin biar bisa dipake (seenggaknya sampai masa shareware sistem ini habis ;p) Hore! hore! dimensi sudah... loncat ke fact... ternyata eh ternyta, sudah waktunya lunch..</p>
<p>lunch : ya makan lah.... (anjir, dahar kalaka nyieun nyeri beuteung, haram jadah, engke deui mah moal seueur2 nyandak sambelna...)</p>
<p>abis lunch-sore : fact... fact... fact... dimulai dari yang paling gampang.. fact debit... huhu mantap datanya cuma dikit (cuma 2 bp yang ngasih data debit!)  mikir &#62; desain &#62; tes &#62; beres (alhamdulilah!)</p>
<p>sore bgt : mikirin desain fact selanjutnya, yaitu fact sales... huhu bakalan sengsara sampai ke LDBD kayanya nih.... desainnya belom selese, kepotong ama (B/KP)logging...</p>
<p>ah sudah... hayang buru2 m*d*l yeuh... rek nonton mamah jeung aa oge *kemarin saia ketinggalan nonton mamah dan aa, hiks2..*</p>
<p>Saia juga dapat pelajaran hari ini bahwa menurut sunnah nabi ternyata laki2 (seperti saya!) ketika kencing tidak boleh memegang "albert" dengan tangan kanan (bukan jg pakai kaki kanan) tapi harus pakai tangan kiri... heu kan lumayan kencing aja dapet pahala...</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[SQL Injection Attacks by Example ]]></title>
<link>http://coolvinay.wordpress.com/?p=32</link>
<pubDate>Thu, 03 Jul 2008 09:35:04 +0000</pubDate>
<dc:creator>coolvinay</dc:creator>
<guid>http://coolvinay.wordpress.com/?p=32</guid>
<description><![CDATA[
&#8220;SQL Injection&#8221; is subset of the an unverified/unsanitized user input  vulnerability (]]></description>
<content:encoded><![CDATA[<p><img class="alignnone" src="http://www.unixwiz.net/images/sqlinjection.jpg" alt="sqlinjection" /></p>
<p>"SQL Injection" is subset of the an unverified/unsanitized user input  vulnerability ("buffer overflows" are a different subset), and the idea is to  convince the application to run SQL code that was not intended. If the  application is creating SQL strings naively on the fly and then running them,  it's straightforward to create some real surprises.</p>
<p>We'll note that this was a somewhat winding road with more than one wrong  turn, and others with more experience will certainly have different -- and  better -- approaches. But the fact that we were successful does suggest that we  were not entirely misguided.</p>
<p>There have been other papers on SQL injection, including some that are much  more detailed, but this one shows the rationale of <strong>discovery</strong> as much as  the process of <strong>exploitation</strong></p>
<h1>The Target Intranet</h1>
<p>This appeared to be an entirely custom application, and we had no prior  knowledge of the application nor access to the source code: this was a "blind"  attack. A bit of poking showed that this server ran Microsoft's IIS 6 along with  ASP.NET, and this suggested that the database was Microsoft's SQL server: we  believe that these techniques can apply to nearly any web application backed by  any SQL server.</p>
<p>The login page had a traditional username-and-password form, but also an  email-me-my-password link; the latter proved to be the downfall of the whole  system.</p>
<p>When entering an email address, the system presumably looked in the user  database for that email address, and mailed something to that address. Since  <strong>my</strong> email address is not found, it wasn't going to send <strong>me</strong> anything.</p>
<p>So the first test in any SQL-ish form is to enter a single quote as part of  the data: the intention is to see if they construct an SQL string literally  without sanitizing. When submitting the form with a quote in the email address,  we get a 500 error (server failure), and this suggests that the "broken" input  is actually being parsed literally. Bingo.</p>
<p>We speculate that the underlying SQL code looks something like this:</p>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE <em>field</em> = '<span class="snip">$EMAIL</span>';</pre>
<p>Here, <span class="snip">$EMAIL</span> is the address submitted on the form by  the user, and the larger query provides the quotation marks that set it off as a  literal string. We don't know the specific <em>names</em> of the fields or table  involved, but we do know their <em>nature</em>, and we'll make some good guesses  later.</p>
<p>When we enter <span class="snip">steve@unixwiz.net'</span> - note the closing  quote mark - this yields constructed SQL:</p>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE <em>field</em> = '<span class="snip">steve@unixwiz.net'</span>';</pre>
<p>when this is executed, the SQL parser find the extra quote mark and aborts  with a syntax error. How this manifests itself to the user depends on the  application's internal error-recovery procedures, but it's usually different  from "email address is unknown". This error response is a dead giveaway that  user input is not being sanitized properly and that the application is ripe for  exploitation.</p>
<p>Since the data we're filling in appears to be in the <strong>WHERE</strong> clause,  let's change the nature of that clause <em>in an SQL legal way</em> and see what  happens. By entering <span class="snip">anything' OR 'x'='x</span>, the resulting  SQL is:</p>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE <em>field</em> = '<span class="snip">anything' OR 'x'='x</span>';</pre>
<p>Because the application is not really thinking about the query - merely  constructing a string - our use of quotes has turned a single-component  <strong>WHERE</strong> clause into a two-component one, and the <strong>'x'='x'</strong> clause is  <strong>guaranteed to be true</strong> no matter what the first clause is (there is a  better approach for this "always true" part that we'll touch on later).</p>
<p>But unlike the "real" query, which should return only a single item each  time, this version will essentially return every item in the members database.  The only way to find out what the application will do in this circumstance is to  try it. Doing so, we were greeted with:</p>
<blockquote><p>Your login information has been mailed to <em>random.person@example.com</em>.</p>
<hr /></blockquote>
<p>Our best guess is that it's the <em>first</em> record returned by the query,  effectively an entry taken at random. This person really did get this  forgotten-password link via email, which will probably come as surprise to him  and may raise warning flags somewhere.</p>
<p>We now know that we're able to manipulate the query to our own ends, though  we still don't know much about the parts of it we cannot see. But we <strong>have</strong> observed three different responses to our various inputs:</p>
<ul>
<li>"Your login information has been mailed to <em>email</em>"</li>
<li>"We don't recognize your email address"</li>
<li>Server error</li>
</ul>
<p>The first two are responses to well-formed SQL, while the latter is for bad  SQL: this distinction will be very useful when trying to guess the structure of  the query.</p>
<h1>Schema field mapping</h1>
<p>The first steps are to guess some field names: we're reasonably sure that the  query includes "email address" and "password", and there may be things like "US  Mail address" or "userid" or "phone number". We'd dearly love to perform a  <strong>SHOW TABLE</strong>, but in addition to not knowing the name of the table, there  is no obvious vehicle to get the output of this command routed to us.</p>
<p>So we'll do it in steps. In each case, we'll show the whole query as we know  it, with our own snippets shown specially. We know that the tail end of the  query is a comparison with the email address, so let's guess <strong>email</strong> as the  name of the field:</p>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE <em>field</em> = '<span class="snip">x' AND email IS NULL; --</span>';</pre>
<p>The intent is to use a proposed field name (<strong>email</strong>) in the constructed  query and find out if the SQL is valid or not. We don't care about matching the  email address (which is why we use a dummy <strong>'x'</strong>), and the <strong>--</strong> marks  the start of an SQL comment. This is an effective way to "consume" the final  quote provided by application and not worry about matching them.</p>
<p>If we get a server error, it means our SQL is malformed and a syntax error  was thrown: it's most likely due to a bad field name. If we get any kind of  valid response, we guessed the name correctly. This is the case whether we get  the "email unknown" or "password was sent" response.</p>
<p>Note, however, that we use the <strong>AND</strong> conjunction instead of <strong>OR</strong>:  this is intentional. In the SQL schema mapping phase, we're not really concerned  with guessing any particular email addresses, and we do not want random users  inundated with "here is your password" emails from the application - this will  surely raise suspicions to no good purpose. By using the <strong>AND</strong> conjunction  with an email address that couldn't ever be valid, we're sure that the query  will always return zero rows and never generate a password-reminder email.</p>
<p>Submitting the above snippet indeed gave us the "email address unknown"  response, so now we know that the email address is stored in a field  <strong>email</strong>. If this hadn't worked, we'd have tried <strong>email_address</strong> or  <strong>mail</strong> or the like. This process will involve quite a lot of guessing.</p>
<p>Next we'll guess some other obvious names: password, user ID, name, and the  like. These are all done one at a time, and anything other than "server failure"  means we guessed the name correctly.</p>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE <strong>email</strong> = '<span class="snip">x' AND userid IS NULL; --</span>';</pre>
<p>As a result of this process, we found several valid field names:</p>
<ul>
<li>email</li>
<li>passwd</li>
<li>login_id</li>
<li>full_name</li>
</ul>
<p>There are certainly more (and a good source of clues is the names of the  fields on <strong>forms</strong>), but a bit of digging did not discover any. But we still  don't know the name of the <strong>table</strong> that these fields are found in - how to  find out?</p>
<h1>Finding the table name</h1>
<p>The application's built-in query already has the table name built into it,  but we don't know what that name is: there are several approaches for finding  that (and other) table names. The one we took was to rely on a <strong>subselect</strong>.</p>
<p>A standalone query of</p>
<pre>SELECT COUNT(*) FROM <em>tabname</em></pre>
<p>Returns the number of records in that table, and of course fails if the table  name is unknown. We can build this into our string to probe for the table name:</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM <em>table</em>
 WHERE <strong>email</strong> = '<span class="snip">x' AND 1=(SELECT COUNT(*) FROM <em>tabname</em>); --</span>';</pre>
<p>We don't care how many records are there, of course, only whether the table  name is valid or not. By iterating over several guesses, we eventually  determined that <strong>members</strong> was a valid table in the database. But is it the  table used in <strong>this</strong> query? For that we need yet another test using  <strong>table</strong>.<strong>field</strong> notation: it only works for tables that are actually  part of this query, not merely that the table exists.</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">x' AND members.email IS NULL; --</span>';</pre>
<p>When this returned "Email unknown", it confirmed that our SQL was well formed  and that we had properly guessed the table name. This will be important later,  but we instead took a different approach in the interim.</p>
<h1>Finding some users</h1>
<p>At this point we have a partial idea of the structure of the <strong>members</strong> table, but we only know of one username: the random member who got our initial  "Here is your password" email. Recall that we never received the message itself,  only the address it was sent to. We'd like to get some more names to work with,  preferably those likely to have access to more data.</p>
<p>The first place to start, of course, is the company's website to find who is  who: the "About us" or "Contact" pages often list who's running the place. Many  of these contain email addresses, but even those that don't list them can give  us some clues which allow us to find them with our tool.</p>
<p>The idea is to submit a query that uses the <strong>LIKE</strong> clause, allowing us  to do partial matches of names or email addresses in the database, each time  triggering the "We sent your password" message and email. <strong>Warning</strong>: though  this reveals an email address each time we run it, it also actually sends that  email, which may raise suspicions. This suggests that we take it easy.</p>
<p>We can do the query on email name or full name (or presumably other  information), each time putting in the <strong>%</strong> wildcards that <strong>LIKE</strong> supports:</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">x' OR full_name LIKE '%Bob%</span>';</pre>
<p>Keep in mind that even though there may be more than one "Bob", we only get  to see one of them: this suggests refining our <strong>LIKE</strong> clause narrowly.</p>
<p>Ultimately, we may only need one valid email address to leverage our way in.</p>
<h1>Brute-force password guessing</h1>
<p>One can certainly attempt brute-force guessing of passwords at the main login  page, but many systems make an effort to detect or even prevent this. There  could be logfiles, account lockouts, or other devices that would substantially  impede our efforts, but because of the non-sanitized inputs, we have another  avenue that is much less likely to be so protected.</p>
<p>We'll instead do actual password testing in our snippet by including the  email name and password directly. In our example, we'll use our victim,  <strong>bob@example.com</strong> and try multiple passwords.</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">bob@example.com' AND passwd = 'hello123</span>';</pre>
<p>This is clearly well-formed SQL, so we don't expect to see any server errors,  and we'll know we found the password when we receive the "your password has been  mailed to you" message. Our mark has now been tipped off, but we do have his  password.</p>
<p>This procedure can be automated with scripting in perl, and though we were in  the process of creating this script, we ended up going down another road before  actually trying it.</p>
<h1>The database isn't readonly</h1>
<p>So far, we have done nothing but <strong>query</strong> the database, and even though a  <strong>SELECT</strong> is readonly, that doesn't mean that <strong>SQL</strong> is. SQL uses the  semicolon for statement termination, and if the input is not sanitized properly,  there may be nothing that prevents us from stringing our own unrelated command  at the end of the query.</p>
<p>The most drastic example is:</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">x'; DROP TABLE members; --</span>';  -- Boom!</pre>
<p>The first part provides a dummy email address -- <strong>'x'</strong> -- and we don't  care what this query returns: we're just getting it out of the way so we can  introduce an unrelated SQL command. This one attempts to drop (delete) the  entire <strong>members</strong> table, which really doesn't seem too sporting.</p>
<p>This shows that not only can we run separate SQL commands, but we can also  modify the database. This is promising.</p>
<h1>Adding a new member</h1>
<p>Given that we know the partial structure of the <strong>members</strong> table, it  seems like a plausible approach to attempt adding a new record to that table: if  this works, we'll simply be able to login directly with our newly-inserted  credentials.</p>
<p>This, not surprisingly, takes a bit more SQL, and we've wrapped it over  several lines for ease of presentation, but our part is still one contiguous  string:</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">x';</span>
        <span class="snip">INSERT INTO members ('email','passwd','login_id','full_name') </span>
        <span class="snip">VALUES ('steve@unixwiz.net','hello','steve','Steve Friedl');--</span>';</pre>
<p>Even if we have actually gotten our field and table names right, several  things could get in our way of a successful attack:</p>
<ol>
<li>We might not have enough room in the web form to enter this much text  directly (though this can be worked around via scripting, it's much less  convenient).</li>
<li>The web application user might not have <strong>INSERT</strong> permission on the  <strong>members</strong> table.</li>
<li>There are undoubtedly other fields in the <strong>members</strong> table, and some may  <em>require</em> initial values, causing the <strong>INSERT</strong> to fail.</li>
<li>Even if we manage to insert a new record, the application itself might not  behave well due to the auto-inserted NULL fields that we didn't provide values  for.</li>
<li>A valid "member" might require not only a record in the <strong>members</strong> table, but associated information in other tables (say, "accessrights"), so  adding to one table alone might not be sufficient.</li>
</ol>
<p>In the case at hand, we hit a roadblock on either #4 or #5 - we can't really  be sure -- because when going to the main login page and entering in the above  username + password, a server error was returned. This suggests that fields we  did not populate were vital, but nevertheless not handled properly.</p>
<p>A possible approach here is attempting to guess the other fields, but this  promises to be a long and laborious process: though we may be able to guess  other "obvious" fields, it's very hard to imagine the bigger-picture  organization of this application.</p>
<p>We ended up going down a different road.</p>
<h1>Mail me a password</h1>
<p>We then realized that though we are not able to add a new record to the  <strong>members</strong> database, we can <strong>modify</strong> an existing one, and this proved  to be the approach that gained us entry.</p>
<p>From a previous step, we knew that <strong>bob@example.com</strong> had an account on  the system, and we used our SQL injection to update his database record with  <strong>our</strong> email address:</p>
<pre>SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '<span class="snip">x';</span>
      <span class="snip">UPDATE members</span>
      <span class="snip">SET email = 'steve@unixwiz.net'</span>
      <span class="snip">WHERE email = 'bob@example.com</span>';</pre>
<p>After running this, we of course received the "we didn't know your email  address", but this was expected due to the dummy email address provided. The  <strong>UPDATE</strong> wouldn't have registered with the application, so it executed  quietly.</p>
<p>We then used the regular "I lost my password" link - with the updated email  address - and a minute later received this email:</p>
<pre>From: system@example.com
To: steve@unixwiz.net
Subject: Intranet login

This email is in response to your request for your Intranet log in information.
Your User ID is: bob
Your password is: hello</pre>
<p>Now it was now just a matter of following the standard login process to  access the system as a high-ranked MIS staffer, and this was far superior to a  perhaps-limited user that we might have created with our <strong>INSERT</strong> approach.</p>
<p>We found the intranet site to be quite comprehensive, and it included - among  other things - a list of all the users. It's a fair bet that many Intranet sites  also have accounts on the corporate Windows network, and perhaps some of them  have used the same password in both places. Since it's clear that we have an  easy way to retrieve any Intranet password, and since we had located an open  PPTP VPN port on the corporate firewall, it should be straightforward to attempt  this kind of access.</p>
<p>We had done a spot check on a few accounts without success, and we can't  really know whether it's "bad password" or "the Intranet account name differs  from the Windows account name". But we think that automated tools could make  some of this easier.</p>
<h1>Other Approaches</h1>
<p>In this particular engagement, we obtained enough access that we did not feel  the need to do much more, but other steps could have been taken. We'll touch on  the ones that we can think of now, though we are quite certain that this is not  comprehensive.</p>
<p>We are also aware that not all approaches work with all databases, and we can  touch on some of them here.</p>
<dl>
<dt>Use xp_cmdshell </dt>
<dd>Microsoft's SQL Server supports a stored procedure <a href="http://msdn.microsoft.com/library/en-us/tsqlref/ts_xp_aa-sz_4jxo.asp">xp_cmdshell </a>that permits what amounts to arbitrary command execution, and if this is  permitted to the web user, complete compromise of the webserver is inevitable. </dd>
<dd>What we had done so far was limited to the web application and the  underlying database, but if we can run commands, the webserver itself cannot  help but be compromised. Access to <strong>xp_cmdshell</strong> is usually limited to  administrative accounts, but it's possible to grant it to lesser users. </dd>
<dt>Map out more database structure </dt>
<dd>Though this particular application provided such a rich post-login  environment that it didn't really seem necessary to dig further, in other more  limited environments this may not have been sufficient. </dd>
<dd>Being able to systematically map out the available schema, including tables  and their field structure, can't help but provide more avenues for compromise of  the application. </dd>
<dd>One could probably gather more hints about the structure from other aspects  of the website (e.g., is there a "leave a comment" page? Are there "support  forums"?). Clearly, this is highly dependent on the application and it relies  very much on making good guesses. </dd>
</dl>
<h1>Mitigations</h1>
<p>We believe that web application developers often simply do not think about  "surprise inputs", but security people do (including the bad guys), so there are  three broad approaches that can be applied here.</p>
<dl>
<dt>Sanitize the input </dt>
<dd>It's absolutely vital to sanitize user inputs to insure that they do not  contain dangerous codes, whether to the SQL server or to HTML itself. One's  first idea is to strip out "bad stuff", such as quotes or semicolons or escapes,  but this is a misguided attempt. Though it's easy to point out <strong>some</strong> dangerous characters, it's harder to point to <strong>all</strong> of them. </dd>
<dd>The language of the web is full of special characters and strange markup  (including alternate ways of representing the same characters), and efforts to  authoritatively identify all "bad stuff" are unlikely to be successful. </dd>
<dd>Instead, rather than "remove known bad data", it's better to "remove  everything but known good data": this distinction is crucial. Since - in our  example - an email address can contain only these characters: </dd>
<dd>
<pre>abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
@.-_+</pre>
</dd>
<dd>There is really no benefit in allowing characters that could not be valid,  and rejecting them early - presumably with an error message - not only helps  forestall SQL Injection, but also catches mere typos early rather than stores  them into the database. </dd>
<dd>
<blockquote><p>Sidebar on email addresses</p>
<hr />It's important to note here that email addresses <em>in particular</em> are  troublesome to validate programmatically, because everybody seems to have his  own idea about what makes one "valid", and it's a shame to exclude a good email  address because it contains a character you didn't think about.</p>
<p>The only real authority is <a href="http://rfc.net/rfc2822.html">RFC 2822</a> (which encompasses the more familiar RFC822), and it includes a fairly expansive  definition of what's allowed. The truly pedantic may well wish to accept email  addresses with ampersands and asterisks (among other things) as valid, but  others - including this author - are satisfied with a reasonable subset that  includes "most" email addresses.</p>
<p>Those taking a more restrictive approach ought to be fully aware of the  consequences of excluding these addresses, especially considering that better  techniques (prepare/execute, stored procedures) obviate the security concerns  which those "odd" characters present.</p>
<hr /></blockquote>
</dd>
<dd>Be aware that "sanitizing the input" doesn't mean merely "remove the  quotes", because even "regular" characters can be troublesome. In an example  where an integer ID value is being compared against the user input (say, a  numeric PIN): </dd>
<dd>
<pre>SELECT <em>fieldlist</em>
  FROM <em>table</em>
 WHERE id = <span class="snip">23 OR 1=1</span>;  -- Boom! Always matches!</pre>
</dd>
<dd>In practice, however, this approach is highly limited because there are so  few fields for which it's possible to outright exclude many of the dangerous  characters. For "dates" or "email addresses" or "integers" it may have merit,  but for any kind of real application, one simply cannot avoid the other  mitigations. </dd>
<dt>Escape/Quotesafe the input </dt>
<dd>Even if one might be able to sanitize a phone number or email address, one  cannot take this approach with a "name" field lest one wishes to exclude the  likes of Bill <strong>O'Reilly</strong> from one's application: a quote is simply a valid  character for this field. </dd>
<dd>One includes an actual single quote in an SQL string by putting two of them  together, so this suggests the obvious - but wrong! - technique of preprocessing  every string to replicate the single quotes: </dd>
<dd>
<pre>SELECT <em>fieldlist</em>
  FROM customers
 WHERE name = '<span class="snip">Bill O''Reilly</span>';  -- works OK</pre>
</dd>
<dd>However, this naïve approach can be beaten because most databases support  other string escape mechanisms. MySQL, for instance, also permits <strong>\'</strong> to  escape a quote, so after input of <span class="snip">\'; DROP TABLE users;  --</span> is "protected" by doubling the quotes, we get: </dd>
<dd>
<pre>SELECT <em>fieldlist</em>
  FROM customers
 WHERE name = '<span class="snip">\''; DROP TABLE users; --</span>';  -- Boom!</pre>
</dd>
<dd>The expression <span class="snip">'\''</span> is a complete string (containing  just one single quote), and the usual SQL shenanigans follow. It doesn't stop  with backslashes either: there is Unicode, other encodings, and parsing oddities  all hiding in the weeds to trip up the application designer. </dd>
<dd>Getting quotes right is <strong>notoriously</strong> difficult, which is why many  database interface languages provide a function that does it for you. When the  same internal code is used for "string quoting" and "string parsing", it's much  more likely that the process will be done properly and safely. </dd>
<dd>Some examples are the MySQL function <strong>mysql_real_escape_string()</strong> and  perl DBD method <strong>$dbh-&#62;quote($value)</strong>. </dd>
<dd><strong><em>These methods must be used</em></strong>. </dd>
<dt>Use bound parameters (the <strong>PREPARE</strong> statement) </dt>
<dd>Though quotesafing is a good mechanism, we're still in the area of  "considering user input as SQL", and a much better approach exists: <strong>bound  parameters</strong>, which are supported by essentially all database programming  interfaces. In this technique, an SQL statement string is created with  placeholders - a question mark for each parameter - and it's compiled  ("prepared", in SQL parlance) into an internal form. </dd>
<dd>Later, this prepared query is "executed" with a list of parameters: </dd>
<dd>
<div class="blocklabel">Example in perl</div>
<pre>$sth = $dbh-&#62;prepare("SELECT email, userid FROM members WHERE email = <span class="snip">?</span>;");

$sth-&#62;execute(<span class="snip">$email</span>);</pre>
</dd>
<dd>Thanks to Stefan Wagner, this demonstrates bound parameters in Java: </dd>
<dd>
<div class="blocklabel">Insecure version</div>
<pre>Statement s = connection.createStatement();
ResultSet rs = s.executeQuery("SELECT email FROM member WHERE name = "
                             + <span class="snip">formField</span>); // *boom*</pre>
</dd>
<dd>
<div class="blocklabel">Secure version</div>
<pre>PreparedStatement ps = connection.prepareStatement(
    "SELECT email FROM member WHERE name = <span class="snip">?</span>");
ps.setString(1, <span class="snip">formField</span>);
ResultSet rs = ps.executeQuery();</pre>
</dd>
<dd>Here, <strong>$email</strong> is the data obtained from the user's form, and it is  passed as positional parameter #1 (the first question mark), and at no point do  the contents of this variable have anything to do with SQL statement parsing.  Quotes, semicolons, backslashes, SQL comment notation - none of this has any  impact, because it's "just data". There simply is nothing to subvert, so the  application is be largely immune to SQL injection attacks. </dd>
<dd>There also may be some performance benefits if this prepared query is reused  multiple times (it only has to be parsed <em>once</em>), but this is minor  compared to the <strong>enormous</strong> security benefits. This is probably the single  most important step one can take to secure a web application. </dd>
<dt>Limit database permissions and segregate users </dt>
<dd>In the case at hand, we observed just two interactions that are made not in  the context of a logged-in user: "log in" and "send me password". The web  application ought to use a database connection with the most limited rights  possible: query-only access to the <strong>members</strong> table, and no access to any  other table. </dd>
<dd>The effect here is that even a "successful" SQL injection attack is going to  have much more limited success. Here, we'd not have been able to do the  <strong>UPDATE</strong> request that ultimately granted us access, so we'd have had to  resort to other avenues. </dd>
<dd>Once the web application determined that a set of valid credentials had been  passed via the login form, it would then switch that session to a database  connection with more rights. </dd>
<dd>It should go almost without saying that <strong>sa</strong> rights should <em>never</em> be used for any web-based application. </dd>
<dt>Use stored procedures for database access </dt>
<dd>When the database server supports them, use stored procedures for performing  access on the application's behalf, which can eliminate SQL entirely (assuming  the stored procedures themselves are written properly). </dd>
<dd>By encapsulating the rules for a certain action - query, update, delete,  etc. - into a single procedure, it can be tested and documented on a standalone  basis and business rules enforced (for instance, the "add new order" procedure  might reject that order if the customer were over his credit limit). </dd>
<dd>For simple queries this might be only a minor benefit, but as the operations  become more complicated (or are used in more than one place), having a single  definition for the operation means it's going to be more robust and easier to  maintain. </dd>
<dd><strong>Note</strong>: it's always possible to write a stored procedure that itself  constructs a query dynamically: this provides <strong>no</strong> protection against SQL  Injection - it's only proper binding with prepare/execute or direct SQL  statements with bound variables that provide this protection. </dd>
<dt>Isolate the webserver </dt>
<dd>Even having taken all these mitigation steps, it's nevertheless still  possible to miss something and leave the server open to compromise. One ought to  design the network infrastructure to <strong>assume</strong> that the bad guy will have  full administrator access to the machine, and then attempt to limit how that can  be leveraged to compromise other things. </dd>
<dd>For instance, putting the machine in a DMZ with extremely limited pinholes  "inside" the network means that even getting complete control of the webserver  doesn't automatically grant full access to everything else. This won't stop  everything, of course, but it makes it a lot harder. </dd>
<dt>Configure error reporting </dt>
<dd>The default error reporting for some frameworks includes developer debugging  information, and this <strong>cannot</strong> be shown to outside users. Imagine how much  easier a time it makes for an attacker if the full query is shown, pointing to  the syntax error involved. </dd>
<dd>This information <em>is</em> useful to developers, but it should be restricted  - if possible - to just internal users. </dd>
</dl>
<p>Note that not all databases are configured the same way, and not all even  support the same dialect of SQL (the "S" stands for "Structured", not  "Standard"). For instance, most versions of MySQL do not support subselects, nor  do they usually allow multiple statements: these are substantially complicating  factors when attempting to penetrate a network.</p>
<p>source: http://www.unixwiz.net/techtips/sql-injection.html</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Operasi Dasar Basis Data (Database)]]></title>
<link>http://mrkopetz.wordpress.com/?p=12</link>
<pubDate>Thu, 03 Jul 2008 06:59:43 +0000</pubDate>
<dc:creator>mrkopetz</dc:creator>
<guid>http://mrkopetz.wordpress.com/?p=12</guid>
<description><![CDATA[Operasi-operasi dasar dapat kita lakukan terhadap basis data meliputi:

Pembuatan basis data baru (c]]></description>
<content:encoded><![CDATA[<p>Operasi-operasi dasar dapat kita lakukan terhadap basis data meliputi:</p>
<ul>
<li>Pembuatan basis data baru <strong><em>(create database),</em></strong> yang identik dengan pembuatan lemari arsip yang baru.</li>
<li>Penghapusan basis data <strong><em>(drop database),</em></strong> yang identik dengan pengrusakan lemari arsip (sekaligus beserta isinya jika ada).</li>
<li>Pembuatan file/tabel baru ke suatu basis data <strong><em>(create table),</em></strong> yang identik dengan penambahan map arsip baru ke sebuah lemari arsip yang telah ada.<!--more--></li>
<li>Penghapusan file/tabel dari suatu basis data <strong><em>(drop table),</em></strong> yang identik dengan perusakan map arsip lama yang ada di sebuah lemari arsip.</li>
<li>Penambahan/pengisian data baru ke sebuah file/tabel di sebuah basis data <strong><em>(insert),</em></strong> yang identik dengan penambahan lembaran arsip ke sebuah map arsip.</li>
<li>Pengambilan data dari sebuah file/tabel <strong><em>(retrieve/search/select),</em></strong> yang identik dengan pencarian lembaran arsip dari sebuah map arsip.</li>
<li>Pengubahan data dari file/tabel <strong><em>(update),</em></strong> yang identik dengan perbaikan isi lembaran arsip yang ada di sebuah lemari arsip.</li>
<li>Penghapusan data dari sebuah file/tabel <strong><em>(delete),</em></strong> yang identik dengan penghapusan sebuahlembaran arsip yang ada di sebuah map arsip.</li>
</ul>
<p>Sebuah basis data umumnya dibuat untuk mewakili sebuah semesta data yang spesifik. Misalnya, basis data <strong>kepegawaian</strong> yang mewakili semesta pegawai, basis data akademik, basis data inventori (pergudangan), dan lain sebagainya. Sementara dalam basis data terdapat <strong>file-file/tabel-tabel</strong> yang berisi data. Misalnya pada basis data kepegawaian kita dapat menempatkan file/tabel biodata_pegawai, jabatan, keluarga, penilaian_kerja, dan seterusnya.</p>
<p>Sumber:</p>
<ul>
<li>Fathansyah, Ir. <em>Basis Data. </em>Bandung: Penerbit Informatika Bandung, 1999</li>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Strategy for eliminating redundant legacy applications]]></title>
<link>http://davidstech.wordpress.com/?p=50</link>
<pubDate>Thu, 03 Jul 2008 05:20:53 +0000</pubDate>
<dc:creator>davidstech</dc:creator>
<guid>http://davidstech.wordpress.com/?p=50</guid>
<description><![CDATA[Application retirement is a viable strategy for eliminating redundant legacy applications, thereby i]]></description>
<content:encoded><![CDATA[<p><span style="font-size:10pt;"><a href="http://www.solix.com/application_retirement.htm" target="_blank">Application retirement</a> is a viable strategy for eliminating redundant legacy applications, thereby improving operational efficiency and reducing costs.  By reducing the number of applications within the IT infrastructure, DBAs can concentrate on maintaining critical business applications with the highest value to the organization instead of compiling data from disparate sources. <span>Solix</span> Application Sunsetting and Migration is part of the <a href="http://www.solix.com/index.htm" target="_blank"><span>Solix</span> Enterprise Data Management</a> Suite (<span>Solix</span> EDMS) that enables centralized management of data classification and security policies. At the core of the <span>Solix</span> EDMS is the <span>Solix</span> Metadata Manager, which manages multiple applications and data types across at hardware platforms through a unified policy manager.</span></p>
]]></content:encoded>
</item>

</channel>
</rss>
