㈠ 電腦藍屏 錯誤代碼0*0000008e,0*00000050,0*000000d1這三個頻率最高
0x0000008E藍屏錯誤症狀:
xp 系統運行時藍屏 錯誤代碼:
0x0000008E (0xC0000005,0xF0EFEB3B,0xEFF2296C,0x00000000)
不知道是因為中毒還是軟體沖突。老是彈跳出不相關網頁的時候用上網助手攔截後出現這個問題的。重起幾次都不行,我以為我設了什麼不該設的東西,所以就按照藍屏的提示,進入F8恢復了一些東西,然後再重起。但是系統總是提醒什麼內存錯誤之類的。我只好重新的安裝,可是問題是以前安裝很順利,這次安裝要麼無法讀盤,要麼復制一半再次的藍屏。好不容易重新安裝好了,可是還是提示我應用程序錯誤,0x00f8e521指令引用0x00000000的內存,內存無法 「read」(有時是其他的錯誤代碼)。我又重裝,還是不行。
解決:
0x????????」指令引用的「0x????????」內存。該內存不能為「read」。
「0x????????」指令引用的「0x????????」內存,該內存不能為「written」。
以上的情況相信大家都應該見到過,甚至說一些網友因為不爽於這個經常出現的錯誤提示而屢次重裝系統。相信普通用戶應該不會理解那些復雜的十六進制代碼。
出現這個現象有方面的,一是硬體,即內存方面有問題,二是軟體,這就有多方面的問題了。
一.先說說硬體:
一般來說,電腦硬體是很不容易壞的。內存出現問題的可能性並不大(除非你的內存真的是雜牌的一塌徒地),主要方面是:
1。內存條壞了(二手內存情況居多)
2。使用了有質量問題的內存。
3。內存插在主板上的金手指部分灰塵太多。
4。使用不同品牌不同容量的內存,從而出現不兼容的情況。
5。超頻帶來的散熱問題。你可以使用MemTest 這個軟體來檢測一下內存,它可以徹底的檢測出內存的穩定度。
二、如果都沒有,那就從軟體方面排除故障了。
先說原理:內存有個存放數據的地方叫緩沖區,當程序把數據放在緩沖區,需要操作系統提供的「功能函數」來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是「動態內存分配」,內存地址也就是編程中的「游標」。內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時系統函數會返回一個0值,這時返回值「0」已不表示新啟用的游標,而是系統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程序的「健壯性」。若應用程序沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用游標,繼續在之後的執行中使用這塊內存。真正的0地址內存區儲存的是計算機系統中最重要的「中斷描述符表」,絕對不允許應用程序使用。在沒有保護機制的操作系統下(如DOS),寫數據到這個地址會導致立即當機,而在健壯的操作系統中,如Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由操作系統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的內存不能為「read」錯誤,並指出被引用的內存地址為 「0x00000000「。內存分配失敗故障的原因很多,內存不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作系統使用很長時間後,安裝了多種應用程序(包括無意中「安裝」的病毒程序),更改了大量的系統參數和系統檔案之後。
在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試圖讀寫一塊「應該可用」的內存,但不知為什麼,這個預料中可用的游標已經失效了。有可能是「忘記了」向操作系統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等。注銷了的內存被系統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程序唯一的下場就是被操作終止執行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊!像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效游標不一定總是0,因此錯誤提示中的內存地址也不一定為 「0x00000000」,而是其它隨機數字。
首先建議:
1、 檢查系統中是否有木馬或病毒。這類程序為了控制系統往往不負責任地修改系統,從而導致操作系統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。
2、 更新操作系統,讓操作系統的安裝程序重新拷貝正確版本的系統檔案、修正系統參數。有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序。
3、 盡量使用最新正式版本的應用程序、Beta版、試用版都會有BUG。
4、 刪除然後重新創建 Winnt\System32\Wbem\Repository 文件夾中的文件:在桌面上右擊我的電腦,然後單擊管理。 在"服務和應用程序"下,單擊服務,然後關閉並停止 Windows Management Instrumentation 服務。 刪除 Winnt\System32\Wbem\Repository 文件夾中的所有文件。(在刪除前請創建這些文件的備份副本。)打開"服務和應用程序",單擊服務,然後打開並啟動 Windows Management Instrumentation 服務。當服務重新啟動時,將基於以下注冊表項中所提供的信息重新創建這些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs
一般出現這個問題有兩方面的原因一個是硬體, 既內存方面有問題 .另一個就是軟體,這個就是多方面的問題了.
藍屏顯示「Stop 0x00000050」(停止 0x00000050)錯誤
症狀
在藍屏上收到下面的「Stop」錯誤信息:
*** STOP:0x00000050 (0xeb7ff002, 0x00000000, 0x8054af32, 0x00000001) PAGE_FAULT_IN_NONPAGED_AREA nt!ExFreePoolWithTag+237
當您在事件查看器中查看系統日誌時,可能會看到事件 ID 1003 條目,該條目的信息與以下信息類似:
日期:日期
來源:系統
錯誤時間:時間
類別: (102)
類型:錯誤
事件 ID: 1003
用戶:N/A
計算機:計算機
描述:錯誤代碼 00000050,parameter1 eb7ff002,parameter2 00000000,parameter3 8054af32,parameter4 00000001。
解決方案
要解決此問題,安全模式:通過使用「我的電腦」重命名惡意驅動程序
1. 在安全模式下啟動計算機。為此,請按照下列步驟操作: a. 重新啟動計算機。
b. 在計算機啟動時,反復按 F8 鍵(每秒一次)。 這會顯示 Microsoft Windows 高級啟動菜單選項。
c. 使用上箭頭鍵和下箭頭鍵突出顯示「安全模式」,然後按 Enter 鍵。
2. 打開 Internet Explorer 並在「地址欄」中鍵入 C:/WINDOWS/system32/drivers。
3. 啟用查看隱藏文件。為此,請按照下列步驟操作: a. 依次單擊「開始」、「我的電腦」、「工具」,然後單擊「文件夾選項」。
b. 單擊「查看」。
c. 單擊以清除「隱藏受保護的操作系統文件(推薦)」復選框。
d. 單擊以選擇「顯示所有文件和文件夾」,然後單擊以清除「隱藏已知文件類型的擴展名」。
e. 單擊以選擇「應用到所有文件夾」,然後單擊「確定」。
4. 查找命名為 C:/WINDOWS/system32/drivers 的文件夾。
5. 查找具有以下特徵的任何 .sys 文件: a. 隨機生成由八位小寫字母組成的文件名,例如 gbqxmhia.sys、upzvlbvv.sys 或 jsbmefvk.sys
b. 文件日期為 2005 年 1 月 11 日
c. 文件大小為 14 KB(13,824 位元組)
d. 已設置 Hidden 屬性
e. 文件沒有版本、產品名稱或製造商信息
6. 右鍵單擊該文件,然後選擇「重命名」。將該文件重命名為 malware.old,然後按 Enter 鍵。
7. 查找 /WINDOWS/system32。
8. 重命名下列文件(如果它們存在): • msupd5.exe (重命名為 msupd5.old)
• msupd4.exe (重命名為 msupd4.old)
• msupd.exe (重命名為 msupd.old)
• Reloadmede.exe (重命名為 Reloadmede.old)
9. 重新啟動計算機。
10. 確保已用最新簽名更新了用於防病毒/防間諜軟體 (antivirus/antispyware) 的軟體,然後執行一次完整的系統掃描。
本方法適用windows2000 XP 2003 各個版本。
㈡ 大牛們是怎麼閱讀 Android 系統源碼的
如果只是想看看一些常用類的實現, 在Android包管理器里把源碼下載下來, 隨便一個IDE配好Source Code的path看就行.
但如果想深入的了解Android系統, 那麼可以看下我的一些簡單的總結.
知識
java
Java是AOSP的主要語言之一. 沒得說, 必需熟練掌握.
熟練的Android App開發
linux
Android基於Linux的, 並且AOSP的推薦編譯環境是Ubuntu 12.04. 所以熟練的使用並了解Linux這個系統是必不可少的. 如果你想了解偏底層的代碼, 那麼必需了解基本的Linux環境下的程序開發. 如果再深入到驅動層, 那麼Kernel相關的知識也要具備.
Make
AOSP使用Make系統進行編譯. 了解基本的Makefile編寫會讓你更清晰了解AOSP這個龐大的項目是如何構建起來的.
Git
AOSP使用git+repo進行源碼管理. 這應該是程序員必備技能吧.
C++
Android系統的一些性能敏感模塊及第三方庫是用C++實現的, 比如: Input系統, Chromium項目(WebView的底層實現).
硬體
流暢的國際網路
AOSP代碼下載需要你擁有一個流暢的國際網路. 如果在下載代碼這一步就失去耐心的話, 那你肯定沒有耐心去看那亂糟糟的AOSP代碼. 另外, 好程序員應該都會需要一個流暢的Google.
一台運行Ubuntu 12.04的PC.
如果只是閱讀源碼而不做太多修改的話, 其實不需要太高的配置.
一台Nexus設備
AOSP項目默認只支持Nexus系列設備. 沒有也沒關系, 你依然可以讀代碼. 但如果你想在大牛之路走的更遠, 還是改改代碼, 然後刷機調試看看吧.
高品質USB線
要刷機時線壞了, 沒有更窩心的事兒了.
軟體
Ubuntu 12.04
官方推薦, 沒得選.
Oracle Java 1.6
注意不要用OpenJDK. 這是個坑, 官方文檔雖然有寫, 但還是單獨提一下.
安裝:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default
Eclipse
估計會有不少人吐槽, 為什麼要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結果還是Eclipse. 主要優點有:
有語法分析 (快速准確的類, 方法跳轉).
支持C++ (IntelliJ的C++支持做的太慢了).
嵌入了DDMS, View Hierarchy等調試工具.
為了提高效率, 花5分鍾背下常用快捷鍵非常非常值得.
調整好你的classpath, 不要導入無用的代碼. 因為AOSP項目代碼實在是太多了. 當你還不需要看C++代碼時, 不要為項目添加C++支持, 建索引過程會讓你崩潰.
Intellij IDEA
開發App必備. 當你要調試系統的某個功能是, 常常需要迅速寫出一個調試用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力.
巨人的肩膀
這個一定要先讀. 項目介紹, 代碼下載, 環境搭建, 刷機方法, Eclipse配置都在這里. 這是一切的基礎.
這個其實是給App開發者看的. 但是裡面也有不少關於系統機制的介紹, 值得細讀.
此老羅非彼老羅. 羅升陽老師的博客非常有營養, 基本可以作為指引你開始閱讀AOSP源碼的教程. 你可以按照博客的時間順序一篇篇挑需要的看.但這個系列的博客有些問題:
早期的博客是基於舊版本的Android;
大量的代碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.
鄧凡平老師也是為Android大牛, 博客同樣很有營養. 但是不像羅升陽老師的那麼系統. 更多的是一些技術點的深入探討.
Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這里基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了.
一定要能流暢的使用這個工具. 大量的相關知識是沒有人系統的總結的, 你需要自己搞定.
其它
代碼組織
AOSP的編譯單元不是和git項目一一對應的, 而是和Android.mk文件一一對應的. 善用mmm命令進行模塊編譯將節省你大量的時間.
Binder
這是Android最基礎的進程間通訊. 在Application和System services之間大量使用. 你不僅要知道AIDL如何使用, 也要知道如何手寫Binder介面. 這對你理解Android的Application和System services如何交互有非常重要的作用. Binder如何實現的倒不必著急看.
HAL
除非你對硬體特別感興趣或者想去方案公司上班, 否則別花太多時間在這一層.
CyanogenMod
這是一個基於AOSP的第三方Rom. 從這個項目的wiki里你能學到很多AOSP官方沒有告訴你的東西. 比如如何支持Nexus以外的設備.
DIA
這是一個Linux下畫UML的工具, 能夠幫你梳理看過的代碼.
XDA
㈢ SQL的觸發器源代碼 謝謝了
隨便搜集了一點覺得還挺全面的
創建觸發器,觸發器是一種特殊的存儲過程,在用戶試圖對指定的表執行指定的數據修改語句時自動執行。Microsoft® SQL Server™ 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創建多個觸發器。
語法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
參數
trigger_name
是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。
Table | view
是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。
WITH ENCRYPTION
加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。
AFTER
指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。
如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。
不能在視圖上定義 AFTER 觸發器。
INSTEAD OF
指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。
在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。
INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。
對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。
WITH APPEND
指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。
WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。
NOT FOR REPLICATION
表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。
AS
是觸發器要執行的操作。
sql_statement
是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。
當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。
觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表:
deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用:
SELECT *
FROM deleted
如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。
當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。
n
是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。
IF UPDATE (column)
測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。
可以在觸發器主體中的任意位置使用 UPDATE (column)。
column
是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。
IF (COLUMNS_UPDATED())
測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。
可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。
bitwise_operator
是用於比較運算的位運算符。
updated_bitmask
是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。
comparison_operator
是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask
是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。
注釋
觸發器常常用於強制業務規則和數據完整性。SQL Server 通過表創建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。
可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。
如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設置的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。
只有當觸發 SQL 語句(包括所有與更新或刪除的對象關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的運行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。
觸發器限制
CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。
觸發器只能在當前的資料庫中創建,不過觸發器可以引用當前資料庫的外部對象。
如果指定觸發器所有者名稱以限定觸發器,請以相同的方式限定表名。
在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發器操作。
如果一個表的外鍵在 DELETE/UPDATE 操作上定義了級聯,則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發器。
在觸發器內可以指定任意的 SET 語句。所選擇的 SET 選項在觸發器執行期間有效,並在觸發器執行完後恢復到以前的設置。
與使用存儲過程一樣,當觸發器激發時,將向調用應用程序返回結果。若要避免由於觸發器激發而向應用程序返回結果,請不要包含返回結果的 SELECT 語句,也不要包含在觸發器中進行變數賦值的語句。包含向用戶返回結果的 SELECT 語句或進行變數賦值的語句的觸發器需要特殊處理;這些返回的結果必須寫入允許修改觸發器表的每個應用程序中。如果必須在觸發器中進行變數賦值,則應該在觸發器的開頭使用 SET NOCOUNT 語句以避免返回任何結果集。
DELETE 觸發器不能捕獲 TRUNCATE TABLE 語句。盡管 TRUNCATE TABLE 語句實際上是沒有 WHERE 子句的 DELETE(它刪除所有行),但它是無日誌記錄的,因而不能執行觸發器。因為 TRUNCATE TABLE 語句的許可權默認授予表所有者且不可轉讓,所以只有表所有者才需要考慮無意中用 TRUNCATE TABLE 語句規避 DELETE 觸發器的問題。
無論有日誌記錄還是無日誌記錄,WRITETEXT 語句都不激活觸發器。
觸發器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
說明 由於 SQL Server 不支持系統表中的用戶定義觸發器,因此建議不要在系統表中創建用戶定義觸發器。
多個觸發器
SQL Server 允許為每個數據修改事件(DELETE、INSERT 或 UPDATE)創建多個觸發器。例如,如果對已有 UPDATE 觸發器的表執行 CREATE TRIGGER FOR UPDATE,則將創建另一個更新觸發器。在早期版本中,在每個表上,每個數據修改事件(INSERT、UPDATE 或 DELETE)只允許有一個觸發器。
說明 如果觸發器名稱不同,則 CREATE TRIGGER(兼容級別為 70)的默認行為是在現有的觸發器中添加其它觸發器。如果觸發器名稱相同,則 SQL Server 返回一條錯誤信息。但是,如果兼容級別等於或小於 65,則使用 CREATE TRIGGER 語句創建的新觸發器將替換同一類型的任何現有觸發器,即使觸發器名稱不同。有關更多信息,請參見 sp_dbcmptlevel。
遞歸觸發器
當在 sp_dboption 中啟用 recursive triggers 設置時,SQL Server 還允許觸發器的遞歸調用。
遞歸觸發器允許發生兩種類型的遞歸:
間接遞歸
直接遞歸
使用間接遞歸時,應用程序更新表 T1,從而激發觸發器 TR1,該觸發器更新表 T2。在這種情況下,觸發器 T2 將激發並更新 T1。
使用直接遞歸時,應用程序更新表 T1,從而激發觸發器 TR1,該觸發器更新表 T1。由於表 T1 被更新,觸發器 TR1 再次激發,依此類推。
下例既使用了間接觸發器遞歸,又使用了直接觸發器遞歸。假定在表 T1 中定義了兩個更新觸發器 TR1 和 TR2。觸發器 TR1 遞歸地更新表 T1。UPDATE 語句使 TR1 和 TR2 各執行一次。而 TR1 的執行將觸發 TR1(遞歸)和 TR2 的執行。給定觸發器的 inserted 和 deleted 表只包含與喚醒調用觸發器的 UPDATE 語句相對應的行。
說明 只有啟用 sp_dboption 的 recursive triggers 設置,才會發生上述行為。對於為給定事件定義的多個觸發器,並沒有確定的執行順序。每個觸發器都應是自包含的。
禁用 recursive triggers 設置只能禁止直接遞歸。若要也禁用間接遞歸,請使用 sp_configure 將 nested triggers 伺服器選項設置為 0。
如果任一觸發器執行了 ROLLBACK TRANSACTION 語句,則無論嵌套級是多少,都不會進一步執行其它觸發器。
嵌套觸發器
觸發器最多可以嵌套 32 層。如果一個觸發器更改了包含另一個觸發器的表,則第二個觸發器將激活,然後該觸發器可以再調用第三個觸發器,依此類推。如果鏈中任意一個觸發器引發了無限循環,則會超出嵌套級限制,從而導致取消觸發器。若要禁用嵌套觸發器,請用 sp_configure 將 nested triggers 選項設置為 0(關閉)。默認配置允許嵌套觸發器。如果嵌套觸發器是關閉的,則也將禁用遞歸觸發器,與 sp_dboption 的 recursive triggers 設置無關。
延遲名稱解析
SQL Server 允許 Transact-SQL 存儲過程、觸發器和批處理引用編譯時不存在的表。這種能力稱為延遲名稱解析。但是,如果 Transact-SQL 存儲過程、觸發器或批處理引用在存儲過程或觸發器中定義的表,則只有當兼容級別設置(通過執行 sp_dbcmptlevel 設置)等於 65 時,才會在創建時發出警告。如果使用批處理,則在編譯時發出警告。如果引用的表不存在,將在運行時返回錯誤信息。有關更多信息,請參見延遲名稱解析和編譯。
許可權
CREATE TRIGGER 許可權默認授予定義觸發器的表所有者、sysadmin 固定伺服器角色成員以及 db_owner 和 db_ddladmin 固定資料庫角色成員,並且不可轉讓。
若要檢索表或視圖中的數據,用戶必須在表或視圖中擁有 SELECT 語句許可權。若要更新表或視圖的內容,用戶必須在表或視圖中擁有 INSERT、DELETE 和 UPDATE 語句許可權。
如果視圖中存在 INSTEAD OF 觸發器,用戶必須在該視圖中有 INSERT、DELETE 和 UPDATE 特權,以對該視圖發出 INSERT、DELETE 和 UPDATE 語句,而不管實際上是否在視圖上執行了這樣的操作。
示例
A. 使用帶有提醒消息的觸發器
當有人試圖在 titles 表中添加或更改數據時,下例將向客戶端顯示一條消息。
說明 消息 50009 是 sysmessages 中的用戶定義消息。有關創建用戶定義消息的更多信息,請參見 sp_addmessage。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)
GO
B. 使用帶有提醒電子郵件的觸發器
當 titles 表更改時,下例將電子郵件發送給指定的人員 (MaryM)。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'
GO
C. 在 employee 和 jobs 表之間使用觸發器業務規則
由於 CHECK 約束只能引用定義了列級或表級約束的列,表間的任何約束(在下例中是指業務規則)都必須定義為觸發器。
下例創建一個觸發器,當插入或更新雇員工作級別 (job_lvls) 時,該觸發器檢查指定雇員的工作級別(由此決定薪水)是否處於為該工作定義的范圍內。若要獲得適當的范圍,必須引用 jobs 表。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'employee_insupd' AND type = 'TR')
DROP TRIGGER employee_insupd
GO
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,
@max_lvl tinyint,
@emp_lvl tinyint,
@job_id smallint
SELECT @min_lvl = min_lvl,
@max_lvl = max_lvl,
@emp_lvl = i.job_lvl,
@job_id = i.job_id
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id
JOIN jobs j ON j.job_id = i.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
RAISERROR ('The level for job_id:%d should be between %d and %d.',
16, 1, @job_id, @min_lvl, @max_lvl)
ROLLBACK TRANSACTION
END
D. 使用延遲名稱解析
下例創建兩個觸發器以說明延遲名稱解析。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'trig1' AND type = 'TR')
DROP TRIGGER trig1
GO
-- Creating a trigger on a nonexistent table.
CREATE TRIGGER trig1
on authors
FOR INSERT, UPDATE, DELETE
AS
SELECT a.au_lname, a.au_fname, x.info
FROM authors a INNER JOIN does_not_exist x
ON a.au_id = x.au_id
GO
-- Here is the statement to actually see the text of the trigger.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'TR' and o.name = 'trig1'
-- Creating a trigger on an existing table, but with a nonexistent
-- column.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'trig2' AND type = 'TR')
DROP TRIGGER trig2
GO
CREATE TRIGGER trig2
ON authors
FOR INSERT, UPDATE
AS
DECLARE @fax varchar(12)
SELECT @fax = phone
FROM authors
GO
-- Here is the statement to actually see the text of the trigger.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'TR' and o.name = 'trig2'
E. 使用 COLUMNS_UPDATED
下例創建兩個表:一個 employeeData 表和一個 auditEmployeeData 表。人力資源部的成員可以修改 employeeData 表,該表包含敏感的雇員薪水信息。如果更改了雇員的社會保險號碼 (SSN)、年薪或銀行帳戶,則生成審核記錄並插入到 auditEmployeeData 審核表。
通過使用 COLUMNS_UPDATED() 功能,可以快速測試對這些包含敏感雇員信息的列所做的更改。只有在試圖檢測對表中的前 8 列所做的更改時,COLUMNS_UPDATED() 才起作用。
USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'employeeData')
DROP TABLE employeeData
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'auditEmployeeData')
DROP TABLE auditEmployeeData
GO
CREATE TABLE employeeData (
emp_id int NOT NULL,
emp_bankAccountNumber char (10) NOT NULL,
emp_salary int NOT NULL,
emp_SSN char (11) NOT NULL,
emp_lname nchar (32) NOT NULL,
emp_fname nchar (32) NOT NULL,
emp_manager int NOT NULL
)
GO
CREATE TABLE auditEmployeeData (
audit_log_id uniqueidentifier DEFAULT NEWID(),
audit_log_type char (3) NOT NULL,
audit_emp_id int NOT NULL,
audit_emp_bankAccountNumber char (10) NULL,
audit_emp_salary int NULL,
audit_emp_SSN char (11) NULL,
audit_user sysname DEFAULT SUSER_SNAME(),
audit_changed datetime DEFAULT GETDATE()
)
GO
CREATE TRIGGER updEmployeeData
ON employeeData
FOR update AS
/*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/
IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/
BEGIN
-- Audit OLD record.
INSERT INTO auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'OLD',
del.emp_id,
del.emp_bankAccountNumber,
del.emp_salary,
del.emp_SSN
FROM deleted del
-- Audit NEW record.
INSERT INTO auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'NEW',
ins.emp_id,
ins.emp_bankAccountNumber,
ins.emp_salary,
ins.emp_SSN
FROM inserted ins
END
GO
/*Inserting a new employee does not cause the UPDATE trigger to fire.*/
INSERT INTO employeeData
VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32)
GO
/*Updating the employee record for employee number 101 to change the salary to 51000 causes the UPDATE trigger to fire and an audit trail to be proced.*/
UPDATE employeeData
SET emp_salary = 51000
WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO
/*Updating the employee record for employee number 101 to change both the bank account number and social security number (SSN) causes the UPDATE trigger to fire and an audit trail to be proced.*/
UPDATE employeeData
SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO
F. 使用 COLUMNS_UPDATED 測試 8 列以上
如果必須測試影響到表中前 8 列以外的列的更新時,必須使用 UBSTRING 函數測試由 COLUMNS_UPDATED 返回的適當的位。下例測試影響 Northwind.dbo.Customers 表中的第 3、第 5 或第 9 列的更新。
USE Northwind
DROP TRIGGER tr1
GO
CREATE TRIGGER tr1 ON Customers
FOR UPDATE AS
IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))
+ power(2,(5-1)))
AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))
)
PRINT 'Columns 3, 5 and 9 updated'
GO
UPDATE Customers
SET ContactName=ContactName,
Address=Address,
Country=Country
GO
㈣ 求三國群英傳ol源代碼
喜歡自己做的朋友就不要下載了「替換方法如下」服務端DATA里的npc_talk.txt」Stage.txt如:全國比武code=517//517換「全國比武LEVEL517.BIN:地圖文件也要替換服務端,客戶端[npcmsg]code=def_019389//查找msg=57765end=1script_1=scMIS_MovePos352352517//517換副本宮殿LEVEL809.BIN:地圖文件也要替換服務端,客戶端[npcmsg]code=def_011033//查找msg=51287end=1script_1=scMIS_MovePos928992809//809換[npcmsg]code=def_011045//查找msg=51310end=1script_1=scMIS_MovePos928992809//809換[npcmsg]code=def_011046//查找msg=51311end=1script_1=scMIS_MovePos11104992809//809換[npcmsg]code=def_011047//查找msg=51312end=1script_1=scMIS_MovePos20704992809//809換情人谷123:地圖文件「579580581"也要替換服務端,客戶端[npcmsg]code=def_019456//查找msg=57812option_id=def_019467def_019471def_019482//換:option_id=def_019475def_019476def_019477option_text=578135781457815//加:script_1=scMIS_GetEnterStageInfo5795805810//579,580,581換地圖如:[npcmsg]code=def_019456msg=57812option_id=def_019475def_019476def_019477option_text=578235782457825script_1=scMIS_GetEnterStageInfo5556590[npcmsg]code=def_019475//查找end=1script_1=scMIS_MovePos10561504579//579換[npcmsg]code=def_019476//查找end=1script_1=scMIS_MovePos10561504580//580換[npcmsg]code=def_019477//查找end=1script_1=scMIS_MovePos10561504581//581換情人谷456:地圖文件「582583584"也要替換服務端,客戶端[npcmsg]code=def_019485//查找msg=57837option_id=def_019496def_019500def_019482//換:option_id=def_019504def_019505def_019506option_text=578385783957840//加:script_1=scMIS_GetEnterStageInfo5825835840//582,583,584換地圖如下:[npcmsg]code=def_019485msg=57837option_id=def_019504def_019505def_019506option_text=578485784957850script_1=scMIS_GetEnterStageInfo6162640[npcmsg]code=def_019504//查找end=1script_1=scMIS_MovePos10561504582//582換[npcmsg]code=def_019505//查找end=1script_1=scMIS_MovePos10561504583//583換[npcmsg]code=def_019506//查找end=1script_1=scMIS_MovePos10561504584//584換下載用戶須替換地圖如下:\sgserver\soldata\Server.ini里要加以下地圖(LEVEL?。BINLEVEL?。WRDLEVEL?。H)全國比武:311替換517替換下載里的LEVEL311.BIN」才能左右相傳「副本宮殿:312替換809替換下載里的LEVEL312.BIN」才能左右相傳「情人谷123:55,56,59替換579,580,581情人谷345:61,62,64替換582,583,584客戶端在SOLDATA里小地圖如也須要替換如下:SOLUPD\Shape\Smap\55,56,59,61,62,64,311,312」替換小地圖「//UPDATA\SHAPE\SMAP\替換這裡面的579,580,581,582,583,584517809
㈤ 如何閱讀Android系統源碼
Android源碼兩個部分看得最多,一個是packages,就是各個系統應用的實現,另外就是framework,框架層的實現。 具體看什麼就看你想了解什麼。 工具eclipse也很好,build一下生成class path,各種轉跳非常方便,不需要grep了。
㈥ 源碼求助,device和vendor源碼
本帖最後由 pigjohn 於 2014-2-10 20:24 編輯
一、你需要:
1.linux系統環境
教程使用ubuntu 12.04(LTS)
硬碟安裝或虛擬機安裝應該都ok。
2.電腦配置不要太差
二、搭建編譯環境:
1.java安裝配置
1) 刪除舊版本java
ctrl+alt+t 打開終端。
sudo apt-get purge openjdk-\* icedtea-\* icedtea6-\*
sudo apt-get purge sun-java
復制代碼
2) 安裝java 1.6
添加軟體源,打開終端輸入
sudo add-apt-repository ppa:webupd8team/java
復制代碼
下載安裝,打開終端輸入
sudo apt-get update && sudo apt-get install oracle-java6-installer
復制代碼
跟隨屏幕提示,你需要接受使用條款。
安裝完成後,終端輸入java -version,你會看到java版本信息。類似
java version 「1.6.0_37″
Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode)
復制代碼
2.安裝依賴軟體
sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev zlib1g-dev:i386 libc6-dev lib32ncurses5-dev \
ia32-libs x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 \
lib32z-dev libgl1-mesa-dev g++-multilib mingw32 \
tofrodos python-markdown libxml2-utils xsltproc readline-common \
libreadline6-dev libreadline6 lib32readline-gplv2-dev libncurses5-dev \
lib32readline5 lib32readline6 libreadline-dev libreadline6-dev:i386 \
libreadline6:i386 bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev lib32bz2-dev \
libsdl1.2-dev libesd0-dev squashfs-tools pngcrush schedtool libwxgtk2.6-dev
復制代碼
等待安裝配置完成
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
復制代碼
㈦ 如何在Ubuntu13.10上安裝Sublime Text 3
如何在Ubuntu13.10上安裝Sublime Text 3
Sublime Text是一款很流行的源代碼文本編輯器,托Webupd8團隊的PPA倉庫之福,我們現在能通過PPA安裝Sublime Text 3,適用於ST的注冊用戶和未注冊用戶。
安裝Sublime Text 3
打開終端(Ctrl + Alt +T), 鍵入並運行下列命令:
$ sudo add-apt-repository ppa:webupd8team/sublime-text-3
$ sudo apt-get update
$ sudo apt-get install sublime-text-installer
㈧ 在windows系統下怎麼製作linux啟動安裝盤
方法/步驟
進win10官網msdn選擇操作系統,選擇win10選擇下載。至於怎麼在Linux下載ed2k鏈接則可以通過安裝源碼包Aria2,然後把ed2k用某雲盤先離線,接著通過chrome安裝插件通過Aria2下載。配置過程稍微復雜不在本文討論范圍。
㈨ u-boot使用make編譯出現找不到dtc命令,如何解決啊
我在ubuntu14.04上編譯uboot時也遇到了這個問題,dtc是device-tree-compiler的縮寫,即設備樹編譯器,說明系統中沒有安裝這個編譯器,我用的是apt-get install device-tree-compiler安裝後就可以成功編譯了哈。