create table s(sno number(10,0) primary key,sname varchar2(10),birthday date,age number(3,0),sex varchar2(2));
create table c(cno number(10,0) primary key,cname varhcar2(10),credit number(20,2),teacher varchar2(10));
create table sc(sno number(10,0) references s(sno),cno number(10,0) references c(cno),grade number(5,2),seldate date);
create trigger tri_sc
before insert or update on sc
for each row
declare
exc1,exc2 exception;
temp_count1,temp_count2 number;
begin
select count(*) into temp_count1 from sc where :new.sno=sc.sno group by sno;
select count(*) into temp_count2 from sc where :new.cno=sc.cno group by cno;
if temp_count1 >=5 then
raise exc1;
end if;
if temp_count2 >=3 then
raise exc2;
end if;
exception
when exc1 then
dbms_output.put_line('最多隻能選修5門課程'); --異常處理這部分你可以自己決定咯
when exc2 then
dbms.output.put_line('選修本門課程人數已滿');
end;
create trigger tri_s
before update on s
for each row
declare
exc exception;
begin
if :new.age < :old.age then
raise exc;
end if;
exception
when exc then
dbms_output.put_line('年齡只能增加');
end;
⑵ SQL Server資料庫觸發器問題
CREATE TRIGGER trigger1 ON zw_bkd
WITH EXECUTE AS CALLER
AFTER UPDATE
AS
BEGIN
declare @oldshr int,@newshr int, @gsdm int,@kjnd int,@je int,@zbid int
--這里視你的情況修改變數類型
if update(shr)
begin
select @oldshr=Deleted.shr from Deleted --@oldshr是更新前的shr
select @newshr=Inserted.shr, --@newshr是更新後的shr
@gsdm=Inserted.gsdm,@kjnd=Inserted.kjnd,
@je=Inserted.je,@zbid=Inserted.zbid
from Inserted
if @oldshr is null and @newshr is not null --如果shr從空變為非空
begin
--如果zw_ed 中存在zbid與zw_bkd相同的行,刪除這些行
if (select count(*) from zw_ed where zw_ed.zbid=@zbid)!=0
delete from zw_ed where zw_ed.zbid=@zbid
--將zw_bkd里的gsdm,kjnd,je,zbid插入到zw_ed表裡
insert into zw_ed (gsdm,kjnd,je,zbid) values (@gsdm,@kjnd,@je,@zbid)
end
else if @oldshr is not null and @newshr is null --如果shr從非空變為空
begin
--刪除zw_ed 中zbid與zw_bkd相同的行
delete from zw_ed where zw_ed.zbid=@zbid
end
end
END
⑶ sql資料庫選擇題,在應用中使用sql,觸發器,存儲過程
1)查看錶中的觸發器類型:
sp_helptrigger:返回對當前資料庫的指定表定義的 DML 觸發器的類型。sp_helptrigger 不能用於 DDL 觸發器。
示例: EXEC sp_helptrigger '表名'
2)查看觸發器的有關信息:
sp_help:報告有關資料庫對象(sys.sysobjects 兼容視圖中列出的所有對象)、用戶定義數據類型或某種數據類型的信息。
示例: EXEC sp_help '觸發器名'
3)顯示觸發器的定義:
sp_helptext:顯示規則、默認值、未加密的存儲過程、用戶定義函數、觸發器或視圖的文本。
示例: EXEC sp_helptext '觸發器名'
4)查看當前庫中所有的觸發器:
查詢腳本:SELECT * FROM Sysobjects WHERE xtype = 'TR'
5)查看當前庫中所有的觸發器和與之相對應的表:
查詢腳本:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR'
⑷ 資料庫 觸發器 問題 急急急!!!
create trigger trgtch
on teacher
for update
as
if update(tTitle)
begin
update salary set tSalary=
(case when inserted.tTltle='教授' then 3000
when inserted.tTltle='副教授' then 2500
when inserted.tTltle='助教' then 1500
else 0 end)
where exists(select tid,tTitle from inserted where inserted.tid=salary.tid)
end
⑸ sql資料庫,觸發器問題。
CREATETABLEprocts(pidintprimarykey,pnamevarchar(20),pquantityint)
go
CREATETABLEsales(saleidint,pidintreferencesprocts,quantityint)
go
createtriggert1onsales--在sales表上定義觸發器
forinsertas--當在sales表中添加記錄時觸發
updateproctssetpquantity=pquantity-inserted.quantity--修改庫存量
fromproctsjoininserted--將庫存表與inserted表關聯起來(inserted表中是剛插入的記錄內容)
onprocts.pid=inserted.pid--連接條件
⑹ SQL資料庫練習題
1. SQL Server 2000是典型的關系型資料庫產品。 ( 1 )
2. 在一台計算機上可以同時運行多個版本的SQL Server。 ( 1 )
3. 在SQL Server中日誌文件是維護資料庫完整性的重要工具。 ( 0 )
4. 在定義數據表時,定義某列為標識列的關鍵字是Identity。 ( 1 )
5. 浮點數據類型的優點是能夠存儲范圍非常大的數字,但容易發生誤差。 ( 0 )
6. 資料庫完整性的目的是為了防止錯誤信息輸入和輸出。 ( 0 )
7. 在Update語句中,一次可以更新多個表。 ( 0)
8. 盡量使用Select * ,可以加快查詢速度。 ( 0 )
9. 在SQL Server 2000中表示注釋可以用類似C語言的/*...*/和//。 ( 0 )
10. 在SQL Server中,RTRIM函數刪除字元串右邊的空白字元。 ( 1 )
11. 一個表只能有一個聚集索引(簇索引)。 ( 1 )
12. SQL查詢語言中,如果沒有指定排序方式,則默認是升序方式。 ( 1 )
13. 在SQL Server 2000中ntext類型的欄位不能進行排序操作。 ( 0 )
14. 在SQL Server 2000中bit類型的欄位不能建立索引。 ( 1 )
15. 在被定義為唯一索引的列上的數據不能有重復的值。 ( 1 )
16. 在被定義為唯一索引的列上的數據不允許空。 ( 0可以的但是只能有一個null值 )
17. 在SQL Server中,每張表都應該建立一個索引,以提高查詢速度。 ( 0 )
18. 視圖在SQL Server中是一張虛擬表。 ( 1 )
19. 當一個視圖由2個以上基本表構成時,不能進行刪除視圖中的數據。 ( 0 )
20. 在SQL Server中,觸發器是一種特殊的存儲過程。 ( 1 )
21. 由於存儲過程是解釋執行,所以每次執行時都要檢查是否有語法錯誤。 ( 0 )
22. 可以在用戶正在使用的資料庫上執行資料庫恢復操作。 ( 0 )
1表示正確
⑺ sql 觸發器的題目
什麼資料庫的觸發器啊?
--補充
create table users(
id int,
status char(1)
)
觸發器
create or replace trigger trig_users
before insert on users
for each row
begin
if :new.status = '1' then
:new.status := 'a';
elsif :new.status = '2' then
:new.status := 'b';
end if;
end;
測試
SQL> insert into users
2 select 1,'1' from al union
3 select 2,'2' from al union
4 select 3,'1' from al union
5 select 4,'2' from al
6 ;
4 rows inserted
SQL> select * from users
2 ;
ID STATUS
--------------------------------------- ------
1 a
2 b
3 a
4 b
SQL>
⑻ Database Trigger 資料庫觸發器的習題
那是因為你的這2個表有約束條件存在,在執行delete之前需要先把他們之間的約束條件刪除
⑼ Oracle資料庫中有關觸發器問題
觸發器是一種特殊類型的存儲過程 它不同於存儲過程 觸發器主要是通過事件進行觸發而被執行的 觸發器的觸發事件分可為 類 分別是DML事件 DDL事件和資料庫事件 而存儲過程可以通過存儲過程名字而被直接調用 當對某一表進行諸如UPDATE INSERT DELETE 這些操作時 SQL Server 就會自動執行觸發器所定義的SQL 語句 從而確保對數據的處理必須符合由這些SQL 語句所定義的規則
觸發器是特定事件出現的時候 自動執行的代碼塊 類似於存儲過程 但是用戶不能直接調用他們
觸發器功能
允許/限制對表的修改
自動生成派生列 比如自增欄位
強制數據一致性
提供審計和日誌記錄
防止無效的事務處理
啟用復雜的業務邏輯
觸發器種類
觸發器的種類可劃分為 種 數據操縱語言(DML)觸發器 替代(INSTEAD OF)觸發器 數據定義語言(DDL)觸發器 資料庫事件觸發器
數據操縱語言(DML)觸發器 簡稱DML觸發器 是定義在表上的觸發器 創建在表上 由DML事件引發的觸發器 編寫DML觸發器時的兩點要素是 確定觸發的表 即在其上定義觸發器的表 確定觸發的事件 DML觸發器的觸發事件有INSERT UPDATE和DELETE三種;替代觸發器 簡稱INSTEADOF觸發器 創建在視圖上 用來替換對視圖進行的刪除 插入和修改操作; 數據定義語言(DDL)觸發器 簡稱DDL觸發器 定義在模式上 觸發事件是數據對象的創建和修改;資料庫事件觸發器 定義在整個資料庫或模式上 觸發事件是資料庫事件
ORACLE產生資料庫觸發器的語法為
CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE|AFTER|INSTEAD OF} 觸發事件 [OR 觸發事件 ]
ON 表名
WHEN 觸發條件
[FOR EACH ROW]
DECLARE
聲明部分
BEGIN
主體部分
END;
其中
觸發器名 觸發器對象的名稱 由於觸發器是資料庫自動執行的 因此該名稱只是一個名稱 沒有實質的用途 一個觸發器可由多個不同的數據操縱語言操作觸發 在觸發器中 可用INSERTING DELETING UPDATING謂詞來區別不同的數據操縱語言操作 這些謂詞可以在IF分支條件語句中作為判斷條件來使用
觸發時間 指明觸發器何時執行 該值可取 觸發的時間有BEFORE和AFTER兩種 分別表示觸發動作發生在DML語句執行之前和語句執行之後 確定觸發級別 有語句級觸發器和行級觸發器兩種 語句級觸發器表示SQL語句只觸發一次觸發器 行級觸發器表示SQL語句影響的每一行都要觸發一次
Before 表示在資料庫動作之前觸發器執行;在SQL語句的執行過程中 如果存在行級BEFORE觸發器 則SQL語句在對每一行操作之前 都要先執行一次行級BEFORE觸發器 然後才對行進行操作 如果存在行級AFTER觸發器 則SQL語句在對每一行操作之後 都要再執行一次行級AFTER觸發器
after 表示在資料庫動作之後出發器執行 如果存在語句級AFTER觸發器 則在SQL語句執行完畢後 要最後執行一次語句級AFTER觸發器
觸發事件 指明哪些資料庫動作會觸發此觸發器 指INSERT DELETE或UPDATE事件 事件可以並行出現 中間用OR連接;
insert 資料庫插入會觸發此觸發器;
update 資料庫修改會觸發此觸發器;
delete 資料庫刪除會觸發此觸發器
表 名 資料庫觸發器所在的表
for each row 表示觸發器為行級觸發器 省略則為語句級觸發器 對表的每一行觸發器執行一次
觸發器的創建者或具有DROP ANY TIRGGER系統許可權的人才能刪除觸發器 刪除觸發器的語法如下
DROP TIRGGER 觸發器名
可以通過命令設置觸發器的可用狀態 使其暫時關閉或重新打開 即當觸發器暫時不用時 可以將其置成無效狀態 在使用時重新打開 該命令語法如下
ALTER TRIGGER 觸發器名 {DISABLE|ENABLE}
其中 DISABLE表示使觸發器失效 ENABLE表示使觸發器生效
同存儲過程類似 觸發器可以用SHOW ERRORS 檢查編譯錯誤
如果有多個觸發器被定義成為相同時間 相同事件觸發 且最後定義的觸發器是有效的 則最後定義的觸發器被觸發 其他觸發器不執行 觸發器體內禁止使用MIT ROLLBACK SAVEPOINT語句 也禁止直接或間接地調用含有上述語句的存儲過程 定義一個觸發器時要考慮上述多種情況 並根據具體的需要來決定觸發器的種類
觸發器的作用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性 除此之外 觸發器還有其它許多不同的功能
( ) 強化約束(Enforce restriction)
觸發器能夠實現比CHECK 語句更為復雜的約束
( ) 跟蹤變化Auditing changes
觸發器可以偵測資料庫內的操作 從而不允許資料庫中未經許可的指定更新和變化
( ) 級聯運行(Cascaded operation)
觸發器可以偵測資料庫內的操作 並自動地級聯影響整個資料庫的各項內容 例如 某個表上的觸發器中包含有對另外一個表的數據操作(如刪除 更新 插入)而該操作又導致該表上觸發器被觸發
( ) 存儲過程的調用(Stored procere invocation)
為了響應資料庫更新觸 發器可以調用一個或多個存儲過程 甚至可以通過外部過程的調用而在DBMS( 資料庫管理系統)本身之外進行操作
由此可見 觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題 例如 觸發器能夠找出某一表在數據修改前後狀態發生的差異 並根據這種差異執行一定的處理 此外一個表的同一類型(INSERT UPDATE DELETE)的多個觸發器能夠對同一種數據操作採取多種不同的處理
總體而言 觸發器性能通常比較低
lishixin/Article/program/Oracle/201311/18340