<pre name="code" class="javascript">$('#dd2').draggable({
proxy:'clone'
});
一、觸發器
create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] }
說明:
1 tr_name :觸發器名稱2 on table/view :觸發器所作用的表。一個觸發器只能作用於一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區別
After
在觸發事件發生以後才被激活,只可以建立在表上
Instead of
代替了相應的觸發事件而被執行,既可以建立在表上也可以建立在視圖上
5 insert、update、delete:激活觸發器的三種操作,可以同時執行,也可選其一
6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則激活觸發器。此外,因爲delete 操作只對行有影響,
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能激活觸發器,沒意義)。
7觸發器執行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行激活觸發器時由系統自動生成的,其結構與觸發器作用的表結構是一樣的,只是存放 的數據有差異。
8 說明deleted 與inserted 數據的差異
deleted 與inserted 數據的差異
Inserted 存放進行insert和update 操作後的數據
Deleted 存放進行delete 和update操作前的數據
注意:update 操作相當於先進行delete 再進行insert ,所以在進行update操作時,修改前的數據拷貝一條到deleted 表中,修改後的數據在存到觸發器作用的表的同時,也同時生成一條拷貝到insered表中。
觸發器典型示例
if exists(select name from sysobjects where xtype='tr' and name='tri_updateStudent')
begin
drop trigger tri_UpdateStudent
end
go
create trigger tri_UpdateStudent
on dbo.student
for update
as
if update(Sage)
begin
update student set sage=s.sage+d.sage from student s,deleted d where s.studentid=d.studentid
end
go
二、存儲過程
存儲過程的優點
A、 存儲過程允許標準組件式編程
B、 存儲過程能夠實現較快的執行速度
C、 存儲過程減輕網絡流量
D、 存儲過程可被作爲一種安全機制來充分利用
存儲過程的實例
begin
drop proc proc_student
end
go
create proc proc_Student
@name varchar(255),
@age varchar(255)
as
begin tran
select * from student where sname=@name and sage=@age
if @@ERROR<>0
begin
rollback tran
insert into student(studentid,sname,sage) values (1,@name,@age)
return 0
end
else
begin
commit tran
select * from student
end
go
exec proc_student '科比',1;
三、表變量
表變量定義:
表變量創建的語法類似於臨時表,區別就在於創建的時候,必須要爲之命名。表變量是變量的一種,表變量也分爲本地及全局的兩種,本地表變量的名稱都是以“@”爲前綴,只有在本地當前的用戶連接中纔可以訪問。全局的表變量的名稱都是以“@@”爲前綴,一般都是系統的全局變量,像我們常用到的,如@@Error代表錯誤的號,@@RowCount代表影響的行數。
DECLARE @News table
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News
四、臨時表
臨時表定義:
臨時表與永久表相似,只是它的創建是在Tempdb中,它只有在一個數據庫連接結束後或者由SQL命令DROP掉,纔會消失,否則就會一直存在。臨時表在創建的時候都會產生SQL Server的系統日誌,雖它們在Tempdb中體現,是分配在內存中的,它們也支持物理的磁盤,但用戶在指定的磁盤裏看不到文件。
臨時表分爲本地和全局兩種,本地臨時表的名稱都是以“#”爲前綴,只有在本地當前的用戶連接中才是可見的,當用戶從實例斷開連接時被刪除。全局臨時表的名稱都是以“##”爲前綴,創建後對任何用戶都是可見的,當所有引用該表的用戶斷開連接時被刪除。
CREATE TABLE dbo.#News
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News
DROP TABLE dbo.[#News]
表變量和臨時表對比總結
特性 |
表變量 |
臨時表 |
作用域 |
當前批處理 |
當前會話,嵌套存儲過程,全局:所有會話 |
使用場景 |
自定義函數,存儲過程,批處理 |
自定義函數,存儲過程,批處理 |
創建方式 |
DECLARE statement only.只能通過DECLEARE語句創建 |
CREATE TABLE 語句 SELECT INTO 語句. |
表名長度 |
最多128字節 |
最多116字節 |
列類型 |
可以使用自定義數據類型 可以使用XML集合 |
自定義數據類型和XML集合必須在TempDb內定義 |
Collation |
字符串排序規則繼承自當前數據庫 |
字符串排序規則繼承自TempDb數據庫 |
索引 |
索引必須在表定義時建立 |
索引可以在表創建後建立 |
約束 |
PRIMARY KEY, UNIQUE, NULL, CHECK約束可以使用,但必須在表建立時聲明 |
PRIMARY KEY, UNIQUE, NULL, CHECK. 約束可以使用,可以在任何時後添加,但不能有外鍵約束 |
表建立後使用DDL (索引,列) |
不允許 |
允許. |
數據插入方式 |
INSERT 語句 (SQL 2000: 不能使用INSERT/EXEC). |
INSERT 語句, 包括 INSERT/EXEC. SELECT INTO 語句. |
Insert explicit values into identity columns (SET IDENTITY_INSERT). |
不支持SET IDENTITY_INSERT語句 |
支持SET IDENTITY_INSERT語句 |
Truncate table |
不允許 |
允許 |
析構方式 |
批處理結束後自動析構 |
顯式調用 DROP TABLE 語句. |
事務 |
只會在更新表的時候有事務,持續時間比臨時表短 |
正常的事務長度,比表變量長 |
存儲過程重編譯 |
否 |
會導致重編譯 |
回滾 |
不會被回滾影響 |
會被回滾影響 |
統計數據 |
不創建統計數據,所以所有的估計行數都爲1,所以生成執行計劃會不精準 |
創建統計數據,通過實際的行數生成執行計劃。 |
作爲參數傳入存儲過程 |
僅僅在SQL Server2008, 並且必須預定義 user-defined table type. |
不允許 |
顯式命名對象 (索引, 約束). |
不允許 |
允許,但是要注意多用戶的問題 |
動態SQL |
必須在動態SQL中定義表變量 |
可以在調用動態SQL之前定義臨時表 |
用法:無表關聯操作,只作爲中間集進行數據處理,建議用表變量;有表關聯,且不能確定數據量大小的情況下,建議用臨時表。