2019/0401/SQL觸發程序&Asp.net自動寄信&認證信

SQLSERVER

觸發程序 TRIGGER

預存程序-> 結果

函數-> 值

觸發程序Trigger-> 最大差別在於,沒法透過呼叫,而是某個事件觸發後自動執行。

Ex. Updata delete 對資料定義或對資料有動作時觸發程序。

SQL 尾聲 交易程序

Update 從執行到 commit (交易成功),中間會檢測很多事情,

又稱為Transaction;access無法undo,交易一旦成功無法回復,

交易的特點(ACID),想像一下幾百萬人在使用資料庫,改了又改會怎樣?

中間會檢測很多事情,檢測什麼呢?會有很多檢核點,以UPDATA舉例

1.新增一筆新資料

2.將新資料丟入暫存資料inesrted,在最後commit成功時增加

3.將即將被刪除的資料放於deteted,再commit成功時刪除舊資料,

如果這三個步驟有一個錯,就會rollBACK,正確就會進入一堆檢核點,

Ex.各種下的條件約束check … ,最後會走到Trigger最後才會到commit(交易成功)。

Undo則是每一個步驟都有進行暫存。

前面檢核點無法檢核的商業邏輯可以藉由trigger做檢核,如沒過就可以rollback。

trigger分為兩種一種是跟著資料庫的,也有跟著資料表的

Ex.程式碼 after + 觸發時機

觸發程序執行順序大於Commit

Ex.2 將新增的資料在commit前全部秀出來

剛剛所有的例子都是 after trigger for insert

Ex.3 不符合商業邏輯就擋下來,

如果只能選四門課,選五門時必須退一筆才能新增。

在觸發程序內可能不能用等於比較要用大於等於、小於等於

Ex.4 改學分數時值不能小於原來的學分數

通常insert 與 delete 是互斥的較不會放在同一個trigger裡

Ex.5 兩個資料表實體上無關連邏輯上有關連。

為了保持完整性在刪除資料或增加時須考慮另外一張表資料相關性。

如果員工也是學生就不可更改與刪除資料。

不是擋下來而是取代

Instead trigger

不管再新增或是修改,沒有的資料就新增,既有的資料就修改。

如果課程資料表內的課程編號欄位內的課程編號,沒有就增加,有就修改

一個資料表配一個操作時只能用一次 instead

如果真的要使用兩次可以使用view,select 抓成一個view…

View通常拿來檢視資料,但其實可以新增修改刪除,

但沒有key則不會新增成功。

以上為資料表層級的觸發程序

接下來為資料庫觸發程序

DDL(資料定義語言) Trigger

但也不是所有的ddl 都可以放 trigger ,

且不能用instead(定義就是定義,並沒有執行取代資料)

暫時性要把觸發程序停止?IDE_GUI右鍵停用(要停止使用狀態)

停止資料表層級的觸發程序相當於修改TABLE的定義。

停止資料庫層級的觸發程序相當於修改SERVER上的定義。

一般 select * from table

一次全部讀取 -> 佔資源

資料指標Cursor 不止往前指還能往後指

相對於 asp.net sqldatareder

宣告靜態資料指標

宣告指標會佔資源,打開關閉後還必須要消除指標。

動指標 fetch 從第幾筆開始 位置為

不知道有幾筆 while

如果有讀到資料 @@FETCH_STATUS=0

沒資料的時候結束 @@FETCH_STATUS=-1

ASP.NET 系統寄送email

不可亂寄匿名信具有刑責

Mail server SMTP :兩台局端伺服器互相寄信,個人電腦是先寄到個人的Mail server局端,再藉由局對局做SMTP,以前可以匿名,因為濫用廣告信現在不能了,以前是使用POP3現在沒再用了,因為收取後就會消失;WebMail則是連線到伺服器去做寄送。

如何寄送?

在後端建造郵件伺服器位址物件

查詢domain cmd -> nslookup msa.hinet.net

簡單寄法 ( 純文字 )

myMail.send寄信的方法

看各自收件伺服器內的演算法

gmail會放在垃圾桶顯示

封包標頭

雅虎會錯殺一百收不到

第四層傳輸層 port

Ip 高雄港 > port 35號碼頭

ip分享器 第三層

Mac 網路卡 第二層

交換器(Switch) 第一層找到第七層

Google api 文件有說明如何登入個人gmail寄送信件

Using System.Net.Mail

Using System.Net

myMail.Credentials=new NetworkCredential帳號密碼方法

一般來講會放在資料庫中將帳號密碼讀近來

打開SSL進行加密myMail.EnableSsl = ture

以上為簡單的寄法

以下為較複雜的寄法

每一個都要建構為物件Ex.收件人 …

類別有兩種 mailaddress、mailmessage

建構完後ide就能顯示信件相關屬性做選擇

如果裡面要有圖則要用 html去寫,並且要打開html。

Msg.IsBodyHtml = ture; ( 有危險性,可以編寫惡意檔案。 )

myMail.Send(Msg) 有兩種輸入參數的方法,這裡一種上面一種。

降低帳號存取安全性。 Google 開啟 允許存取帳號

認證 判斷 效期 …

簡單方式 資料庫欄位預設未認證,發送信件附上超鏈結,點擊後判斷已認證。

自行研究

回到會員註冊33

增加@IsAuth欄位

將自動寄驗證信重新弄個函數

Protected 修飾詞 + void 沒有回傳值純呼叫 + 函數名稱 + ( 傳入參數 )

貼上34code

記得using

讀不到值 補傳入參數

修改34內容文本 認證還沒做 認證先做到這個地方

上面邏輯一進資料庫就呼叫此函數傳email參數值給此函數

完成認證只是將@IsAuth改為true

認證35寫認證

先回到33加上認證信網址

現在是測試所以網址為localhost,如果是實務則是公司的domain

從資料庫傳email與帳號近來

等等要秀 33 跟 35 的程式碼

題外話: 建置 = 編譯 與 鏈結 , 專案錯有時是別的檔案錯不是這隻檔案

實務上目的是要確認他的email為正確的才要做email認證。

33用網址帶參數過去35

QueryString抓網址上的參數集合包含(帳號)

有讀到就是有再回寫回去 (記得要用參數避免指令與值互用造成安全性問題) 秀認證完成訊息

完成

33註冊帳號寄送認證信 前端

33註冊帳號寄送認證信 後端

35認證信內頁內容 前端

35認證信內頁內容 後端

開啟command 執行完後執行期他的command前記得要關閉

忘記時直接查詢rd.Close();

如果認證沒成功記得要在登入時擋住或進去鎖住某些功能

明日待續… 要給會員自己修改資料,要如何讀圖片出來?

Gridview 鏈結 members ,現在欄位photo是檔案不是資料, 用讀資料的方法讀出來該怎麼顯示?

Gridview 自己跑出來的 columns 完全沒有物件可以顯示圖片

那用boundfield去資料繫結讀出來呢?

出來也會是system bytes …

Last updated

Was this helpful?