成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > sqlserver 觸發(fā)器實例代碼

sqlserver 觸發(fā)器實例代碼

熱門標(biāo)簽:al智能電話機器人 陜西電銷外呼系統(tǒng)好用嗎 數(shù)字匠心電銷機器人 如何做地圖標(biāo)注圖鋪 銀川高頻外呼回?fù)芟到y(tǒng)多少錢 蘭州語音外呼系統(tǒng)運營商 沒聽見電話機器人幫你接 最新人工智能電銷機器人 成都電話外呼系統(tǒng)一般多少錢
定義: 何為觸發(fā)器?在SQL Server里面也就是對某一個表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個特殊的存儲過程。
常見的觸發(fā)器有三種:分別應(yīng)用于Insert , Update , Delete 事件。
我為什么要使用觸發(fā)器?比如,這么兩個表:
復(fù)制代碼 代碼如下:

Create Table Student( --學(xué)生表
StudentID int primary key, --學(xué)號
....
)
Create Table BorrowRecord( --學(xué)生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學(xué)號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)

用到的功能有:
1.如果我更改了學(xué)生的學(xué)號,我希望他的借書記錄仍然與這個學(xué)生相關(guān)(也就是同時更改借書記錄表的學(xué)號);
2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發(fā)器。對于1,創(chuàng)建一個Update觸發(fā)器:
復(fù)制代碼 代碼如下:

Create Trigger truStudent
On Student --在Student表中創(chuàng)建觸發(fā)器
for Update --為什么事件觸發(fā)
As --事件觸發(fā)后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID
end

理解觸發(fā)器里面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個數(shù)據(jù)庫系統(tǒng)中有兩個虛擬表用于存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted
在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄
一個Update 的過程可以看作為:生成新的記錄到Inserted表,復(fù)制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀(jì)錄。
對于2,創(chuàng)建一個Delete觸發(fā)器
復(fù)制代碼 代碼如下:

Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

從這兩個例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個臨時的表;B.觸發(fā)機制。
SQL觸發(fā)器實例2
復(fù)制代碼 代碼如下:

/*
建立虛擬測試環(huán)境,包含:表[卷煙庫存表],表[卷煙銷售表]。
請大家注意跟蹤這兩個表的數(shù)據(jù),體會觸發(fā)器到底執(zhí)行了什么業(yè)務(wù)邏輯,對數(shù)據(jù)有什么影響。
為了能更清晰的表述觸發(fā)器的作用,表結(jié)構(gòu)存在數(shù)據(jù)冗余,且不符合第三范式,這里特此說明。
*/
USE Master
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷煙庫存表')
DROP TABLE 卷煙庫存表
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷煙銷售表')
DROP TABLE 卷煙銷售表
GO
--業(yè)務(wù)規(guī)則:銷售金額 = 銷售數(shù)量 * 銷售單價 業(yè)務(wù)規(guī)則。
CREATE TABLE 卷煙銷售表
(
卷煙品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
購貨商 VARCHAR(40) NULL,
銷售數(shù)量 INT NULL,
銷售單價 MONEY NULL,
銷售金額 MONEY NULL
)
GO
--業(yè)務(wù)規(guī)則:庫存金額 = 庫存數(shù)量 * 庫存單價 業(yè)務(wù)規(guī)則。
CREATE TABLE 卷煙庫存表
(
卷煙品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
庫存數(shù)量 INT NULL,
庫存單價 MONEY NULL,
庫存金額 MONEY NULL
)
GO
--創(chuàng)建觸發(fā)器,示例1
/*
創(chuàng)建觸發(fā)器[T_INSERT_卷煙庫存表],這個觸發(fā)器較簡單。
說明: 每當(dāng)[卷煙庫存表]發(fā)生 INSERT 動作,則引發(fā)該觸發(fā)器。
觸發(fā)器功能: 強制執(zhí)行業(yè)務(wù)規(guī)則,保證插入的數(shù)據(jù)中,庫存金額 = 庫存數(shù)量 * 庫存單價。
注意: [INSERTED]、[DELETED]為系統(tǒng)表,不可創(chuàng)建、修改、刪除,但可以調(diào)用。
重要: 這兩個系統(tǒng)表的結(jié)構(gòu)同插入數(shù)據(jù)的表的結(jié)構(gòu)。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙庫存表')
DROP TRIGGER T_INSERT_卷煙庫存表
GO
CREATE TRIGGER T_INSERT_卷煙庫存表
ON 卷煙庫存表
FOR INSERT
AS
--提交事務(wù)處理
BEGIN TRANSACTION
--強制執(zhí)行下列語句,保證業(yè)務(wù)規(guī)則
UPDATE 卷煙庫存表
SET 庫存金額 = 庫存數(shù)量 * 庫存單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 from INSERTED)
COMMIT TRANSACTION
GO
/*
針對[卷煙庫存表],插入測試數(shù)據(jù):
注意,第一條數(shù)據(jù)(紅塔山新勢力)中的數(shù)據(jù)符合業(yè)務(wù)規(guī)則,
第二條數(shù)據(jù)(紅塔山人為峰)中,[庫存金額]空,不符合業(yè)務(wù)規(guī)則,
第三條數(shù)據(jù)(云南映像)中,[庫存金額]不等于[庫存數(shù)量]乘以[庫存單價],不符合業(yè)務(wù)規(guī)則。
第四條數(shù)據(jù)庫存數(shù)量為0。
請注意在插入數(shù)據(jù)后,檢查[卷煙庫存表]中的數(shù)據(jù)是否 庫存金額 = 庫存數(shù)量 * 庫存單價。
*/
INSERT INTO 卷煙庫存表(卷煙品牌,庫存數(shù)量,庫存單價,庫存金額)
SELECT '紅塔山新勢力',100,12,1200 UNION ALL
SELECT '紅塔山人為峰',100,22,NULL UNION ALL
SELECT '云南映像',100,60,500 UNION ALL
SELECT '玉溪',0,30,0
GO
--查詢數(shù)據(jù)
SELECT * FROM 卷煙庫存表
GO
/*

結(jié)果集
RecordId 卷煙品牌 庫存數(shù)量 庫存單價 庫存金額
-------- ------------ -------- ------- ---------
1 紅塔山新勢力 100 12.0000 1200.0000
2 紅塔山人為峰 100 22.0000 2200.0000
3 云南映像 100 60.0000 6000.0000
4 玉溪 0 30.0000 .0000
(所影響的行數(shù)為 4 行)
*/
--觸發(fā)器示例2
復(fù)制代碼 代碼如下:

/*
創(chuàng)建觸發(fā)器[T_INSERT_卷煙銷售表],該觸發(fā)器較復(fù)雜。
說明: 每當(dāng)[卷煙庫存表]發(fā)生 INSERT 動作,則引發(fā)該觸發(fā)器。
觸發(fā)器功能: 實現(xiàn)業(yè)務(wù)規(guī)則。
業(yè)務(wù)規(guī)則: 如果銷售的卷煙品牌不存在庫存或者庫存為零,則返回錯誤。
否則則自動減少[卷煙庫存表]中對應(yīng)品牌卷煙的庫存數(shù)量和庫存金額。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙銷售表')
DROP TRIGGER T_INSERT_卷煙銷售表
GO
CREATE TRIGGER T_INSERT_卷煙銷售表
ON 卷煙銷售表
FOR INSERT
AS
BEGIN TRANSACTION
--檢查數(shù)據(jù)的合法性:銷售的卷煙是否有庫存,或者庫存是否大于零
IF NOT EXISTS (
SELECT 庫存數(shù)量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙不存在庫存,不能銷售。',16,1)
--回滾事務(wù)
ROLLBACK
RETURN
END
IF EXISTS (
SELECT 庫存數(shù)量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED) AND
庫存數(shù)量 = 0
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙庫存小于等于0,不能銷售。',16,1)
--回滾事務(wù)
ROLLBACK
RETURN
END
--對合法的數(shù)據(jù)進行處理
--強制執(zhí)行下列語句,保證業(yè)務(wù)規(guī)則
UPDATE 卷煙銷售表
SET 銷售金額 = 銷售數(shù)量 * 銷售單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @卷煙品牌 VARCHAR(40)
SET @卷煙品牌 = (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @銷售數(shù)量 MONEY
SET @銷售數(shù)量 = (SELECT 銷售數(shù)量 FROM INSERTED)
UPDATE 卷煙庫存表
SET 庫存數(shù)量 = 庫存數(shù)量 - @銷售數(shù)量,
庫存金額 = (庫存數(shù)量 - @銷售數(shù)量)*庫存單價
WHERE 卷煙品牌 = @卷煙品牌
COMMIT TRANSACTION
GO
--請大家自行跟蹤[卷煙庫存表]和[卷煙銷售表]的數(shù)據(jù)變化。
--針對[卷煙銷售表],插入第一條測試數(shù)據(jù),該數(shù)據(jù)是正常的。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅塔山新勢力','某購貨商',10,12,1200
GO
--針對[卷煙銷售表],插入第二條測試數(shù)據(jù),該數(shù)據(jù) 銷售金額 不等于 銷售單價 * 銷售數(shù)量。
--觸發(fā)器將自動更正數(shù)據(jù),使 銷售金額 等于 銷售單價 * 銷售數(shù)量。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅塔山人為峰','某購貨商',10,22,2000
GO
--針對[卷煙銷售表],插入第三條測試數(shù)據(jù),該數(shù)據(jù)中的卷煙品牌在 卷煙庫存表中找不到對應(yīng)。
--觸發(fā)器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅河V8','某購貨商',10,60,600
GO

/*
結(jié)果集
服務(wù)器: 消息 50000,級別 16,狀態(tài) 1,過程 T_INSERT_卷煙銷售表,行 15
錯誤!該卷煙不存在庫存,不能銷售。
*/
--針對[卷煙銷售表],插入第三條測試數(shù)據(jù),該數(shù)據(jù)中的卷煙品牌在 卷煙庫存表中庫存為0。
--觸發(fā)器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '玉溪','某購貨商',10,30,300
GO
/*
結(jié)果集
服務(wù)器: 消息 50000,級別 16,狀態(tài) 1,過程 T_INSERT_卷煙銷售表,行 29
錯誤!該卷煙庫存小于等于0,不能銷售。
*/
--查詢數(shù)據(jù)
SELECT * FROM 卷煙庫存表
SELECT * FROM 卷煙銷售表
GO
/*
補充:
1、本示例主要通過一個簡單的業(yè)務(wù)規(guī)則實現(xiàn)來進行觸發(fā)器使用的說明,具體的要根據(jù)需要靈活處理;
2、關(guān)于觸發(fā)器要理解并運用好 INSERTED ,DELETED 兩個系統(tǒng)表;
3、本示例創(chuàng)建的觸發(fā)器都是 FOR INSERT ,具體的語法可參考:
Trigger語法
復(fù)制代碼 代碼如下:

CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ] --用于加密觸發(fā)器
{
{ { 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 ]
}
}

4、關(guān)于觸發(fā)器,還應(yīng)該注意
(1)、DELETE 觸發(fā)器不能捕獲 TRUNCATE TABLE 語句。
(2)、觸發(fā)器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
(3)、觸發(fā)器最多可以嵌套 32 層。
*/
--修改觸發(fā)器
--實質(zhì)上,是將 CREATE TRIGGER ... 修改為 ALTER TRIGGER ...即可。
--刪除觸發(fā)器
DROP TRIGGER xxx
GO
--刪除測試環(huán)境
DROP TABLE 卷煙庫存表
GO
DROP TABLE 卷煙銷售表
GO
DROP TRIGGER T_INSERT_卷煙庫存表
GO
DROP TRIGGER T_INSERT_卷煙銷售表
GO
##################################################################
觸發(fā)器的基礎(chǔ)知識和例子
: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 :觸發(fā)器名稱
2 on table/view :觸發(fā)器所作用的表。一個觸發(fā)器只能作用于一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區(qū)別
After
在觸發(fā)事件發(fā)生以后才被激活,只可以建立在表上
Instead of
代替了相應(yīng)的觸發(fā)事件而被執(zhí)行,既可以建立在表上也可以建立在視圖上
5 insert、update、delete:激活觸發(fā)器的三種操作,可以同時執(zhí)行,也可選其一
6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則激活觸發(fā)器。此外,因為delete 操作只對行有影響,
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能激活觸發(fā)器,沒意義)。
7 觸發(fā)器執(zhí)行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行激活觸發(fā)器時由系統(tǒng)自動生成的,其結(jié)構(gòu)與觸發(fā)器作用的表結(jié)構(gòu)是一
樣的,只是存放 的數(shù)據(jù)有差異。
續(xù)
下面表格說明deleted 與inserted 數(shù)據(jù)的差異
deleted 與inserted 數(shù)據(jù)的差異
Inserted
存放進行insert和update 操作后的數(shù)據(jù)
Deleted
存放進行delete 和update操作前的數(shù)據(jù)
注意:update 操作相當(dāng)于先進行delete 再進行insert ,所以在進行update操作時,修改前的數(shù)據(jù)拷貝一條到deleted 表中,修改后
的數(shù)據(jù)在存到觸發(fā)器作用的表的同時,也同時生成一條拷貝到insered表中

SQL Server 2000中的觸發(fā)器使用

觸發(fā)器是數(shù)據(jù)庫應(yīng)用中的重用工具,它的應(yīng)用很廣泛。這幾天寫一個化學(xué)數(shù)據(jù)統(tǒng)計方面的軟件,需要根據(jù)采樣,自動計算方差,在這里,我使用了觸發(fā)器。
  下面我摘錄了SQL Server官方教程中的一段關(guān)于觸發(fā)器的文字,確實有用的一點文字描述。
  可以定義一個無論何時用INSERT語句向表中插入數(shù)據(jù)時都會執(zhí)行的觸發(fā)器。
  當(dāng)觸發(fā)INSERT觸發(fā)器時,新的數(shù)據(jù)行就會被插入到觸發(fā)器表和inserted表中。inserted表是一個邏輯表,它包含了已經(jīng)插入的數(shù)據(jù)行的一個副本。inserted表包含了INSERT語句中已記錄的插入動作。inserted表還允許引用由初始化INSERT語句而產(chǎn)生的日志數(shù)據(jù)。觸發(fā)器通過檢查inserted表來確定是否執(zhí)行觸發(fā)器動作或如何執(zhí)行它。inserted表中的行總是觸發(fā)器表中一行或多行的副本。
  日志記錄了所有修改數(shù)據(jù)的動作(INSERT、UPDATE和DELETE語句),但在事務(wù)日志中的信息是不可讀的。然而,inserted表允許你引用由INSERT語句引起的日志變化,這樣就可以將插入數(shù)據(jù)與發(fā)生的變化進行比較,來驗證它們或采取進一步的動作。也可以直接引用插入的數(shù)據(jù),而不必將它們存儲到變量中。
  示例
  在本例中,將創(chuàng)建一個觸發(fā)器。無論何時訂購產(chǎn)品(無論何時向Order Details表中插入一條記錄),這個觸發(fā)器都將更新Products表中的一列(UnitsInStock)。用原來的值減去訂購的數(shù)量值即為新值。

復(fù)制代碼 代碼如下:


USE Northwind

CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = P.UnitsInStock – I.Quantity
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID


  DELETE觸發(fā)器的工作過程
  當(dāng)觸發(fā)DELETE觸發(fā)器后,從受影響的表中刪除的行將被放置到一個特殊的deleted表中。deleted表是一個邏輯表,它保留已被刪除數(shù)據(jù)行的一個副本。deleted表還允許引用由初始化DELETE語句產(chǎn)生的日志數(shù)據(jù)。
  使用DELETE觸發(fā)器時,需要考慮以下的事項和原則:
  ·當(dāng)某行被添加到deleted表中時,它就不再存在于數(shù)據(jù)庫表中;因此,deleted表和數(shù)據(jù)庫表沒有相同的行。
  ·創(chuàng)建deleted表時,空間是從內(nèi)存中分配的。deleted表總是被存儲在高速緩存中。
  ·為DELETE動作定義的觸發(fā)器并不執(zhí)行TRUNCATE TABLE語句,原因在于日志不記錄TRUNCATE TABLE語句。
  示例
  在本例中,將創(chuàng)建一個觸發(fā)器,無論何時刪除一個產(chǎn)品類別(即從Categories表中刪除一條記錄),該觸發(fā)器都會更新Products表中的Discontinued列。所有受影響的產(chǎn)品都標(biāo)記為1,標(biāo)示不再使用這些產(chǎn)品了。

復(fù)制代碼 代碼如下:

USE Northwind

CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID


  UPDATE觸發(fā)器的工作過程
  可將UPDATE語句看成兩步操作:即捕獲數(shù)據(jù)前像(before image)的DELETE語句,和捕獲數(shù)據(jù)后像(after image)的INSERT語句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。
  觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動作。
  可以使用IF UPDATE語句定義一個監(jiān)視指定列的數(shù)據(jù)更新的觸發(fā)器。這樣,就可以讓觸發(fā)器容易的隔離出特定列的活動。當(dāng)它檢測到指定列已經(jīng)更新時,觸發(fā)器就會進一步執(zhí)行適當(dāng)?shù)膭幼?,例如發(fā)出錯誤信息指出該列不能更新,或者根據(jù)新的更新的列值執(zhí)行一系列的動作語句。
  語法



IF UPDATE (column_name>)

  例1
  本例阻止用戶修改Employees表中的EmployeeID列。


復(fù)制代碼 代碼如下:

USE Northwind

GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END



  INSTEAD OF觸發(fā)器的工作過程
  可以在表或視圖上指定INSTEAD OF觸發(fā)器。執(zhí)行這種觸發(fā)器就能夠替代原始的觸發(fā)動作。INSTEAD OF觸發(fā)器擴展了視圖更新的類型。對于每一種觸發(fā)動作(INSERT、UPDATE或 DELETE),每一個表或視圖只能有一個INSTEAD OF觸發(fā)器。
  INSTEAD OF觸發(fā)器被用于更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個基于連接的視圖上進行DELETE操作。然而,可以編寫一個INSTEAD OF DELETE觸發(fā)器來實現(xiàn)刪除。上述觸發(fā)器可以訪問那些如果視圖是一個真正的表時已經(jīng)被刪除的數(shù)據(jù)行。將被刪除的行存儲在一個名為deleted的工作表中,就像AFTER觸發(fā)器一樣。相似地,在UPDATE INSTEAD OF觸發(fā)器或者INSERT INSTEAD OF觸發(fā)器中,你可以訪問inserted表中的新行。
  不能在帶有WITH CHECK OPTION定義的視圖中創(chuàng)建INSTEAD OF觸發(fā)器。
示例
  在本例中,創(chuàng)建了一個德國客戶表和一個墨西哥客戶表。放置在視圖上的INSTEAD OF觸發(fā)器將把更新操作重新定向到適當(dāng)?shù)幕砩?。這時發(fā)生的插入是對CustomersGer表的插入而不是對視圖的插入。
  創(chuàng)建兩個包含客戶數(shù)據(jù)的表:

復(fù)制代碼 代碼如下:


SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = 'Germany'

SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = 'Mexico'
GO


  在該數(shù)據(jù)上創(chuàng)建視圖:

復(fù)制代碼 代碼如下:

CREATE VIEW CustomersView AS

SELECT * FROM CustomersGer
UNION
SELECT * FROM CustomersMex
GO


  創(chuàng)建一個在上述視圖上的INSTEAD OF觸發(fā)器:

復(fù)制代碼 代碼如下:

CREATE TRIGGER Customers_Update2

ON CustomersView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = 'Germany'
BEGIN
UPDATE CustomersGer
SET CustomersGer.Phone = Inserted.Phone
FROM CustomersGer JOIN Inserted
ON CustomersGer.CustomerID = Inserted.CustomerID
END
ELSE
IF @Country = 'Mexico'
BEGIN
UPDATE CustomersMex
SET CustomersMex.Phone = Inserted.Phone
FROM CustomersMex JOIN Inserted
ON CustomersMex.CustomerID = Inserted.CustomerID
END


  通過更新視圖,測試觸發(fā)器:

復(fù)制代碼 代碼如下:

UPDATE CustomersView SET Phone = ' 030-007xxxx'

WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersView
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersGer
WHERE CustomerID = 'ALFKI'


  那么具體的講,對于多列數(shù)據(jù),如何計算方差呢?:

復(fù)制代碼 代碼如下:


CREATE TRIGGER [calT1T2T3] ON dbo.DCLB

FOR INSERT,UPDATE
AS
update P
SET
/**//*
計算方差的觸發(fā)器
*/
P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),
P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6 ),
P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)
FROM DCLB AS P INNER JOIN Inserted AS I
ON P.SID = I.SID


  觸發(fā)器的使用很方便,而且也很簡單,重要的是理解inserted過程??蓪PDATE語句看成兩步操作:即捕獲數(shù)據(jù)前像(before image)的DELETE語句,和捕獲數(shù)據(jù)后像(after image)的INSERT語句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動作。


認(rèn)識了一下觸發(fā)器的作用!
復(fù)制代碼 代碼如下:

/*
建立虛擬測試環(huán)境,包含:表[卷煙庫存表],表[卷煙銷售表]。
請大家注意跟蹤這兩個表的數(shù)據(jù),體會觸發(fā)器到底執(zhí)行了什么業(yè)務(wù)邏輯,對數(shù)據(jù)有什么影響。
為了能更清晰的表述觸發(fā)器的作用,表結(jié)構(gòu)存在數(shù)據(jù)冗余,且不符合第三范式,這里特此說明。
*/
USE Master
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷煙庫存表')
DROP TABLE 卷煙庫存表
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷煙銷售表')
DROP TABLE 卷煙銷售表
GO
--業(yè)務(wù)規(guī)則:銷售金額 = 銷售數(shù)量 * 銷售單價 業(yè)務(wù)規(guī)則。
CREATE TABLE 卷煙銷售表
(
卷煙品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
購貨商 VARCHAR(40) NULL,
銷售數(shù)量 INT NULL,
銷售單價 MONEY NULL,
銷售金額 MONEY NULL
)
GO
--業(yè)務(wù)規(guī)則:庫存金額 = 庫存數(shù)量 * 庫存單價 業(yè)務(wù)規(guī)則。
CREATE TABLE 卷煙庫存表
(
卷煙品牌 VARCHAR(40) PRIMARY KEY NOT NULL,
庫存數(shù)量 INT NULL,
庫存單價 MONEY NULL,
庫存金額 MONEY NULL
)
GO
--創(chuàng)建觸發(fā)器,示例1
/*
創(chuàng)建觸發(fā)器[T_INSERT_卷煙庫存表],這個觸發(fā)器較簡單。
說明: 每當(dāng)[卷煙庫存表]發(fā)生 INSERT 動作,則引發(fā)該觸發(fā)器。
觸發(fā)器功能: 強制執(zhí)行業(yè)務(wù)規(guī)則,保證插入的數(shù)據(jù)中,庫存金額 = 庫存數(shù)量 * 庫存單價。
注意: [INSERTED]、[DELETED]為系統(tǒng)表,不可創(chuàng)建、修改、刪除,但可以調(diào)用。
重要: 這兩個系統(tǒng)表的結(jié)構(gòu)同插入數(shù)據(jù)的表的結(jié)構(gòu)。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙庫存表')
DROP TRIGGER T_INSERT_卷煙庫存表
GO
CREATE TRIGGER T_INSERT_卷煙庫存表
ON 卷煙庫存表
FOR INSERT
AS
--提交事務(wù)處理
BEGIN TRANSACTION
--強制執(zhí)行下列語句,保證業(yè)務(wù)規(guī)則
UPDATE 卷煙庫存表
SET 庫存金額 = 庫存數(shù)量 * 庫存單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 from INSERTED)
COMMIT TRANSACTION
GO
/*
針對[卷煙庫存表],插入測試數(shù)據(jù):
注意,第一條數(shù)據(jù)(紅塔山新勢力)中的數(shù)據(jù)符合業(yè)務(wù)規(guī)則,
第二條數(shù)據(jù)(紅塔山人為峰)中,[庫存金額]空,不符合業(yè)務(wù)規(guī)則,
第三條數(shù)據(jù)(云南映像)中,[庫存金額]不等于[庫存數(shù)量]乘以[庫存單價],不符合業(yè)務(wù)規(guī)則。
第四條數(shù)據(jù)庫存數(shù)量為0。
請注意在插入數(shù)據(jù)后,檢查[卷煙庫存表]中的數(shù)據(jù)是否 庫存金額 = 庫存數(shù)量 * 庫存單價。
*/
INSERT INTO 卷煙庫存表(卷煙品牌,庫存數(shù)量,庫存單價,庫存金額)
SELECT '紅塔山新勢力',100,12,1200 UNION ALL
SELECT '紅塔山人為峰',100,22,NULL UNION ALL
SELECT '云南映像',100,60,500 UNION ALL
SELECT '玉溪',0,30,0
GO
--查詢數(shù)據(jù)
SELECT * FROM 卷煙庫存表
GO

/*
結(jié)果集
RecordId 卷煙品牌 庫存數(shù)量 庫存單價 庫存金額
-------- ------------ -------- ------- ---------
1 紅塔山新勢力 100 12.0000 1200.0000
2 紅塔山人為峰 100 22.0000 2200.0000
3 云南映像 100 60.0000 6000.0000
4 玉溪 0 30.0000 .0000
(所影響的行數(shù)為 4 行)
*/
--觸發(fā)器示例2
復(fù)制代碼 代碼如下:

/*
創(chuàng)建觸發(fā)器[T_INSERT_卷煙銷售表],該觸發(fā)器較復(fù)雜。
說明: 每當(dāng)[卷煙庫存表]發(fā)生 INSERT 動作,則引發(fā)該觸發(fā)器。
觸發(fā)器功能: 實現(xiàn)業(yè)務(wù)規(guī)則。
業(yè)務(wù)規(guī)則: 如果銷售的卷煙品牌不存在庫存或者庫存為零,則返回錯誤。
否則則自動減少[卷煙庫存表]中對應(yīng)品牌卷煙的庫存數(shù)量和庫存金額。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷煙銷售表')
DROP TRIGGER T_INSERT_卷煙銷售表
GO
CREATE TRIGGER T_INSERT_卷煙銷售表
ON 卷煙銷售表
FOR INSERT
AS
BEGIN TRANSACTION
--檢查數(shù)據(jù)的合法性:銷售的卷煙是否有庫存,或者庫存是否大于零
IF NOT EXISTS (
SELECT 庫存數(shù)量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙不存在庫存,不能銷售。',16,1)
--回滾事務(wù)
ROLLBACK
RETURN
END
IF EXISTS (
SELECT 庫存數(shù)量
FROM 卷煙庫存表
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED) AND
庫存數(shù)量 = 0
)
BEGIN
--返回錯誤提示
RAISERROR('錯誤!該卷煙庫存小于等于0,不能銷售。',16,1)
--回滾事務(wù)
ROLLBACK
RETURN
END
--對合法的數(shù)據(jù)進行處理
--強制執(zhí)行下列語句,保證業(yè)務(wù)規(guī)則
UPDATE 卷煙銷售表
SET 銷售金額 = 銷售數(shù)量 * 銷售單價
WHERE 卷煙品牌 IN (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @卷煙品牌 VARCHAR(40)
SET @卷煙品牌 = (SELECT 卷煙品牌 FROM INSERTED)
DECLARE @銷售數(shù)量 MONEY
SET @銷售數(shù)量 = (SELECT 銷售數(shù)量 FROM INSERTED)
UPDATE 卷煙庫存表
SET 庫存數(shù)量 = 庫存數(shù)量 - @銷售數(shù)量,
庫存金額 = (庫存數(shù)量 - @銷售數(shù)量)*庫存單價
WHERE 卷煙品牌 = @卷煙品牌
COMMIT TRANSACTION
GO
--請大家自行跟蹤[卷煙庫存表]和[卷煙銷售表]的數(shù)據(jù)變化。
--針對[卷煙銷售表],插入第一條測試數(shù)據(jù),該數(shù)據(jù)是正常的。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅塔山新勢力','某購貨商',10,12,1200
GO
--針對[卷煙銷售表],插入第二條測試數(shù)據(jù),該數(shù)據(jù) 銷售金額 不等于 銷售單價 * 銷售數(shù)量。
--觸發(fā)器將自動更正數(shù)據(jù),使 銷售金額 等于 銷售單價 * 銷售數(shù)量。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅塔山人為峰','某購貨商',10,22,2000
GO
--針對[卷煙銷售表],插入第三條測試數(shù)據(jù),該數(shù)據(jù)中的卷煙品牌在 卷煙庫存表中找不到對應(yīng)。
--觸發(fā)器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '紅河V8','某購貨商',10,60,600
GO

/*
結(jié)果集
服務(wù)器: 消息 50000,級別 16,狀態(tài) 1,過程 T_INSERT_卷煙銷售表,行 15
錯誤!該卷煙不存在庫存,不能銷售。
*/
--針對[卷煙銷售表],插入第三條測試數(shù)據(jù),該數(shù)據(jù)中的卷煙品牌在 卷煙庫存表中庫存為0。
--觸發(fā)器將報錯。
INSERT INTO 卷煙銷售表(卷煙品牌,購貨商,銷售數(shù)量,銷售單價,銷售金額)
SELECT '玉溪','某購貨商',10,30,300
GO
/*
結(jié)果集
服務(wù)器: 消息 50000,級別 16,狀態(tài) 1,過程 T_INSERT_卷煙銷售表,行 29
錯誤!該卷煙庫存小于等于0,不能銷售。
*/
--查詢數(shù)據(jù)
SELECT * FROM 卷煙庫存表
SELECT * FROM 卷煙銷售表
GO
/*
補充:
1、本示例主要通過一個簡單的業(yè)務(wù)規(guī)則實現(xiàn)來進行觸發(fā)器使用的說明,具體的要根據(jù)需要靈活處理;
2、關(guān)于觸發(fā)器要理解并運用好 INSERTED ,DELETED 兩個系統(tǒng)表;
3、本示例創(chuàng)建的觸發(fā)器都是 FOR INSERT ,具體的語法可參考:
Trigger語法
復(fù)制代碼 代碼如下:

CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ] --用于加密觸發(fā)器
{
{ { 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 ]
}
}

4、關(guān)于觸發(fā)器,還應(yīng)該注意
(1)、DELETE 觸發(fā)器不能捕獲 TRUNCATE TABLE 語句。
(2)、觸發(fā)器中不允許以下 Transact-SQL 語句:
ALTER DATABASE CREATE DATABASE DISK INIT
DISK RESIZE DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE RESTORE DATABASE
RESTORE LOG
(3)、觸發(fā)器最多可以嵌套 32 層。
*/
--修改觸發(fā)器
--實質(zhì)上,是將 CREATE TRIGGER ... 修改為 ALTER TRIGGER ...即可。
--刪除觸發(fā)器
DROP TRIGGER xxx
GO
--刪除測試環(huán)境
DROP TABLE 卷煙庫存表
GO
DROP TABLE 卷煙銷售表
GO
DROP TRIGGER T_INSERT_卷煙庫存表
GO
DROP TRIGGER T_INSERT_卷煙銷售表
GO
##################################################################
觸發(fā)器的基礎(chǔ)知識和例子
: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 :觸發(fā)器名稱
2 on table/view :觸發(fā)器所作用的表。一個觸發(fā)器只能作用于一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增項目afrer 與 instead of 的區(qū)別
After
在觸發(fā)事件發(fā)生以后才被激活,只可以建立在表上
Instead of
代替了相應(yīng)的觸發(fā)事件而被執(zhí)行,既可以建立在表上也可以建立在視圖上
5 insert、update、delete:激活觸發(fā)器的三種操作,可以同時執(zhí)行,也可選其一
6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則激活觸發(fā)器。此外,因為delete 操作只對行有影響,
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能激活觸發(fā)器,沒意義)。
7 觸發(fā)器執(zhí)行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行激活觸發(fā)器時由系統(tǒng)自動生成的,其結(jié)構(gòu)與觸發(fā)器作用的表結(jié)構(gòu)是一
樣的,只是存放 的數(shù)據(jù)有差異。
續(xù)
下面表格說明deleted 與inserted 數(shù)據(jù)的差異
deleted 與inserted 數(shù)據(jù)的差異
Inserted
存放進行insert和update 操作后的數(shù)據(jù)
Deleted
存放進行delete 和update操作前的數(shù)據(jù)
注意:update 操作相當(dāng)于先進行delete 再進行insert ,所以在進行update操作時,修改前的數(shù)據(jù)拷貝一條到deleted 表中,修改后
的數(shù)據(jù)在存到觸發(fā)器作用的表的同時,也同時生成一條拷貝到insered表中
您可能感興趣的文章:
  • SQLServer觸發(fā)器創(chuàng)建、刪除、修改、查看示例代碼
  • SQL Server 觸發(fā)器 表的特定字段更新時,觸發(fā)Update觸發(fā)器
  • sqlserver 禁用觸發(fā)器和啟用觸發(fā)器的語句
  • SQL SERVER中各類觸發(fā)器的完整語法及參數(shù)說明
  • SQL Server:觸發(fā)器實例詳解
  • sqlserver中觸發(fā)器+游標(biāo)操作實現(xiàn)
  • SQL Server觸發(fā)器及觸發(fā)器中的事務(wù)學(xué)習(xí)
  • sqlserver 觸發(fā)器學(xué)習(xí)(實現(xiàn)自動編號)
  • sqlserver 觸發(fā)器教程
  • 關(guān)于喜憂參半的SQL Server觸發(fā)器詳解

標(biāo)簽:巴彥淖爾 朔州 遼源 邢臺 鹽城 宜春 本溪 通化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sqlserver 觸發(fā)器實例代碼》,本文關(guān)鍵詞  sqlserver,觸發(fā)器,實例,代碼,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《sqlserver 觸發(fā)器實例代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于sqlserver 觸發(fā)器實例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    色av一区二区三区| 瑟瑟网站在线观看| 国产极品粉嫩福利姬萌白酱| 四虎免费在线观看| 国产裸体免费无遮挡| 91porn在线| 99久热在线精品996热是什么| 欧美韩国一区| 国产91精品青草社区| 日本中文字幕在线观看视频| 久久天堂久久| 成人激情综合网站| 午夜精品久久久久久久久久久| 蜜桃久久精品一区二区| 在线看的毛片| 亚洲区小说区| 国产性猛交╳xxx乱大交| 国产免费黄色一级片| 欧美色videos| 日韩欧美一级在线| 九七伦理97伦理| 免费久久99精品国产自| 99精品视频播放| 国产一区在线观看视频| 亚洲欧美日韩一区二区| 久久久久久久网站| 欧美一级播放| 亚洲视频手机在线观看| 日韩中文字幕亚洲一区二区va在线| 国产麻豆久久| 一级黄色大片视频| 国产福利视频网站| 日韩一本大道| 久久av综合| 成人在线影视| www.555国产精品免费| 朝桐光av在线一区二区三区| 日本a级片电影一区二区| 欧美日韩在线大尺度| 美国十次综合久久| 欧美激情中文不卡| 风间由美性色一区二区三区| 日韩人体视频| 国产日韩第一页| 麻豆changesxxx国产| 清纯唯美亚洲经典中文字幕| 色在线中文字幕| 一区二区三区视频免费在线观看| 国产原创精品在线| 午夜伊人狠狠久久| 亚洲一级二级三级在线免费观看| 亚洲乱亚洲乱妇无码| 欧美综合二区| 日韩深夜福利| 午夜精品久久久久久久久久| 国产精品剧情一区二区在线观看| xvideos国产在线视频| 亚洲色图五月天| 欧美日一区二区| 男女私大尺度视频| 国产福利片一区二区| 91嫩草国产线观看亚洲一区二区| 日韩免费视频一区二区视频在线观看| 性欧美黑人xxxx| 校园春色亚洲| 18成年在线观看| 丰满女人性猛交| 成人av电影在线| 日韩视频在线永久播放| 亚洲专区**| 成人激情视频在线| 亚洲欧美大片| 天堂а√在线中文在线| 91精品国产综合久久香蕉的用户体验| 欧美一级一级性生活免费录像| 国产精品久久久久一区二区三区共| 国产91精品精华液一区二区三区| 巨胸大乳www视频免费观看| 亚洲女人天堂a在线播放| 国产一级精品aaaaa看| 国产夫妻性爱视频| 亚洲欧美成人一区二区在线电影| 欧洲黄色一区| 欧美被狂躁喷白浆精品| 国产精品18久久久久| 亚洲 欧美 另类人妖| 国产精品美女久久久久久不卡| 欧美久久久影院| 男人操女人视频网站| 最近免费中文字幕在线第一页| 三级在线视频观看| 新婚的少妇hd中文字幕| 久久精品一区八戒影视| 亚洲天堂网av在线| 国产农村妇女aaaaa视频| 黄色一级片视频| 免费成人在线视频网站| 亚洲中文字幕无码一区二区三区| 国产极品一区二区三区| 鲁一鲁一鲁一鲁一色| 日韩午夜在线播放| 本网站久久精品| 日本视频在线观看免费| 日韩日韩日韩日韩日韩| 在线观看国产一区二区| 日本在线视频www| 在线免费观看日本一区| 九色蝌蚪在线观看| 中文字幕 91| 国产精品久久在线| 影音先锋中文字幕第一页| 日本1区2区3区中文字幕| 精品一区二区影视| 91九色极品视频| 国产女主播一区| 中文字幕综合在线观看| 高潮毛片又色又爽免费| av激情在线| 欧美做受高潮6| 日本久久91av| 狠狠色丁香久久婷婷综合丁香| 91色琪琪电影亚洲精品久久| 秋霞成人午夜鲁丝一区二区三区| 成人av第一页| 国产69精品久久777的优势| 久久久久久久爱| 国产精品一区二区性色av| 一区二区三区视频播放| 91嫩草精品| 国产亚洲精品久久久| 蜜臀视频在线观看| 一区二区在线影院| 婷婷六月综合| 久久激情综合网| 日本在线视频网| 中文字幕日本最新乱码视频| 国产图片综合| 日韩精品免费播放| 精品久久九九| 亚洲成人av免费观看| 亚洲欧美日韩久久久久久| 国产精品久久久久久久久久妞妞| 91高潮精品免费porn| 欧美极品少妇与黑人| 国产精品免费一区二区三区都可以| 国产揄拍国内精品对白| 国产精品久久精品国产| 中文字幕av不卡| 日韩脚交footjobhdboots| 91在线短视频| 国产成人无码av| 伊人网免费视频| xfplay资源站夜色先锋| 亚洲综合在线电影| 一区三区视频| 亚洲午夜日本在线观看| 成人亚洲成人影院| 2017亚洲天堂| 成人中文字幕合集| 久久久影视传媒| 欧美日韩一区二区视频在线| 国产黄色精品| 日日摸夜夜夜夜夜添| 久久精品首页| 麻豆国产欧美日韩综合精品二区| 外国电影一区二区| 麻豆亚洲av成人无码久久精品| 国产欧美日韩综合精品一区二区| 好吊日精品视频| 午夜精品免费观看| 55夜色66夜色国产精品视频| 国产精品99久久久久久久久| 在线成人亚洲| 精东传媒在线观看| 97视频在线观看视频免费视频| 99亚洲伊人久久精品影院| 视频亚洲一区二区| 成人无码av片在线观看| 3d欧美精品动漫xxxx无尽| 丝袜制服影音先锋| 国产精品第二十页| 一菊综合网成人综合网| 天堂资源在线中文精品| 大桥未久在线视频| 伊人久久久久久久久久久久久| 巨人精品**| 国产电影一区二区在线观看| 337p日本欧洲亚洲大胆精品| 登山的目的在线| 欧美三级电影精品| 丁香啪啪综合成人亚洲| 亚洲国产一区二区在线播放| 国产一精品一av一免费爽爽| 久久精品中文字幕免费mv| 久久久久中文字幕| 中文字幕日韩精品一区| 在线观看欧美精品| 免费一级片在线观看| 欧美日韩91| 91露出在线| 亚洲精品一区二区三区四区五区| a√中文在线观看| 欧美色综合天天久久综合精品| 国产直播在线| www.com污| 成人网中文字幕| 艳妇乳肉豪妇荡乳xxx| 成人区精品一区二区不卡| 性欧美最新另类| 亚洲成av人片乱码色午夜| 中文字幕无码精品亚洲35| 国产精品网站大全| 7777精品伊人久久久大香线蕉最新版| 秋霞av国产精品一区| 性高潮久久久久久久| 国产精品巨作av| 奇米影视四色在线| 一区二区自拍偷拍| 亚洲精品成人影院| 不卡一区二区三区四区五区| 无码aⅴ精品一区二区三区浪潮| 巨胸喷奶水www久久久免费动漫| 毛片av免费观看| 国产精品不卡av| 亚洲va中文在线播放免费| 丰满岳乱妇dvd日本| 91在线观看喷潮| 亚洲天堂2024| 久草网视频在线观看| 九七影院97影院理论片久久| 激情欧美一区二区三区中文字幕| 久久视频免费| 国产乱码精品一区二区三| 国产成人免费看一级大黄| 欧美精品一区二区三区一线天视频| 精品久久久久久久| 97超碰欧美中文字幕| 日韩午夜影院| 迷人的保姆韩国| 两个人看的免费完整在线观看| 欧美中文在线| 欧美 日韩 国产 在线观看| 日本欧美一区二区| 好男人中文字幕官网| 大桥未久av一区二区三区中文| 91嫩草丨国产丨精品| 最新亚洲精品国自产在线观看| 无码无遮挡又大又爽又黄的视频| 91精品国产欧美一区二区| 麻豆成人免费电影| 欧美日韩性生活视频| 欧美亚洲精品天堂| 可以免费观看av毛片| 成人欧美一区二区三区黑人孕妇| 在线免费观看成人网| 亚洲日本三级| 不卡一区二区三区四区五区| 日本一级在线观看| 亚洲女同一区二区| 网站永久看片免费| 欧美一区二区久久| 国产成人在线一区| 一级片视频免费观看| 中文字幕一区二区精品区| 精品网站999| 日本不卡免费在线视频| 激情综合网av| 亚洲精品不卡在线| 国产精品女同一区二区三区| 黑人巨大猛交丰满少妇| 在线不卡一区| 欧美成人精品一区二区三区| 爱情岛论坛vip永久入口| 国产精品suv一区二区| 自拍亚洲一区欧美另类| 精品久久久久久国产| av一区二区三区| 日本tube24xxxxx| 又色又爽的视频| 欧美一区二区三区爽大粗免费| 国产大学生校花援交在线播放| 国产亚洲一区二区在线观看| 久久久美女毛片| 日韩主播视频在线| 国产一区二区三区四区五区入口| 久久99深爱久久99精品| 国产小视频在线高清播放| 黄色av免费在线| 电影一区二区三区| 成人黄色免费| 这里是久久伊人| 成人福利在线看| 18成人免费观看视频漫画| 性欧美大战久久久久久久免费观看| 麻豆一区二区三区四区精品蜜桃| 中文字幕第一页在线| 91色在线看| 不卡的国产精品| 91玉足脚交白嫩脚丫| 久草在.com| 九热爱视频精品视频| 亚欧色一区w666天堂| 久久99蜜桃综合影院免费观看| 国产精品中文欧美| 亚洲国产精品综合久久久| 婷婷国产在线综合| 一区二区三区av在线| 在线免费看av不卡| 好吊视频一二三区| 99国产精品久久久久老师| 自拍偷拍你懂的| 欧美一级欧美三级在线观看| 欧美韩国日本在线观看| 国内精品伊人久久久久影院对白| 日本熟妇色xxxxx日本免费看| 97超碰在线公开在线看免费| 国产呦系列欧美呦日韩呦| 自拍视频在线免费观看| 精品视频一区二区不卡| 久久365资源| 九九九九九精品| 青春草视频在线| 欧美 变态 另类 人妖| 免费无码不卡视频在线观看| 久久久久久亚洲精品中文字幕| 国产又黄又大又粗的视频| 欧美性视频在线播放| 久久影院午夜论|