2011年11月23日

          Java是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,java面向?qū)ο笠话阌腥筇卣鳎悍庋b、繼承、多態(tài)。

          封裝:就是把一些屬性和方法封裝到一個(gè)類(lèi)里。

          繼承:就如子類(lèi)繼承父類(lèi)的一些屬性和方法。

          多態(tài):就如一個(gè)父類(lèi)有多個(gè)不同特色的子類(lèi)。

          這里我就不多講解,下面我主要說(shuō)明一個(gè)繼承。繼承是OOP(面向?qū)ο螅┑囊粋€(gè)特色,java只支持單繼承(如果繼承兩個(gè)有同樣方法的父類(lèi),那么就不知道繼承到那個(gè)父類(lèi)的,所以java只支持單繼承)。繼承是java的一個(gè)特色,我們用的所以類(lèi)都繼承Objict類(lèi),所以就要Object類(lèi)的方法,如toString()、getClass()、wait()……所以我們建立的類(lèi)都有父類(lèi)。

          Java中一般有三種類(lèi):

          基本類(lèi):也就是一般的類(lèi)(一般所說(shuō)的類(lèi)就是基本類(lèi)),是對(duì)象的模板,是屬性和方法的集合。可以繼承其他基本類(lèi)、抽象類(lèi)、實(shí)現(xiàn)接口。

          抽象類(lèi):有抽象方法的類(lèi)(抽象方法就是該方法必須由繼承來(lái)實(shí)現(xiàn),本身只定義,不實(shí)現(xiàn))。抽象類(lèi)可以有一個(gè)或多個(gè)抽象方法,他是基本類(lèi)和接口類(lèi)的過(guò)度。

          接口類(lèi):一般叫做接口,該類(lèi)中的所有方法都是抽象方法,該類(lèi)的方法本身只定義不實(shí)現(xiàn)。

          抽象類(lèi)和接口一個(gè)由【abstract class + 抽象類(lèi)名】一個(gè)由【interface +接口名】定義,接口中的所以方法都是抽象方法,而抽象類(lèi)有部分方法是自身實(shí)現(xiàn)了的,一些只定義不實(shí)現(xiàn)。

          基本類(lèi)的定義:

          public class Fruit {

              public void price() {

                 System.out.println("水果價(jià)格");

              }

              public void weight() {

                 System.out.println("水果重量");

              }

          }

          抽象類(lèi)的定義:

          public abstract class Fruit {

              public void price() {

                 System.out.println("水果價(jià)格");

              }

              public abstract void weight();

          }

          接口類(lèi)的定義:

          public interface Fruit {

              public void price();

              public void weight() ;

          }

          從上面我們可以看出接口就是抽象類(lèi)的升級(jí)版,由于該類(lèi)的方法全是抽象方法,所以把a(bǔ)bstract換成interface。而接口的方法必須由子類(lèi)才能實(shí)現(xiàn)。

           

          繼承

          繼承基本類(lèi),可以繼承父類(lèi)的方法,也可以從些,也可以擴(kuò)充。下面是實(shí)現(xiàn)接口基本類(lèi)的類(lèi):

          public class Apple extends Fruit {

          }

          該類(lèi)中就有Fruit基本類(lèi)中的兩個(gè)方法:price()和weight();

          繼承抽象類(lèi),必須實(shí)現(xiàn)抽象類(lèi)的抽象方法,可以修改父類(lèi)的方法,和添加方法。下面是繼承抽象類(lèi)的類(lèi):

          public class Apple extends Fruit {

              @Override

              public void weight() {

                 System.out.println("水果重量");

              }

          }

          該類(lèi)繼承類(lèi)Fruit的price()方法,同時(shí)實(shí)現(xiàn)了Fruit抽象類(lèi)的weight()方法。

          繼承接口類(lèi)(也就實(shí)現(xiàn)接口),必須實(shí)現(xiàn)接口類(lèi)的所有的抽象類(lèi)和添加了。下面是繼承接口的類(lèi):

          public class Aple implements Fruit {

              @Override

              public void price() {

                 System.out.println("水果價(jià)格");

              }

              @Override

              public void weight() {

                 System.out.println("水果重量");

              }

          }

          該類(lèi)是實(shí)現(xiàn)Fruit接口的所以抽象方法。

           

          Java只支持單繼承(繼承基本類(lèi)和抽象類(lèi)),但是我們可以用接口來(lái)實(shí)現(xiàn)(多繼承接口來(lái)實(shí)現(xiàn))

          如:public class Apple extends Fruit implements Fruit1, Fruit2{}

          一般我們繼承基本類(lèi)和抽象類(lèi)用extends關(guān)鍵字,實(shí)現(xiàn)接口類(lèi)的繼承用implements關(guān)鍵字。其實(shí)繼承是很簡(jiǎn)單的,可以就是沒(méi)有弄清這兩個(gè)關(guān)鍵字,當(dāng)我們弄清楚也就是比較簡(jiǎn)單的。

          接口也可以繼承接口如:public interface Fruit1 extends Fruit {}這是接口中的多重繼承,同理抽象類(lèi)和基本類(lèi)也同理。如果我們把基本類(lèi)添加final修飾,也就定義該類(lèi)不被繼承,該類(lèi)不能作為父類(lèi)。同時(shí)基本類(lèi)的方法可以用public 、private、proptected來(lái)修飾方法,用final來(lái)阻止繼承該方法。

          這里只是自己的理解,有些地方時(shí)用詞不當(dāng)?shù)模皇怯X(jué)得這樣用詞更好的理解,請(qǐng)大家諒解。有些地方由于不是這里的重點(diǎn),沒(méi)有講清楚,希望大家通過(guò)其他方式了解。

          posted @ 2011-12-04 23:08 陳小東 閱讀(1076) | 評(píng)論 (0)編輯 收藏

          public class BubbleSort implements SortUtil.Sort{

               public void sort(int[] data) {

                  int temp;

                  for(int i=0;i<data.length;i++){

                      for(int j=data.length-1;j>i;j--){

                          if(data[j]<data[j-1]){

                              SortUtil.swap(data,j,j-1);

                          }

                      }

                  }

              }

          posted @ 2011-12-04 22:58 陳小東 閱讀(1124) | 評(píng)論 (0)編輯 收藏

          public class InsertSort implements SortUtil.Sort{

               public void sort(int[] data) {

                  int temp;

                  for(int i=1;i<data.length;i++){

                      for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){

                          SortUtil.swap(data,j,j-1);

                      }

                  }       

              }

          }

          posted @ 2011-12-04 22:57 陳小東 閱讀(732) | 評(píng)論 (0)編輯 收藏

          什么是SQL注入式攻擊?
          所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢(xún)字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶(hù)輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。常見(jiàn)的SQL注入式攻擊過(guò)程類(lèi)如:
          ⑴ 某個(gè)ASP.NET Web應(yīng)用有一個(gè)登錄頁(yè)面,這個(gè)登錄頁(yè)面控制著用戶(hù)是否有權(quán)訪問(wèn)應(yīng)用,它要求用戶(hù)輸入一個(gè)名稱(chēng)和密碼。
          ⑵ 登錄頁(yè)面中輸入的內(nèi)容將直接用來(lái)構(gòu)造動(dòng)態(tài)的SQL命令,或者直接用作存儲(chǔ)過(guò)程的參數(shù)。下面是ASP.NET應(yīng)用構(gòu)造查詢(xún)的一個(gè)例子:
          System.Text.StringBuilder query = new System.Text.StringBuilder(
             "SELECT * from Users WHERE login = '")
             .Append(txtLogin.Text).Append("' AND password='")
             .Append(txtPassword.Text).Append("'");

          ⑶ 攻擊者在用戶(hù)名字和密碼輸入框中輸入"'或'1'='1"之類(lèi)的內(nèi)容。
          ⑷ 用戶(hù)輸入的內(nèi)容提交給服務(wù)器之后,服務(wù)器運(yùn)行上面的ASP.NET代碼構(gòu)造出查詢(xún)用戶(hù)的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
          ⑸ 服務(wù)器執(zhí)行查詢(xún)或存儲(chǔ)過(guò)程,將用戶(hù)輸入的身份信息和服務(wù)器中保存的身份信息進(jìn)行對(duì)比。
          ⑹ 由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶(hù)身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)給攻擊者。
          如果攻擊者知道應(yīng)用會(huì)將表單中輸入的內(nèi)容直接用于驗(yàn)證身份的查詢(xún),他就會(huì)嘗試輸入某些特殊的SQL字符串篡改查詢(xún)改變其原來(lái)的功能,欺騙系統(tǒng)授予訪問(wèn)權(quán)限。
          系統(tǒng)環(huán)境不同,攻擊者可能造成的損害也不同,這主要由應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)的安全權(quán)限決定。如果用戶(hù)的帳戶(hù)具有管理員或其他比較高級(jí)的權(quán)限,攻擊者就可能對(duì)數(shù)據(jù)庫(kù)的表執(zhí)行各種他想要做的操作,包括添加、刪除或更新數(shù)據(jù),甚至可能直接刪除表
          如何防范SQL注入式攻擊?
          好在要防止ASP.NET應(yīng)用被SQL注入式攻擊闖入并不是一件特別困難的事情,只要在利用表單輸入的內(nèi)容構(gòu)造SQL命令之前,把所有輸入內(nèi)容過(guò)濾一番就可以了。過(guò)濾輸入內(nèi)容可以按多種方式進(jìn)行。
          ⑴ 對(duì)于動(dòng)態(tài)構(gòu)造SQL查詢(xún)的場(chǎng)合,可以使用下面的技術(shù):
          第一:替換單引號(hào),即把所有單獨(dú)出現(xiàn)的單引號(hào)改成兩個(gè)單引號(hào),防止攻擊者修改SQL命令的含義。再來(lái)看前面的例子,"SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'"顯然會(huì)得到與"SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'"不同的結(jié)果。
          第二:刪除用戶(hù)輸入內(nèi)容中的所有連字符,防止攻擊者構(gòu)造出類(lèi)如"SELECT * from Users WHERE login = 'mas' -- AND password =''"之類(lèi)的查詢(xún),因?yàn)檫@類(lèi)查詢(xún)的后半部分已經(jīng)被注釋掉,不再有效,攻擊者只要知道一個(gè)合法的用戶(hù)登錄名稱(chēng),根本不需要知道用戶(hù)的密碼就可以順利獲得訪問(wèn)權(quán)限。
          第三:對(duì)于用來(lái)執(zhí)行查詢(xún)的數(shù)據(jù)庫(kù)帳戶(hù),限制其權(quán)限。用不同的用戶(hù)帳戶(hù)執(zhí)行查詢(xún)、插入、更新、刪除操作。由于隔離了不同帳戶(hù)可執(zhí)行的操作,因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
          ⑵ 用存儲(chǔ)過(guò)程來(lái)執(zhí)行所有的查詢(xún)。SQL參數(shù)的傳遞方式將防止攻擊者利用單引號(hào)和連字符實(shí)施攻擊。此外,它還使得數(shù)據(jù)庫(kù)權(quán)限可以限制到只允許特定的存儲(chǔ)過(guò)程執(zhí)行,所有的用戶(hù)輸入必須遵從被調(diào)用的存儲(chǔ)過(guò)程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。
          ⑶ 限制表單或查詢(xún)字符串輸入的長(zhǎng)度。如果用戶(hù)的登錄名字最多只有10個(gè)字符,那么不要認(rèn)可表單中輸入的10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
          ⑷ 檢查用戶(hù)輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶(hù)端和服務(wù)器端都執(zhí)行——之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶(hù)端驗(yàn)證機(jī)制脆弱的安全性。
          在客戶(hù)端,攻擊者完全有可能獲得網(wǎng)頁(yè)的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過(guò)修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對(duì)象,例如 RegularExpressionValidator,它們能夠自動(dòng)生成驗(yàn)證用的客戶(hù)端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對(duì)象,你可以通過(guò)CustomValidator自己創(chuàng)建一個(gè)。
          ⑸ 將用戶(hù)登錄名稱(chēng)、密碼等數(shù)據(jù)加密保存。加密用戶(hù)輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)比較,這相當(dāng)于對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行了"消毒"處理,用戶(hù)輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。 System.Web.Security.FormsAuthentication類(lèi)有一個(gè) HashPasswordForStoringInConfigFile,非常適合于對(duì)輸入數(shù)據(jù)進(jìn)行消毒處理。
          ⑹ 檢查提取數(shù)據(jù)的查詢(xún)所返回的記錄數(shù)量。如果程序只要求返回一個(gè)記錄,但實(shí)際返回的記錄卻超過(guò)一行,那就當(dāng)作出錯(cuò)處理


          posted @ 2011-12-03 00:06 陳小東 閱讀(1104) | 評(píng)論 (0)編輯 收藏

          實(shí)體查詢(xún)
          例子1:
          Hql代碼 復(fù)制代碼
          1. String hql=”from User user ”;      
          2. List list=session.CreateQuery(hql).list();   


          因?yàn)镠QL語(yǔ)句與標(biāo)準(zhǔn)SQL語(yǔ)句相似,所以我們也可以在HQL語(yǔ)句中使用where字句,并且可以在where字句中使用各種表達(dá)式,比較操作符以及使用“and”,”or”連接不同的查詢(xún)條件的組合。看下面的一些簡(jiǎn)單的例子:
          Hql代碼 復(fù)制代碼
          1. from User user where user.age=20;  


          例子2(返回一個(gè)屬性):
          Hql代碼 復(fù)制代碼
          1. String hql= "select c.customerNamefrom Customer c“;   
          2. Query query= session.createQuery(hql);   
          3. Iteratorit = query.list().iterator();   
          4. System.out.println(query.list().size());   
          5. while(it.hasNext()) {   
          6. String c = (String)it.next();   
          7. System.out.println(c);   
          8. }  


          例子3(返回多個(gè)屬性):
          如果返回多個(gè)屬性,那么它們將被裝入數(shù)組或者集合中
          Hql代碼 復(fù)制代碼
          1. String hql= "select c.customerId, c.customerName“+   
          2. “from Customer c“;   
          3. Query query= session.createQuery(hql);   
          4. Iteratorit = query.list().iterator();   
          5. while(it.hasNext()) {   
          6. Object[] obj= (Object[])it.next();   // List list= (List)it.next();   
          7. Long id = (Long)obj[0];          //Long id = (Long)list.get(0);   
          8. String name = (String)obj[1];     //String name = (String)list.get(1);   
          9. System.out.println(id.longValue() + " " + name);   
          10. }  

          posted @ 2011-12-03 00:05 陳小東 閱讀(691) | 評(píng)論 (0)編輯 收藏

          摘要:

          1 加Salt散列
          2 ASP.NET 2.0 Membership中與密碼散列有關(guān)的代碼

          聲明:本文所羅列之源代碼均通過(guò)Reflector取自.NET Framework類(lèi)庫(kù),引用這些代碼僅出于學(xué)習(xí)和研究的目的。

          其實(shí),對(duì)密碼進(jìn)行散列存儲(chǔ)不是一個(gè)新鮮話題了,解決起來(lái)也不是很難,但很多人還是不大了解。這個(gè)小文只是強(qiáng)調(diào)一下“加Salt散列”這個(gè)簡(jiǎn)單的技術(shù),并給出ASP.NET Membership所使用的代碼。

          本來(lái)打算寫(xiě)一篇介紹如何實(shí)現(xiàn)用戶(hù)登錄功能的文章的,但因?yàn)闀r(shí)間有限,所以先介紹一下密碼的散列,下一篇再介紹用戶(hù)登錄。

          ----

          1 密碼必須散列存儲(chǔ)

          (內(nèi)容略)

          2 加Salt散列

          我們知道,如果直接對(duì)密碼進(jìn)行散列,那么黑客(統(tǒng)稱(chēng)那些有能力竊取用戶(hù)數(shù)據(jù)并企圖得到用戶(hù)密碼的人)可以對(duì)一個(gè)已知密碼進(jìn)行散列,然后通過(guò)對(duì)比散列值得到某用戶(hù)的密碼。換句話說(shuō),雖然黑客不能取得某特定用戶(hù)的密碼,但他可以知道使用特定密碼的用戶(hù)有哪些。

          加Salt可以一定程度上解決這一問(wèn)題。所謂加Salt,就是加點(diǎn)“佐料”。其基本想法是這樣的——當(dāng)用戶(hù)首次提供密碼時(shí)(通常是注冊(cè)時(shí)),由系統(tǒng)自動(dòng)往這個(gè)密碼里撒一些“佐料”,然后再散列。而當(dāng)用戶(hù)登錄時(shí),系統(tǒng)為用戶(hù)提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。

          這里的“佐料”被稱(chēng)作“Salt值”,這個(gè)值是由系統(tǒng)隨機(jī)生成的,并且只有系統(tǒng)知道。這樣,即便兩個(gè)用戶(hù)使用了同一個(gè)密碼,由于系統(tǒng)為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過(guò)自己的密碼和自己生成的散列值來(lái)找具有特定密碼的用戶(hù),但這個(gè)幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。

          下面詳細(xì)介紹一下加Salt散列的過(guò)程。介紹之前先強(qiáng)調(diào)一點(diǎn),前面說(shuō)過(guò),驗(yàn)證密碼時(shí)要使用和最初散列密碼時(shí)使用“相同的”佐料。所以Salt值是要存放在數(shù)據(jù)庫(kù)里的。


          用戶(hù)注冊(cè)時(shí):

          1)用戶(hù)提供密碼(以及其他用戶(hù)信息);
          2)系統(tǒng)為用戶(hù)生成Salt值;
          3)系統(tǒng)將Salt值和用戶(hù)密碼連接到一起;
          4)對(duì)連接后的值進(jìn)行散列,得到Hash值;
          5)將Hash值和Salt值分別放到數(shù)據(jù)庫(kù)中。


          登錄時(shí):
          1)用戶(hù)提供用戶(hù)名和密碼;
          2)系統(tǒng)通過(guò)用戶(hù)名找到與之對(duì)應(yīng)的Hash值和Salt值;
          3)系統(tǒng)將Salt值和用戶(hù)提供的密碼連接到一起;
          4)對(duì)連接后的值進(jìn)行散列,得到Hash'(注意有個(gè)“撇”);
          5)比較Hash和Hash'是否相等,相等則表示密碼正確,否則表示密碼錯(cuò)誤。

          3 ASP.NET 2.0 Membership中的相關(guān)代碼
          (省略關(guān)于Membership的介紹若干字)
          本文Anders Liu僅研究了SqlMembershipProvider,該類(lèi)位于System.Web.dll,System.Web.Security命名空間中。
          首先,要使用Membership,必須先用aspnet_regsql.exe命令來(lái)配置數(shù)據(jù)庫(kù),該工具會(huì)向現(xiàn)有數(shù)據(jù)庫(kù)中添加一系列表和存儲(chǔ)過(guò)程等,配置好的數(shù)據(jù)庫(kù)中有一個(gè)表aspnet_Membership,就是用于存放用戶(hù)帳戶(hù)信息的。其中我們所關(guān)注的列有三個(gè)——Password、PasswordFormat和PasswordSalt。

          Password存放的是密碼的散列值,PasswordFormat存放用于散列密碼所使用的算法,PasswordSalt就是系統(tǒng)生成的Salt值了。

          網(wǎng)站安全了,程序自然也就復(fù)雜了...
               discuz的加密方式:md5(md5($password).$salt),$salt是一個(gè)6位隨機(jī)數(shù)。
               注冊(cè)的時(shí)候,把用戶(hù)的密碼用md5(md5($password).$salt)加密,$salt是一個(gè)6位隨機(jī)數(shù)字,下面是我的一個(gè)獲取6位隨機(jī)數(shù)的一個(gè)方法:
               function randstr($len=6) {
               $chars='abcdefghijklmnopqrstuvwxyz0123456789';
          // characters to build the password from
               mt_srand((double)microtime()*1000000*getmypid());
          // seed the random number generater (must be done)
               $password='';
               while(strlen($password)<$len)
                   $password.=substr($chars,(mt_rand()%strlen($chars)),1);
               return $password;
          }
               $salt=randstr();把randstr()賦值給$salt,然后用md5(md5(會(huì)員提交的密碼).$salt)加密就可以了,但是千萬(wàn)不要忘了把$salt入庫(kù)哦(uc_members表)。
               登陸的時(shí)候根據(jù)用戶(hù)名把$salt取出來(lái),用md5(md5(會(huì)員提交的密碼).$salt)匹配密碼,如果一樣就登陸成功了

          posted @ 2011-11-29 09:40 陳小東 閱讀(1010) | 評(píng)論 (2)編輯 收藏

          繼承的優(yōu)缺點(diǎn)
          優(yōu)點(diǎn)
          新的實(shí)現(xiàn)很容易,因?yàn)榇蟛糠质抢^承而來(lái)的
          很容易修改和擴(kuò)展已有的實(shí)現(xiàn)

          缺點(diǎn)
          打破了封裝,因?yàn)榛?lèi)向子類(lèi)暴露了實(shí)現(xiàn)細(xì)節(jié)
          白盒重用,因?yàn)榛?lèi)的內(nèi)部細(xì)節(jié)通常對(duì)子類(lèi)是可見(jiàn)的
          當(dāng)父類(lèi)的實(shí)現(xiàn)改變時(shí)可能要相應(yīng)的對(duì)子類(lèi)做出改變
          不能在運(yùn)行時(shí)改變由父類(lèi)繼承來(lái)的實(shí)現(xiàn)
          由此可見(jiàn),組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu),一般情況下應(yīng)該優(yōu)先考慮組合。只


          有當(dāng)下列條件滿(mǎn)足時(shí)才考慮使用繼承:
          子類(lèi)是一種特殊的類(lèi)型,而不只是父類(lèi)的一個(gè)角色
          子類(lèi)的實(shí)例不需要變成另一個(gè)類(lèi)的對(duì)象
          子類(lèi)擴(kuò)展,而不是覆蓋或者使父類(lèi)的功能失效

          posted @ 2011-11-29 09:37 陳小東 閱讀(2605) | 評(píng)論 (2)編輯 收藏

          臨時(shí)表
              臨時(shí)表與永久表相似,但臨時(shí)表存儲(chǔ)在 tempdb 中,當(dāng)不再使用時(shí)會(huì)自動(dòng)刪除。
              臨時(shí)表有兩種類(lèi)型:本地和全局。它們?cè)诿Q(chēng)、可見(jiàn)性以及可用性上有區(qū)別。本地臨時(shí)表的名稱(chēng)以單個(gè)數(shù)字符號(hào) (#) 打頭;它們僅對(duì)當(dāng)前的用戶(hù)連接是可見(jiàn)的;當(dāng)用戶(hù)從 SQL Server 實(shí)例斷開(kāi)連接時(shí)被刪除。全局臨時(shí)表的名稱(chēng)以?xún)蓚€(gè)數(shù)字符號(hào) (##) 打頭,創(chuàng)建后對(duì)任何用戶(hù)都是可見(jiàn)的,當(dāng)所有引用該表的用戶(hù)從 SQL Server 斷開(kāi)連接時(shí)被刪除。
              例如,如果創(chuàng)建了 employees 表,則任何在數(shù)據(jù)庫(kù)中有使用該表的安全權(quán)限的用戶(hù)都可以使用該表,除非已將其刪除。如果數(shù)據(jù)庫(kù)會(huì)話創(chuàng)建了本地臨時(shí)表 #employees,則僅會(huì)話可以使用該表,會(huì)話斷開(kāi)連接后就將該表刪除。如果創(chuàng)建了 ##employees 全局臨時(shí)表,則數(shù)據(jù)庫(kù)中的任何用戶(hù)均可使用該表。如果該表在您創(chuàng)建后沒(méi)有其他用戶(hù)使用,則當(dāng)您斷開(kāi)連接時(shí)該表刪除。如果您創(chuàng)建該表后另一個(gè)用戶(hù)在使用該表,則 SQL Server 將在您斷開(kāi)連接并且所有其他會(huì)話不再使用該表時(shí)將其刪除。

          視圖視圖
              可以被看成是虛擬表或存儲(chǔ)查詢(xún)。除非是索引視圖,否則視圖的數(shù)據(jù)不會(huì)作為非重復(fù)對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù)中。數(shù)據(jù)庫(kù)中存儲(chǔ)的是 SELECT 語(yǔ)句。SELECT 語(yǔ)句的結(jié)果集構(gòu)成視圖所返回的虛擬表。用戶(hù)可以采用引用表時(shí)所使用的方法,在 Transact-SQL 語(yǔ)句中引用視圖名稱(chēng)來(lái)使用此虛擬表
              視圖是一個(gè)虛擬表,其內(nèi)容由查詢(xún)定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱(chēng)的列和行數(shù)據(jù)。視圖在數(shù)據(jù)庫(kù)中并不是以數(shù)據(jù)值存儲(chǔ)集形式存在,除非是索引視圖。行和列數(shù)據(jù)來(lái)自由定義視圖的查詢(xún)所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。
          對(duì)其中所引用的基礎(chǔ)表來(lái)說(shuō),視圖的作用類(lèi)似于篩選。定義視圖的篩選可以來(lái)自當(dāng)前或其他數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)表,或者其他視圖。分布式查詢(xún)也可用于定義使用多個(gè)異類(lèi)源數(shù)據(jù)的視圖。例如,如果有多臺(tái)不同的服務(wù)器分別存儲(chǔ)您的單位在不同地區(qū)的數(shù)據(jù),而您需要將這些服務(wù)器上結(jié)構(gòu)相似的數(shù)據(jù)組合起來(lái),這種方式就很有用。
              通過(guò)視圖進(jìn)行查詢(xún)沒(méi)有任何限制,通過(guò)它們進(jìn)行數(shù)據(jù)修改時(shí)的限制也很少。
              視圖種類(lèi):索引視圖和索引視圖
              SQL Server 2005 查詢(xún)處理器對(duì)索引視圖和非索引視圖將區(qū)別對(duì)待: 索引視圖的行以表的格式存儲(chǔ)在數(shù)據(jù)庫(kù)中。如果查詢(xún)優(yōu)化器決定使用查詢(xún)計(jì)劃的索引視圖,則索引視圖將按照基表的處理方式進(jìn)行處理。只有非索引視圖的定義才存儲(chǔ),而不存儲(chǔ)視圖的行。查詢(xún)優(yōu)化器將視圖定義中的邏輯納入執(zhí)行計(jì)劃,而該執(zhí)行計(jì)劃是它為引用非索引視圖的 SQL 語(yǔ)句生成的。
              SQL Server 查詢(xún)優(yōu)化器用于決定何時(shí)使用索引視圖的邏輯與用于決定何時(shí)對(duì)表使用索引的邏輯相似。如果索引視圖中的數(shù)據(jù)包括所有或部分 SQL 語(yǔ)句,而且查詢(xún)優(yōu)化器確定視圖的某個(gè)索引是低成本的訪問(wèn)路徑,則不論查詢(xún)中是否引用了該視圖的名稱(chēng),查詢(xún)優(yōu)化器都將選擇此索引。當(dāng) SQL 語(yǔ)句引用非索引視圖時(shí),分析器和查詢(xún)優(yōu)化器將分析 SQL 語(yǔ)句的源和視圖的源,然后將它們解析為單個(gè)執(zhí)行計(jì)劃。

          posted @ 2011-11-24 09:19 陳小東 閱讀(1003) | 評(píng)論 (0)編輯 收藏

          1. 數(shù)據(jù)抽象:物理抽象、概念抽象、視圖級(jí)抽象,內(nèi)模式、模式、外模式
          2. SQL語(yǔ)言包括數(shù)據(jù)定義、數(shù)據(jù)操縱(Data Manipulation),數(shù)據(jù)控制(Data Control)
          數(shù)據(jù)定義:Create Table,Alter Table,Drop Table, Craete/Drop Index等
          數(shù)據(jù)操縱:Select ,insert,update,delete,
          數(shù)據(jù)控制:grant,revoke
          3. SQL常用命令:
          CREATE TABLE Student(
          ID NUMBER PRIMARY KEY,
          NAME VARCHAR2(50) NOT NULL);//建表
          CREATE VIEW view_name AS
          Select * FROM Table_name;//建視圖
          Create UNIQUE INDEX index_name ON TableName(col_name);//建索引
          INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);//插入
          INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入視圖實(shí)際影響表
          UPDATE tablename SET name=’zang 3’ condition;//更新數(shù)據(jù)
          DELETE FROM Tablename WHERE condition;//刪除
          GRANT (Select,delete,…) ON (對(duì)象) TO USER_NAME [WITH GRANT OPTION];//授權(quán)
          REVOKE (權(quán)限表) ON(對(duì)象) FROM USER_NAME [WITH REVOKE OPTION] //撤權(quán)
          列出工作人員及其領(lǐng)導(dǎo)的名字:
          Select E.NAME, S.NAME FROM EMPLOYEE E S
          WHERE E.SUPERName=S.Name
          4. 視圖:
          5. 完整性約束:實(shí)體完整性、參照完整性、用戶(hù)定義完整性
          6. 第三范式:
          1NF:每個(gè)屬性是不可分的。 2NF:若關(guān)系R是1NF,且每個(gè)非主屬性都完全函數(shù)依賴(lài)于R的鍵。例SLC(SID#, CourceID#, SNAME,Grade),則不是2NF; 3NF:若R是2NF,且它的任何非鍵屬性都不傳遞依賴(lài)于任何候選鍵。
          7. ER(實(shí)體/聯(lián)系)模型
          8. 索引作用
          9. 事務(wù):是一系列的數(shù)據(jù)庫(kù)操作,是數(shù)據(jù)庫(kù)應(yīng)用的基本邏輯單位。事務(wù)性質(zhì):原子性、
          ? 原子性。即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。
          ? 一致性或可串性。事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)
          ? 隔離性。在事務(wù)正確提交之前,不允許把該事務(wù)對(duì)數(shù)據(jù)的任何改變提供給任何其他事務(wù),
          ? 持久性。事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫(kù)中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存。
          10. 鎖:共享鎖、互斥鎖
          兩段鎖協(xié)議:階段1:加鎖階段 階段2:解鎖階段
          11. 死鎖及處理:事務(wù)循環(huán)等待數(shù)據(jù)鎖,則會(huì)死鎖。
          死鎖處理:預(yù)防死鎖協(xié)議,死鎖恢復(fù)機(jī)制
          12. 存儲(chǔ)過(guò)程:存儲(chǔ)過(guò)程就是編譯好了的一些sql語(yǔ)句。
          1.存儲(chǔ)過(guò)程因?yàn)镾QL語(yǔ)句已經(jīng)預(yù)編繹過(guò)了,因此運(yùn)行的速度比較快。
          2. 可保證數(shù)據(jù)的安全性和完整性。通過(guò)存儲(chǔ)過(guò)程可以使沒(méi)有權(quán)限的用戶(hù)在控制之下間接地存取數(shù)據(jù)庫(kù),從而保證數(shù)據(jù)的安全。通過(guò)存儲(chǔ)過(guò)程可以使相關(guān)的動(dòng)作在一起發(fā)生,從而可以維護(hù)數(shù)據(jù)庫(kù)的完整性。
          3.可以降低網(wǎng)絡(luò)的通信量。存儲(chǔ)過(guò)程主要是在服務(wù)器上運(yùn)行,減少對(duì)客戶(hù)機(jī)的壓力。
          4:存儲(chǔ)過(guò)程可以接受參數(shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集以及返回值。可以向程序返回錯(cuò)誤原因
          5:存儲(chǔ)過(guò)程可以包含程序流、邏輯以及對(duì)數(shù)據(jù)庫(kù)的查詢(xún)。同時(shí)可以實(shí)體封裝和隱藏了數(shù)據(jù)邏輯。  
          13. 觸發(fā)器: 當(dāng)滿(mǎn)足觸發(fā)器條件,則系統(tǒng)自動(dòng)執(zhí)行觸發(fā)器的觸發(fā)體。
          觸發(fā)時(shí)間:有before,after.觸發(fā)事件:有insert,update,delete三種。觸發(fā)類(lèi)型:有行觸發(fā)、語(yǔ)句觸發(fā)
          14.內(nèi)聯(lián)接,外聯(lián)接區(qū)別?
          內(nèi)連接是保證兩個(gè)表中所有的行都要滿(mǎn)足連接條件,而外連接則不然。
          在外連接中,某些不滿(mǎn)條件的列也會(huì)顯示出來(lái),也就是說(shuō),只限制其中一個(gè)表的行,而不限制另一個(gè)表的行。分左連接、右連接、全連接三種

          posted @ 2011-11-24 09:17 陳小東 閱讀(5879) | 評(píng)論 (1)編輯 收藏

               摘要:   閱讀全文

          posted @ 2011-11-23 09:35 陳小東 閱讀(900) | 評(píng)論 (0)編輯 收藏


          posts - 34, comments - 38, trackbacks - 0, articles - 0

          Copyright © 陳小東

          主站蜘蛛池模板: 敦化市| 库车县| 鹤壁市| 福海县| 门源| 白玉县| 得荣县| 嵊泗县| 成都市| 西乡县| 桓台县| 芦溪县| 松滋市| 邹平县| 广昌县| 长寿区| 鹿邑县| 买车| 阿拉善盟| 六盘水市| 阿图什市| 腾冲县| 泾阳县| 衡山县| 武平县| 张北县| 铜梁县| 长岭县| 崇信县| 涟源市| 兴城市| 乌苏市| 呼玛县| 班戈县| 藁城市| 台前县| 石泉县| 昌平区| 广饶县| 竹溪县| 东源县|