觸發器視圖存儲過程
『壹』 他們的優點和缺點分別是什麼: 視圖、索引、存儲過程、觸發器
1、索引的優缺點
1)優點:可以大大提高系統的性能。它不僅可以加快數據檢索的速度,還能在檢索數據的過程中提高系統的性能,並且可以加速表與表之間的連接。
2)缺點:佔用更多的磁碟空間,並且降低添加、刪除和更新行的速度。雖然在大多數情況下,索引所帶來的數據檢索速度的優勢遠遠超過了它的缺陷,但過多的索引不一定能提高資料庫的性能。
2、視圖優點
1)集中用戶數據
2)簡化用戶操作
3)提高數據安全性
4)降低應用程序對底層表的依賴性
3、存儲過程優點
1)提高執行效率:存儲過程的執行速度比批處理的執行速度快。
2)增加系統編程能力:存儲過程使用編程設計模塊化。
3)減少網路通信量:在客戶計算機上執行存儲過程時,網路中傳送的只是該執行語句,而不用傳送組成該存儲過程中的sql語句,從而大大減少了網路流量。
4)保證系統安全:系統管理員通過對執行某一存儲過程的許可權進行限制,從而能夠實現對相應的數據訪問許可權的限制,避免非授權用戶對數據的訪問,保證數據的安全。
4、觸發器優點
1)強化約束:強制復雜業務的規則和要求,能實現比check語句更為復雜的約束。
2)跟蹤變化:觸發器可以偵測資料庫內的操作,從而禁止資料庫中未經許可的更新和變化。
3)級聯運行:偵測資料庫內的操作時,可自動地級聯影響整個資料庫的各項內容。
4)嵌套調用:觸發器可以調用一個或多個存儲過程。觸發器最多可以嵌套32層。
缺點:性能較低。因為在運行觸發器時,系統處理的大部分時間花費在參照其他表的處理上,這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。
『貳』 mysql中的存儲過程、觸發器、視圖的用法
建立存儲過程
Create procere、Create function
下面是它們的格式:
Create proceresp_Name ([proc_parameter ])
routine_body
這里的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,
OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的類型,這里給定的類型與返回值的類型要是一樣的,否則會報錯。
下面給出兩個簡單的例子來說明:
1、 顯示 Mysql 當前版本
執行結果
mysql> use welefen;
Database changed
mysql> delimiter // #定義//作為結束標記符號
mysql> create procere getversion(out param1 varchar(50)) #param1為傳出參數
-> begin
-> select version() into param1; #將版本的信息賦值給 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call getversion(@a); #調用getversion()這個存儲過程
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 顯示」hello world」
執行結果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello 『,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)
mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存儲過程的語句
前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。
Alter {procere | function} sp_Name []
Alter 語法是用來改變一個過程或函數的特徵,當你想改變存儲過程或者函數的結構時可以使
用它。當然你也可以先 drop 它再 create。
Drop {procere | function} [if exists] sp_Name
Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存
在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。
Show create {procere | function } sp_Name
Show 語法用來顯示創建的存儲過程或者函數的信息。這里的 show 用法跟數據表中的 show 用
法是很相似的。
Show {procere | function} status [like 'partten']
它返回子程序的特徵,如資料庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,
根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。
看了以上的幾個語法,你是不是感覺跟對表的操作很相象,那你就想對了,他們確實是很相似
的。帶著一份激動心情我們繼續往下看,你會發現很簡單。
Begin ... End 語句
通過 begin end 可以來包含多個語句,每個語句以「;」結尾。
Declare
用Declare 來聲明局部變數
Declarevar_Name type defaulevaule
Delare 條件
Declarecondition_Name CONDITION FOR condition_value
調用存儲過程
Call
格式:
Callsp_Name [parameter ]
這里的 sp_Name 必須是由 create procere 創建的名稱。它可以通過聲明的參數來傳回值,
它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。
流程式控制制語句
IF 語句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 語句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 語句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實現了一個簡單的循環,通過 LEAVE 來退出
LEAVE 語句
LEAVE lable
退出語句,一般可以用在循環中。
ITERATE 語句
ITERATE lable
ITERATE 一般出現在 LOOP、REPEATE、WHILE 里,意思是再次循環。
REPEATE 語句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內的語句或語句群被重復,直至 search_condition 為真。
WHILE 語句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內的語句或語句群被重復,直至 search_condition 為真。
運用實例
下面通過幾個例子來講述他們的應用:
對網站用戶的操作
為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:
代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用戶的存儲過程:
代碼片段
Delimiter //
Create procere insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
驗證用戶的存儲過程:
代碼片段
Delimiter //
Create procere validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密碼的存儲過程:
代碼片段
Delimiter //
Create procere modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
刪除用戶的存儲過程:
代碼片段
Delimiter //
Create procere deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客戶端,我們給出如下的程序:
代碼片段
文件名:ProcereUser.php
<?php
if (!mysql_connect("localhost","root","welefen")){
echo "連接資料庫失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇資料庫表失敗<br>";
}
$insert_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功<br>";
}else {
echo "添加用戶$insert_user[0]失敗<br>";
}
$validate_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗證正確<br>";
}else {
echo "用戶$validate_user[0]驗證錯誤<br>";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功<br>";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗<br>";
}
$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功<br>";
}else {
echo "用戶$delete_user[0]刪除失敗<br>";
}
?
程序運行的結果:
執行結果
添加用戶welefen 成功
用戶welefen 驗證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功
以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個
復雜的多。
驗證角谷猜想
角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必
能得到1。
例 如 : 初 始 整 數 為 9 , 則
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1
為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:
執行結果
mysql> delimiter //
mysql> create procere jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循環開始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不為 1,繼續循環
-> end if;
-> leave jiaogu; #退出循環
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在這個存儲過程中,你傳入的參數不能超過int 型數據的范圍,否則就會報錯。
觸發器
觸發器是與表有關的命名資料庫對象,當表上出現特定事件時,將激活該對象。例如當我們向
某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的
語句之前或之後觸發。
trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。
例如當我們向上面的user 表中增加一個用戶名為「welefen 」時,我們把記錄用戶數的表的值增
加 1;
代碼片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
視圖
當我們想得到數據表中某些欄位的信息,並想把他們保存時我們就可以用視圖。
語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我們想對上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;
『叄』 請問下mysql怎麼創建視圖,存儲過程,觸發器及他們 的作用,為什麼要創建
定義視圖,方便快捷查詢
create
view
v_user
as
select
*
from
table_user
定義過程,定義好業務邏輯
一次編譯,反復執行,效率高,速度快
create
procere
p_find_user(
sname
varchar)
as
begin
select
pss
from
table_user
where
name
=sname;
end
;
定義觸發器,方便對插入數據的整理,約束,或建議其他關聯關系。
create
trigger
tri_table
before
insert
on
table_name
for
each
row
begin
:new.id:=seq_table_name.nextval;
end
;
『肆』 JAVA用代碼操作資料庫創建表,視圖,觸發器,存儲過程等。
create
or
replace
trigger
trg_delete_count
before
delete
on
student
for
each
row
begin
delete
from
成績表
where
成績表.學號=:old.學號;
commit;
end;
想要實現類似的功能,不一定要用觸發器的,可以設置兩個表的主鍵和外鍵,設置級聯刪除關系,刪除主鍵時,外鍵表中的記錄也會自動刪除。
『伍』 存儲過程、索引、視圖、觸發器 的區別
視圖:只是一種預先把語句編寫好的一種快照,在使用中,真正執行的還是這個語句問題;
索引:主要是考慮到操作性能的優化
存儲過程:是資料庫的邏輯塊處理
觸發器:主要考慮連帶性;
這4個種功能都不一樣;沒有什麼好比較的
『陸』 sql視圖存儲過程觸發器各自的優點是什麼
視圖的優點:
提高數據安全性,可以不讓用戶看到表中的某個欄位。比如password,你只給他們執行視圖的許可權,不給執行表的許可權,他們就無法查看全部數據。
還有可以建立一個視圖,內容包括兩個表,更新的時候只需要指定ID,而不用管它來自哪個表,對應表中的數據就會自動更新。
存儲過程的優點:
包括視圖的所有優點,還可以讓不懂資料庫的人也能也用資料庫,還有就是方便程序計設,比如我負責前台程序設計,你負責寫存程,我不用管你是怎麼寫,最後只接調用,我們分工明確,我也不需要懂你所懂的,這為用不懂語言和不同專業的人在一起合作提供了良好的平台。提高開發效率。
觸發器的優點:
保證數據的正確性和邏輯,比如訂單表中新增一條數據,對應在庫存表中會減少一個產品一樣。
還有保證數據的安全性,比如當用戶刪除表A,我們可以判斷他是否為Admin組的用戶,如果不是,就會給出錯誤的提示,並將事務回滾。
我知道的就這么多了。。。嘿嘿。
『柒』 觸發器的特點及和存儲過程的區別
觸發器在資料庫里以獨立的對象存儲,它與存儲過程不同的是,存儲過程通過其它程序來啟動運行或直接啟動運行,而觸發器是由一個事件來啟動運行。即觸發器是當某個事件發生時自動地隱式運行。並且,觸發器不能接收參數。所以運行觸發器就叫觸發或點火(firing)。ORACLE事件指的是對資料庫的表進行的INSERT、UPDATE及DELETE操作或對視圖進行類似的操作。ORACLE將觸發器的功能擴展到了觸發ORACLE,如資料庫的啟動與關閉等。
『捌』 資料庫裡面的表、觸發器、存儲過程、視圖這些都是什麼東西
表:裡面存儲的都是真實的數據
視圖:就是一個表或者多個表的一個映射,一般只做查詢使用。比如你想要的數據存在兩個表裡,但你查詢時不想每次都寫關聯,那麼你創建一個視圖,以後只查詢這個視圖就可以(查詢時視圖與查詢表語法一樣)。
觸發器:做資料庫操作的時候,還希望相關的數據同步操作就用觸發器,比如想要向A表插入數據的時候,同時向B表插入,這樣寫過觸發器每次向A表插入數據之後就會自動向B表插入。
存儲過程:這個一般是沉澱數據使用的,當你需要查詢的數據不能用一個sql語句查出或者sql語句查詢速度特別慢,想要提高效率,就會用到存儲過程,先把需要的數據沉澱到結果表裡然後直接查詢結果表就能提高效率。
『玖』 存儲過程,觸發器,視圖之間的關系,有經驗的人請詳細的說一下!
這是oracle入門知識啊,存儲過程和觸發器是一類的;
存儲過程 : 執行一個任務,該任務包括了一系列的SQL語句,存儲在資料庫中,成為資料庫一個對象。
例子:創建一個簡單的存儲過程
CREATE OR REPLACE PROCEDURE xs_proc
IS
BEGIN
NULL;
END;
/
觸發器:觸發器是一個特殊的存儲過程。區別就是在於, 存儲過程需要去調用,而觸發器無需調用,在執行某些操作的時候,會自動執行。一般當表或者視圖執行 增,刪,改 操作的時候,就會自動執行觸發器中的SQL 語句塊。還有一個區別, 創建觸發器是不帶參數的, 而 存儲過程 可帶可不帶 參數。
例子:觸發器需要具體的實例才能講清,如果需要具體說明,我給你郵件。
視圖和表是一類的,視圖就是一個對表的查詢語句,方便對表的查詢。
例子:創建一個簡單的視圖
CREATE VIEW a AS SELECT * FROM a;
『拾』 在資料庫中什麼是儲存過程,視圖以及觸發器
存儲過程就好象一個批處理文件一樣,你可以在裡面執行很多的SQL,來得到你最好需要的結果 ,或者說類似於一個函數,調用存儲過程後,T-SQL一次執行很多命令,最終給你個結果
視圖是虛擬表,比如要查詢的東西在兩個表裡,那麼可以把兩個表連接成一個視圖,這樣就可以查詢並顯示兩個表裡的內容了,具體還分左右外連接
觸發器是個特殊的存儲過程,它的執行不是人工操作的,而是由某事件的發生而引發的
你明白了吧
插紅旗 吼吼