久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL7.0手冊-程序員手冊 -47. 觸發器

2019-09-08 23:34:18
字體:
來源:轉載
供稿:網友
第四十七章. 觸發器
內容 
創建觸發器 
與觸發器管理器交互 
數據改變的可視性 
例子 
Postgres 擁有多種客戶接口,象Perl,Tcl,Python 和 C,還有兩種 過程語言 (PL).同樣也可能把 C 函數的調用作為觸發器的動作.要注意當前版本還不支持語句級(STATEMENT-level)的觸發器事件.目前你可以在 INSERT,DELETE 或 UPDATE 一條記錄上聲明 BEFORE 或 AFTER (之前或之后)作為觸發器事件. 
創建觸發器
如果發生了觸發器事件,觸發器管理器(由執行器調用)初始化全局結構 TriggerData *CurrentTriggerData (下面描述)并調用觸發器函數來操作事件. 
觸發器函數必須作為一個沒有參數并且返回 opaque 的函數在創建觸發器之前創建. 

創建觸發器的語法如下: 

CREATE TRIGGER trigger [ BEFORE | AFTER ] [ INSERT | DELETE | UPDATE [ OR ... ] ]
    ON relation FOR EACH [ ROW | STATEMENT ]
    EXECUTE PROCEDURE procedure
     (args);
這里的參數是: 
trigger 
如果你想刪除觸發器,那么這是所使用的觸發器的名稱.它被當做 DROP TRIGGER 命令的一個參數. 
BEFORE, AFTER 
決定函數是在事件之前還是之后調用. 
INSERT, DELETE, UPDATE 
命令的下一元素決定在什么事件上觸發該函數.多個事件可以用 OR 分隔聲明. 
relation 
關系名,決定該事件應用于哪個表. 
ROW, STATEMENT 
FOR EACH 子句決定該觸發器是為每個受影響的行觸發還是在整個語句完成之前(或之后)觸發. 
procedure 
過程名就是調用的 C 函數. 
args 
參數是放在 CurrentTriggerData 結構里面傳給函數的.傳遞參數給函數的目的是為了允許類似要求的不同的觸發器調用同樣的函數. 
  
  
  
  

同樣,函數可以被用于觸發不同的關系(這些函數被命名為"通用觸發器函數")。 

做為使用上面兩個特性的例子,可以有一個通用函數把兩個字段名稱作為參數:把當前用戶作為一個參數而把當前時標做為另一個參數.這樣就允許我們在 INSERT 事件上寫一個觸發器來自動跟蹤一個事務表里的記錄的創建.如果用于一個 UPDATE 事件,同樣我們可以當 "最后更新"(last updated)函數來用.

觸發器函數返回 HeapTuple 給調用它的執行器.這個返回在那些在 INSERT,DELETE 或 UPDATE 操作之后執行的觸發器上被忽略,但它允許那些 BEFORE 觸發器用來: 
返回 NULL 以忽略對當前記錄的操作(這樣該記錄就將不會被插入/更新/刪除). 
返回一個指向另一個記錄的指針(只用于 INSERT 和 UPDATE ),該指針所指記錄將代替原始記錄被插入(或者作為在 UPDATE 中記錄的新版本).

注意,CREATE TRIGGER 句柄將不進行任何初始化工作.這一點將在以后進行修改.同樣,如果多于一個觸發器為同樣的事件定義在同樣的關系上,觸發器觸發的順序將不可預料.這一點以后也會修改. 
如果一個觸發器函數執行 SQL-查詢(使用 SPI)那么這些查詢可能再次觸發觸發器.這就是所謂的嵌套觸發器.對嵌套觸發器的嵌套深度沒有顯式的限制. 

如果一個觸發器是被 INSERT 觸發并且插入一個新行到同一關系中,然后該觸發器將被再次觸發.目前對這種情況沒有提供任何同步(等)的措施,這一點也可能會修改.目前,回歸測試里有一個函數 funny_dup17() 使用了一些技巧避免對自身的遞歸(嵌套)調用...


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

與觸發器管理器交互
如我們前面所說,當觸發器管理器調用函數時,結構 TriggerData *CurrentTriggerData 是 NOT NULL (非空)的并且初始化過的.所以最好檢查 CurrentTriggerData 結構以防止在開始時就是 NULL (空)的并且在獲取信息之后把它清空以避免從非觸發器管理器來的觸發器函數. 
結構(struct)TriggerData 在 src/include/commands/trigger.h 里定義: 

typedef struct TriggerData
{
    TriggerEvent  tg_event;
    Relation      tg_relation;
    HeapTuple     tg_trigtuple;
    HeapTuple     tg_newtuple;
    Trigger      *tg_trigger;
} TriggerData;
這些成員的定義如下: 
tg_event 
描述調用函數的事件.你可以使用下面的宏來檢驗 tg_event:
TRIGGER_FIRED_BEFORE(tg_event) 
returns TRUE if trigger fired BEFORE.(觸發器由 BEFORE 觸發返回 TRUE) 
TRIGGER_FIRED_AFTER(tg_event) 
Returns TRUE if trigger fired AFTER.(觸發器由 AFTER 觸發返回 TRUE) 
TRIGGER_FIRED_FOR_ROW(event) 
Returns TRUE if trigger fired for a ROW-level event.(觸發器行級(ROW-level)觸發返回 TRUE) 
TRIGGER_FIRED_FOR_STATEMENT(event) 
Returns TRUE if trigger fired for STATEMENT-level event.(觸發器語句級(ROW-level)觸發返回 TRUE) 
TRIGGER_FIRED_BY_INSERT(event) 
Returns TRUE if trigger fired by INSERT.(觸發器由 INSERT 觸發返回 TRUE) 
TRIGGER_FIRED_BY_DELETE(event) 
Returns TRUE if trigger fired by DELETE.(觸發器由 DELETE 觸發返回 TRUE) 
TRIGGER_FIRED_BY_UPDATE(event) 
Returns TRUE if trigger fired by UPDATE.(觸發器由 UPDATE 觸發返回 TRUE)
tg_relation 
是一個指向描述被觸發的關系的結構的指針.請參考src/include/utils/rel.h 獲取關于此結構的詳細信息.最讓人感興趣的事情是 tg_relation->rd_att (關系記錄的描述) 和 tg_relation->rd_rel->relname (關系名.這個變量的類型不是 char*,而是 NameData.用 SPI_getrelname(tg_relation) 獲取 char* ,如果你需要一份名字的拷貝的話). 
tg_trigtuple 
是一個指向觸發觸發器的記錄的指針.這是一個正在被 插入(INSERT),刪除(DELETE)或更新(UPDATE)的記錄.如果是 INSERT/DELETE ,那么這就是你將返回給執行器的東西--如果你不想用另一條記錄覆蓋此記錄(INSERT)或忽略操作. 
tg_newtuple 
如果是 UPDATE,這是一個指向新版本的記錄的指針,如果是 INSERT 或 DELETE,就是 NULL這就是你將返回給執行器的東西-- 如果你是 UPDATE 并且你不想用另一條記錄替換這條記錄或忽略操作. 
tg_trigger 
是一個指向結構 Trigger 的指針,該結構在 src/include/utils/rel.h 里定義: 
typedef struct Trigger
{
    Oid         tgoid;
    char       *tgname;
    Oid         tgfoid;
    FmgrInfo    tgfunc;
    int16       tgtype;
    bool        tgenabled;
    bool        tgisconstraint;
    bool        tgdeferrable;
    bool        tginitdeferred;
    int16       tgnargs;
    int16       tgattr[FUNC_MAX_ARGS];
    char      **tgargs;
} Trigger;
tgname 是觸發器的名稱,tgnargs 是在 tgargs 里參數的數量,tgargs 是一個指針數組,數組里每個指針指向在 CREATE TRIGGER 語句里聲明的參數.其他成員只在內部使用.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

數據改變的可視性
Postgres 數據修改的可視性規則:在查詢執行過程中,由查詢本身造成的數據修改(通過 SQL-函數,SPI-函數,觸發器)對查詢掃描而言是不可見的.例如,在查詢 
   INSERT INTO a SELECT * FROM a
里,插入的記錄對 SELECT 的掃描是不可見的.實際上,這么做在數據庫內部形成非遞歸的數據庫表的復制(當然是要受到唯一索引規則的制約的) 
但是請記住在 SPI 文擋里關于可視性的注釋: 

由查詢 Q 造成的改變可以為查詢 Q 以后運行的查詢可見,不管這些查詢 
是在查詢 Q 內部開始運行(在 Q 運行期間)的還是Q運行完畢后開始運行的
這些對觸發器而言也是正確的,盡管被插入的記錄 (tg_trigtuple)對 BEFORE 觸發器是不可見的,這個剛被插入的記錄卻可以被一個 AFTER 觸發器看到,并且對所有這個(觸發器)以后的所有 BEFORE/AFTER 觸發器均可見!

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

例子
在 src/test/regress/regress.c 和 contrib/spi 里有更復雜的例子. 
這里是一個非常簡單的觸發器使用的例子.函數 trigf 報告在被觸發的關系 ttest 中記錄數量,并且如果查詢試圖把 NULL 插入到 x 里(例如 -它做為一個 NOT NULL 約束但不退出事務的約束)時略過操作. 

#include "executor/spi.h"       /* this is what you need to work with SPI */
#include "commands/trigger.h"   /* -"- and triggers */

HeapTuple               trigf(void);

HeapTuple
trigf()
{
        TupleDesc       tupdesc;
        HeapTuple       rettuple;
        char            *when;
        bool            checknull = false;
        bool            isnull;
        int             ret, i;

        if (!CurrentTriggerData)
                elog(WARN, "trigf: triggers are not initialized");
        
        /* tuple to return to Executor */
        if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event))
                rettuple = CurrentTriggerData->tg_newtuple;
        else
                rettuple = CurrentTriggerData->tg_trigtuple;
        
        /* check for NULLs ? */
        if (!TRIGGER_FIRED_BY_DELETE(CurrentTriggerData->tg_event) &&
                TRIGGER_FIRED_BEFORE(CurrentTriggerData->tg_event))
                checknull = true;
        
        if (TRIGGER_FIRED_BEFORE(CurrentTriggerData->tg_event))
                when = "before";
        else
                when = "after ";
        
        tupdesc = CurrentTriggerData->tg_relation->rd_att;
        CurrentTriggerData = NULL;
        
        /* Connect to SPI manager */
        if ((ret = SPI_connect()) < 0)
                elog(WARN, "trigf (fired %s): SPI_connect returned %d", when, ret);
        
        /* Get number of tuples in relation */
        ret = SPI_exec("select count(*) from ttest", 0);
        
        if (ret < 0)
                elog(WARN, "trigf (fired %s): SPI_exec returned %d", when, ret);
        
        i = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull);
        
        elog (NOTICE, "trigf (fired %s): there are %d tuples in ttest", when, i);
        
        SPI_finish();
        
        if (checknull)
        {
                i = SPI_getbinval(rettuple, tupdesc, 1, &isnull);
                if (isnull)
                        rettuple = NULL;
        }

        return (rettuple);
}
然后,編譯和創建表 ttest (x int4): 
create function trigf () returns opaque as 
'...path_to_so' language 'c';
vac=> create trigger tbefore before insert or update or delete on ttest 
for each row execute procedure trigf();
CREATE
vac=> create trigger tafter after insert or update or delete on ttest 
for each row execute procedure trigf();
CREATE
vac=> insert into ttest values (null);
NOTICE:trigf (fired before): there are 0 tuples in ttest
INSERT 0 0

-- Insertion skipped and AFTER trigger is not fired

vac=> select * from ttest;
x
-
(0 rows)

vac=> insert into ttest values (1);
NOTICE:trigf (fired before): there are 0 tuples in ttest
NOTICE:trigf (fired after ): there are 1 tuples in ttest
                                       ^^^^^^^^
                             remember what we said about visibility.
INSERT 167793 1
vac=> select * from ttest;
x
-
1
(1 row)

vac=> insert into ttest select x * 2 from ttest;
NOTICE:trigf (fired before): there are 1 tuples in ttest
NOTICE:trigf (fired after ): there are 2 tuples in ttest
                                       ^^^^^^^^
                             remember what we said about visibility.
INSERT 167794 1
vac=> select * from ttest;
x
-
1
2
(2 rows)

vac=> update ttest set x = null where x = 2;
NOTICE:trigf (fired before): there are 2 tuples in ttest
UPDATE 0
vac=> update ttest set x = 4 where x = 2;
NOTICE:trigf (fired before): there are 2 tuples in ttest
NOTICE:trigf (fired after ): there are 2 tuples in ttest
UPDATE 1
vac=> select * from ttest;
x
-
1
4
(2 rows)

vac=> delete from ttest;
NOTICE:trigf (fired before): there are 2 tuples in ttest
NOTICE:trigf (fired after ): there are 1 tuples in ttest
NOTICE:trigf (fired before): there are 1 tuples in ttest
NOTICE:trigf (fired after ): there are 0 tuples in ttest
                                       ^^^^^^^^
                             remember what we said about visibility.
DELETE 2
vac=> select * from ttest;
x
-
(0 rows)

--------------------------------------------------------------------------------
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

美国精品一区二区| 日本午夜人人精品| 国产嫩草影院久久久久| 日韩高清一区在线| 国产精品久久无码一三区| 久久国产精品波多野结衣| 日韩精品一区二区三区高清免费| 日本中文字幕在线视频观看| 久久久久九九九| 91久久精品美女高潮| 韩国日本不卡在线| 久久人人爽人人爽人人片亚洲| 日韩女优制服丝袜电影| 欧美日韩在线一区二区| 色拍拍在线精品视频8848| 亚洲综合图片区| 国产精品久久久久久久裸模| 99国产精品久| www.欧美日韩国产在线| 国产成人av一区二区| 狠狠色丁香九九婷婷综合五月| 狠狠躁日日躁夜夜躁av| 亚洲精品久久久久久无码色欲四季| 探花国产精品一区二区| 久久国产视频播放| 免费一级肉体全黄毛片| 免费毛片在线播放免费| 亚洲综合网在线| 免费看一级大片| 国产老头老太做爰视频| 希岛爱理中文字幕| 永久免费看黄网站| 日韩精品一卡二卡| 国产区一区二区三| 毛片在线免费播放| 国产口爆吞精一区二区| 亚洲成人777777| 涩涩视频免费看| 美国一区二区三区在线播放| 美日韩一区二区三区| 国内欧美视频一区二区| 成人免费观看视频| ww久久中文字幕| 中文字幕亚洲不卡| 午夜欧美2019年伦理 | 国产精品久久久久久久久久久久冷| 国产精品视频久| 91大片在线观看| 久精品国产欧美| 中文字幕第50页| 2025韩国理伦片在线观看| 日韩精品在线播放视频| 国产探花视频在线播放| 日韩av在线电影| 国产永久免费视频| 蜜臀av性久久久久蜜臀aⅴ| 国产精品资源网| 中文字幕的久久| 欧美午夜久久久| 欧美精品一区二区精品网| 日韩在线国产精品| 国产精品视频一| 深田咏美在线x99av| 成年人视频观看| 佐佐木明希电影| 精品视频一区二区在线观看| 国产精品无码天天爽视频| 老司机精品视频导航| 国产精品你懂的| 欧美亚洲综合另类| 久久五月情影视| 亚洲影影院av| 国产视频一视频二| 国产熟妇搡bbbb搡bbbb| 中文字幕在线播| 美美哒免费高清在线观看视频一区二区| 99亚偷拍自图区亚洲| 色婷婷精品久久二区二区蜜臂av| 亚洲欧美精品伊人久久| 国产啪精品视频| 人妻无码一区二区三区四区| 影音先锋黄色资源| 欧美一区二区激情视频| 激情五月播播久久久精品| 国产精品第五页| 日韩一区二区三区四区五区六区| 欧美精品www| 日韩欧美亚洲日产国| 日本中文字幕在线不卡| 久久久久久久久久久影院| 奇米亚洲午夜久久精品| 一区二区三区日韩在线观看| 亚洲午夜女主播在线直播| 亚洲一区亚洲二区| 动漫av网站免费观看| 中文字幕求饶的少妇| 蜜桃视频污在线观看 | 成年网站在线免费观看| 国产精品视频在| 熟妇人妻一区二区三区四区| 伊人性伊人情综合网| 亚洲欧美制服综合另类| 精品久久久久久一区二区里番| 99视频在线免费| 成年人免费高清视频| 成人午夜激情影院| 精品嫩草影院久久| 国产传媒一区| 国产激情视频网站| 久久在线精品| 欧美性色欧美a在线播放| 日本高清不卡在线| 无码精品国产一区二区三区免费| 日本免费在线播放| 99精品视频在线观看| 亚洲白拍色综合图区| 成人一区二区三区四区| 黄色性视频网站| 久久精品综合| 欧美老肥妇做.爰bbww| 国产欧美日韩免费| 日韩av片网站| 国产成人精品免费看视频| 国产精品的网站| 欧美高跟鞋交xxxxhd| 18禁网站免费无遮挡无码中文| 国产一级中文字幕| 欧美激情一区在线| 欧美精品在线观看91| 欧美视频在线观看网站| 国产又黄又猛又粗又爽| 有坂深雪av一区二区精品| 91精品91久久久久久| 欧美成人福利在线观看| 亚洲国产精品久久久久爰性色| 欧美色videos| 超碰在线97av| 国产视频精品免费| 国产女同性恋一区二区| 欧美成人精品三级在线观看| 欧美极品欧美精品欧美图片| 国产www免费观看| 在线免费一区三区| 久久国产精品久久精品国产| 乱h高h女3p含苞待放| 国产人成亚洲第一网站在线播放| 久久电影一区二区| 天天视频天天爽| 天天插天天干天天操| 日韩视频一区二区三区在线播放| 日韩欧美精品在线不卡| 亚洲不卡在线视频| 日本久久电影网| 久久艳妇乳肉豪妇荡乳av| 欧美日韩人妻精品一区二区三区| 中文成人av在线| 国产成人中文字幕| 在线不卡av电影| 中文字幕一区av| 亚洲a一级视频| 农村老熟妇乱子伦视频| 日韩久久一区二区| 51精品国产人成在线观看| 四虎地址8848| 亚洲最新在线观看| 美媛馆国产精品一区二区| 最新中文字幕一区| 欧美精品乱码久久久久久按摩| 亚洲狠狠婷婷综合久久久| 97caocao| 精品一区电影国产| 伊人影院综合在线| 成人精品免费看| 国产精品成人品| a在线视频播放观看免费观看| 一区二区三区精品视频在线| 爱情岛论坛亚洲入口| 国产成人精品一区二三区| 91福利小视频| 日韩欧美国产综合在线| 久久成人av少妇免费| 久久久久久久久国产| 亚洲AV无码片久久精品| 亚洲精品国产无天堂网2021| 欧美h视频在线| 精品国产亚洲AV| 日韩一二三在线视频播| 偷拍女澡堂一区二区三区| 中文字幕亚洲电影| 日本一区二区三区视频在线观看 | 精品国产31久久久久久| 婷婷久久五月天| 久久精品五月| 91av网站在线播放| 国产黄色片视频| 日韩女同互慰一区二区| 中文字幕av不卡在线| 26uuu色噜噜精品一区二区| 亚洲一区二区中文| 亚洲第一成人av| 国内精久久久久久久久久人| 青青草原在线免费观看视频| 日韩三级视频在线观看| 中文字幕第10页| 亚洲国产精品一区二区久久恐怖片 | 麻豆中文一区二区| 欧美最猛性xxxxx免费| 日韩高清免费av| 国产亚洲美女精品久久久| 免费一级做a爰片久久毛片潮| 色婷婷久久综合| 九九精品久久久| 亚洲欧美精品午睡沙发| 白白操在线视频| 成人精品免费视频| 日韩性感在线| 成人一级片网址| 欧美三级网色| 粉嫩aⅴ一区二区三区四区| 国产一区免费在线观看| 日韩经典中文字幕一区| 91色精品视频在线| 久久久久久自在自线| 91九色在线观看| 天堂蜜桃91精品| 91在线色戒在线| 日本不卡在线视频| 精品伦精品一区二区三区视频| 免费不卡在线视频| 精品无人区一区二区三区| 国产乱码精品1区2区3区| 久久精品99| 成人中文字幕电影| 在线国产99| 国产精品天天看| 国产欧美日韩网站| 亚洲天堂a在线| 日本久久久久久久久久久久| 欧美视频二区36p| 丰满少妇xbxb毛片日本| 欧美高清视频一二三区| 免费看的黄色录像| 中文字幕九色91在线| 日本一级片免费看| 亚州精品天堂中文字幕| 国产黄色高清视频| 99久久99久久| 成人精品亚洲人成在线| 毛片av在线播放| 亚洲成av人片在线观看无码| 无码人妻久久一区二区三区蜜桃| 欧美xxxxxxxx| 日韩激情在线播放| 日韩美女福利视频| 免费成人在线网站| 丰满女人性猛交| 亚洲国产精品久久人人爱蜜臀| 1314成人网| 精品网站999www| 青青草视频在线观看免费| 国产精品国模在线| 精品亚洲aⅴ乱码一区二区三区| 亚洲不卡1区| 一区二区三区四区亚洲| 国产精品麻豆入口| 国产亚洲欧洲在线| 99国产成人精品| 国产视频99| 成人欧美一区二区三区在线播放| 99精品视频国产| 日韩精品视频观看| 国产精品女同一区二区| 久久国产精品亚洲va麻豆| 综合久久国产九一剧情麻豆| 国产av一区二区三区传媒| 亚洲欧美日韩综合| 精品人妻无码一区二区色欲产成人| 国产麻豆一区二区三区在线观看| 中文字幕不卡三区| 久久久久亚洲AV成人无码国产| 最近2019中文免费高清视频观看www99 | 一区二区三区四区视频| 免费黄色在线播放| 亚洲欧美久久久久一区二区三区| 日韩电影在线观看中文字幕| 亚洲九九爱视频| 日本老太婆做爰视频| 婷婷综合五月天| 国产人与禽zoz0性伦| 97热精品视频官网| 国产一区三区三区| av五月天在线| 日韩精品久久久久久福利| jlzzjlzzjlzz亚洲人| 日韩精品另类天天更新| 天天亚洲美女在线视频| 免费一级片在线观看| 114国产精品久久免费观看| 亚洲欧洲国产日韩| 波兰性xxxxx极品hd| 91久久久久久| 亚洲欧美国产三级| 免费在线一区二区三区| 91亚色免费| 狠狠色狠狠色综合日日五| 国产成人亚洲欧洲在线| 免费av在线一区二区| 黑人与娇小精品av专区| 99久久久无码国产精品免费蜜柚| 日本高清久久一区二区三区| 欧美三片在线视频观看| 国产又粗又猛又黄| 国产尤物av一区二区三区| 欧美成人精品二区三区99精品| 高清乱码毛片入口| 97公开免费视频| 久久久999国产| 国产精品一区二区视频| 免费黄视频在线观看| 午夜精品久久久久久久久久久久| 91蝌蚪porny| 一区二区三区影视| 久久久久久久免费| 欧美一区二区三区在线| 久久亚洲国产精品一区二区| 日日干日日操日日射| 国产91|九色| 亚洲成人tv网| 国产xxxxxx| 色偷偷中文字幕| 国产精品99免视看9| 亚洲国产精品久久人人爱蜜臀 | 日韩精品高清在线观看| 免费精品99久久国产综合精品| 99精品视频免费版的特色功能| 欧日韩不卡在线视频| 香蕉影视欧美成人| 成人精品在线播放| 日本成人在线免费| 91久久偷偷做嫩草影院| 日韩一级成人av| 国产超碰在线一区| 永久久久久久久| 激情视频小说图片| 欧美大肥婆大肥bbbbb| 中文字幕一区二区不卡 | 亚洲成人自拍偷拍| 性中国xxx极品hd| 国内精品免费视频| 国产一级精品aaaaa看| 亚洲国产精品va在看黑人| 99精品视频在线观看| 亚洲综合久久网| 男女曰b免费视频| 成人精品网站在线观看| 56国语精品自产拍在线观看| 国产成人99久久亚洲综合精品| 国产精品1234区| 日本在线视频www| 国产精品久久久久av| 欧美群妇大交群中文字幕| 国产91精品免费| 日干夜干天天干| 国产精品拍拍拍| 国产精品一区二区欧美黑人喷潮水| 日韩成人中文电影| 亚洲色图制服丝袜| 久久精品中文| 国产亚洲精品久久777777| 毛片在线视频播放| 国产欧美在线视频| 日韩成人中文电影| 亚洲午夜久久久久久久久电影院| 天堂中文资源在线观看| 男人的午夜天堂| 免费裸体美女网站| 精品国产免费人成电影在线观...| 一区二区三区高清国产| 亚洲综合精品自拍| 国产精品99久久久| 97超碰中文字幕| 素人fc2av清纯18岁| 大地资源网在线观看免费官网| 国产成人精品免高潮费视频| 精品国精品自拍自在线| 中文字幕五月欧美| 精品一区二区三区免费视频| 久久久精品毛片| 自拍偷拍视频亚洲| 日本www高清视频| 日韩免费av一区二区三区| 97热在线精品视频在线观看| 精品福利av导航| 亚洲成人精品一区二区| 成人精品免费网站| 欧美视频xxx| 国产精品500部| 99re这里只有| 国产成人精品无码播放| 奇米视频888战线精品播放| 国产成人激情小视频| 国产亚洲日本欧美韩国| 7777精品伊人久久久大香线蕉经典版下载 | 日韩激情第一页| 日韩欧美主播在线| 亚洲国产精品传媒在线观看| 激情久久五月天| 人妻无码中文字幕| 91高潮大合集爽到抽搐| 久久精品视频日本|