SQL資料庫相關

2022-04-08 08:29:54 字數 3164 閱讀 7757

資料庫相關知識點

sql, 對錶的理解, 對錶的主鍵, 外來鍵的理解, 檢視, 為什麼要有檢視, 檢視有什麼功能, 檢視與表有什麼區別

主鍵是唯一標識的一條記錄,不能重複,不能為空.

表的外來鍵是另乙個表的主鍵,可以重複,可以為空

索引,字段沒有重複值,可以有空值,可以有乙個或者多個唯一索引.

檢視是乙個或者多個表按照條件組合成的結果集

對錶用增刪改查等sql進行操作,對檢視權用select操作

儲存過程, 什麼是儲存過程是一組完成特定功能的程式集,編譯存放資料庫中,使用者指定名稱和引數就可以執行,接受引數,返回單個或多個結果集

儲存過程建立編譯時存在precedure cache中,所以比sql執行要快

儲存過程存在伺服器端,容易修改,而sql存在客戶端,修改後部署比較麻煩

如何通過dataset更新資料使用dataadpater的批量更新,好處是不用寫具體的sql指令碼,尤其是做web服務這個優勢非常吸引人。

sql server中join有幾種join: 如果表中有至少乙個匹配,則返回行 (也就是 inner join)

left join: 即使右表中沒有匹配,也從左表返回所有的行

right join: 即使左表中沒有匹配,也從右表返回所有的行

full join: 只要其中乙個表中存在匹配,就返回行

dataset強型別和弱型別的區別弱型別 dataset 和強型別 dataset 在效能上肯定是有區別的,但這種區別非常細微,完全可以忽略不計,總的來說強型別 dataset 應用起來簡單,不容易出錯

事實事務具有原子性,一致性,隔離性,持續性.

事實是應用程式一列表操作,所有操作必須成功完成,否則每個操作中所有的更改會被取消.

事務有兩種結果,1.當所有操作全部執行,事務提交.2.如果其中一步失敗,發生回滾操作.撤銷所有的操作.(select, update,delete).

游標定位結果集的行,通過判斷全域性變數@@fetch_status是否到最後不等於0表示到最後

觸發器型別?區別?

事前觸發器和事後觸發器。事前觸發器是在事件觸發之前完成,而事後觸發器是在事件完成之後觸發。

語句級觸發器和行級觸發器。語句級觸發器可以在語句執行完之前或者之後執行,而行級觸發器發生在觸發器所影響的每一行後觸發。

聚集索引和非聚集索引?

聚集索引,索引的順序就是物理儲存順序,而非聚集索引卻沒有這麼規定。

什麼是sql 注入,如何防範。

欺騙伺服器執行惡意的sql命令。

第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號

第二:刪除使用者輸入內容中的所有連字元

⑵ 用儲存過程來執行所有的查詢

⑶ 限制表單或查詢字串輸入的長度。

⑷ 檢查使用者輸入的合法性,確信輸入的內容只包含合法的資料。

⑸ 將使用者登入名稱、密碼等資料加密儲存。

⑹ 檢查提取資料的查詢所返回的記錄數量。

如何防範sql注入式攻擊?

好在要防止asp.net應用被sql注入式攻擊闖入並不是一件特別困難的事情,只要在利用表單輸入的內容構造sql命令之前,把所有輸入內容過濾一番就可以了。過濾輸入內容可以按多種方式進行。

⑴ 對於動態構造sql查詢的場合,可以使用下面的技術:

第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改sql命令的含義。再來看前面的例子,"select * from users where login = ''' or ''1''=''1' and password = ''' or ''1''=''1'"顯然會得到與"select * from users where login = '' or '1'='1' and password = '' or '1'='1'"不同的結果。

第二:刪除使用者輸入內容中的所有連字元,防止攻擊者構造出類如"select * from users where login = 'mas' -- and password =''"之類的查詢,因為這類查詢的後半部分已經被注釋掉,不再有效,攻擊者只要知道乙個合法的使用者登入名稱,根本不需要知道使用者的密碼就可以順利獲得訪問許可權。

第三:對於用來執行查詢的資料庫帳戶,限制其許可權用不同的使用者帳戶執行查詢、插入、更新、刪除操作。由於隔離了不同帳戶可執行的操作,因而也就防止了原本用於執行select命令的地方卻被用於執行insert、update或delete命令。

⑵ 用儲存過程來執行所有的查詢。sql引數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊。此外,它還使得資料庫許可權可以限制到只允許特定的儲存過程執行,所有的使用者輸入必須遵從被呼叫的儲存過程的安全上下文,這樣就很難再發生注入式攻擊了。

⑶ 限制表單或查詢字串輸入的長度。如果使用者的登入名字最多只有10個字元,那麼不要認可表單中輸入的10個以上的字元,這將大大增加攻擊者在sql命令中插入有害**的難度。

⑷ 檢查使用者輸入的合法性,確信輸入的內容只包含合法的資料。資料檢查應當在客戶端和伺服器端都執行——之所以要執行伺服器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。

在客戶端,攻擊者完全有可能獲得網頁的源**,修改驗證合法性的指令碼(或者直接刪除指令碼),然後將非法內容通過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。你可以使用許多內建的驗證物件,例如 regularexpressionvalidator,它們能夠自動生成驗證用的客戶端指令碼,當然你也可以插入伺服器端的方法呼叫。如果找不到現成的驗證物件,你可以通過customvalidator自己建立乙個。

⑸ 將使用者登入名稱、密碼等資料加密儲存。加密使用者輸入的資料,然後再將它與資料庫中儲存的資料比較,這相當於對使用者輸入的資料進行了"消毒"處理,使用者輸入的資料不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入sql命令。 system.web.security.formsauthentication類有乙個 hashpasswordforstoringinconfigfile,非常適合於對輸入資料進行消毒處理。

⑹ 檢查提取資料的查詢所返回的記錄數量。如果程式只要求返回乙個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理

資料庫系統相關SQL

查出所有被鎖住的表 select b.owner tableowner,b.object name tablename,c.osuser lockby,c.username loginid,c.sid sid,c.serial serial from v locked object a,dba ob...

資料庫同步相關的SQL語句

一 目標 二 例子 1 找出a表中不存在於b表的記錄。select a.序號 a.日期 a.ip a.部門 a.操作員 a.事件 from a where notexists select 1from b where a.序號 b.序號 2 將a表中不存在於b表的記錄,插入到b表中。insert i...

資料庫相關

1.操作類 godb public goosundb open throws sqlexception public void close public cursor search int mark mark mark,null,null,null,col date desc if cursor n...