亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 數(shù)據(jù)庫(kù) > PostgreSQL > 正文

PostgreSQL7.0手冊(cè)-程序員手冊(cè) -47. 觸發(fā)器

2019-09-08 23:34:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
第四十七章. 觸發(fā)器
內(nèi)容 
創(chuàng)建觸發(fā)器 
與觸發(fā)器管理器交互 
數(shù)據(jù)改變的可視性 
例子 
Postgres 擁有多種客戶接口,象Perl,Tcl,Python 和 C,還有兩種 過(guò)程語(yǔ)言?。≒L).同樣也可能把 C 函數(shù)的調(diào)用作為觸發(fā)器的動(dòng)作.要注意當(dāng)前版本還不支持語(yǔ)句級(jí)(STATEMENT-level)的觸發(fā)器事件.目前你可以在 INSERT,DELETE 或 UPDATE 一條記錄上聲明 BEFORE 或 AFTER (之前或之后)作為觸發(fā)器事件. 
創(chuàng)建觸發(fā)器
如果發(fā)生了觸發(fā)器事件,觸發(fā)器管理器(由執(zhí)行器調(diào)用)初始化全局結(jié)構(gòu) TriggerData *CurrentTriggerData?。ㄏ旅婷枋觯┎⒄{(diào)用觸發(fā)器函數(shù)來(lái)操作事件. 
觸發(fā)器函數(shù)必須作為一個(gè)沒(méi)有參數(shù)并且返回 opaque 的函數(shù)在創(chuàng)建觸發(fā)器之前創(chuàng)建. 

創(chuàng)建觸發(fā)器的語(yǔ)法如下: 

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

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

做為使用上面兩個(gè)特性的例子,可以有一個(gè)通用函數(shù)把兩個(gè)字段名稱作為參數(shù):把當(dāng)前用戶作為一個(gè)參數(shù)而把當(dāng)前時(shí)標(biāo)做為另一個(gè)參數(shù).這樣就允許我們?cè)凇NSERT 事件上寫(xiě)一個(gè)觸發(fā)器來(lái)自動(dòng)跟蹤一個(gè)事務(wù)表里的記錄的創(chuàng)建.如果用于一個(gè) UPDATE 事件,同樣我們可以當(dāng) "最后更新"(last updated)函數(shù)來(lái)用.

觸發(fā)器函數(shù)返回 HeapTuple 給調(diào)用它的執(zhí)行器.這個(gè)返回在那些在 INSERT,DELETE 或 UPDATE 操作之后執(zhí)行的觸發(fā)器上被忽略,但它允許那些 BEFORE 觸發(fā)器用來(lái): 
返回 NULL 以忽略對(duì)當(dāng)前記錄的操作(這樣該記錄就將不會(huì)被插入/更新/刪除). 
返回一個(gè)指向另一個(gè)記錄的指針(只用于 INSERT 和 UPDATE ),該指針?biāo)赣涗泴⒋嬖加涗洷徊迦耄ɑ蛘咦鳛樵凇PDATE 中記錄的新版本).

注意,CREATE TRIGGER 句柄將不進(jìn)行任何初始化工作.這一點(diǎn)將在以后進(jìn)行修改.同樣,如果多于一個(gè)觸發(fā)器為同樣的事件定義在同樣的關(guān)系上,觸發(fā)器觸發(fā)的順序?qū)⒉豢深A(yù)料.這一點(diǎn)以后也會(huì)修改. 
如果一個(gè)觸發(fā)器函數(shù)執(zhí)行 SQL-查詢(使用 SPI)那么這些查詢可能再次觸發(fā)觸發(fā)器.這就是所謂的嵌套觸發(fā)器.對(duì)嵌套觸發(fā)器的嵌套深度沒(méi)有顯式的限制. 

如果一個(gè)觸發(fā)器是被 INSERT 觸發(fā)并且插入一個(gè)新行到同一關(guān)系中,然后該觸發(fā)器將被再次觸發(fā).目前對(duì)這種情況沒(méi)有提供任何同步(等)的措施,這一點(diǎn)也可能會(huì)修改.目前,回歸測(cè)試?yán)镉幸粋€(gè)函數(shù) funny_dup17() 使用了一些技巧避免對(duì)自身的遞歸(嵌套)調(diào)用...


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

與觸發(fā)器管理器交互
如我們前面所說(shuō),當(dāng)觸發(fā)器管理器調(diào)用函數(shù)時(shí),結(jié)構(gòu) TriggerData *CurrentTriggerData 是 NOT NULL?。ǚ强眨┑牟⑶页跏蓟^(guò)的.所以最好檢查 CurrentTriggerData 結(jié)構(gòu)以防止在開(kāi)始時(shí)就是 NULL?。眨┑牟⑶以讷@取信息之后把它清空以避免從非觸發(fā)器管理器來(lái)的觸發(fā)器函數(shù). 
結(jié)構(gòu)(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 
描述調(diào)用函數(shù)的事件.你可以使用下面的宏來(lái)檢驗(yàn) tg_event:
TRIGGER_FIRED_BEFORE(tg_event) 
returns TRUE if trigger fired BEFORE.(觸發(fā)器由 BEFORE 觸發(fā)返回 TRUE) 
TRIGGER_FIRED_AFTER(tg_event) 
Returns TRUE if trigger fired AFTER.(觸發(fā)器由 AFTER 觸發(fā)返回 TRUE) 
TRIGGER_FIRED_FOR_ROW(event) 
Returns TRUE if trigger fired for a ROW-level event.(觸發(fā)器行級(jí)(ROW-level)觸發(fā)返回 TRUE) 
TRIGGER_FIRED_FOR_STATEMENT(event) 
Returns TRUE if trigger fired for STATEMENT-level event.(觸發(fā)器語(yǔ)句級(jí)(ROW-level)觸發(fā)返回 TRUE) 
TRIGGER_FIRED_BY_INSERT(event) 
Returns TRUE if trigger fired by INSERT.(觸發(fā)器由 INSERT 觸發(fā)返回 TRUE) 
TRIGGER_FIRED_BY_DELETE(event) 
Returns TRUE if trigger fired by DELETE.(觸發(fā)器由 DELETE 觸發(fā)返回 TRUE) 
TRIGGER_FIRED_BY_UPDATE(event) 
Returns TRUE if trigger fired by UPDATE.(觸發(fā)器由 UPDATE 觸發(fā)返回 TRUE)
tg_relation 
是一個(gè)指向描述被觸發(fā)的關(guān)系的結(jié)構(gòu)的指針.請(qǐng)參考src/include/utils/rel.h 獲取關(guān)于此結(jié)構(gòu)的詳細(xì)信息.最讓人感興趣的事情是 tg_relation->rd_att?。P(guān)系記錄的描述) 和 tg_relation->rd_rel->relname?。P(guān)系名.這個(gè)變量的類型不是 char*,而是 NameData.用 SPI_getrelname(tg_relation) 獲取 char* ,如果你需要一份名字的拷貝的話). 
tg_trigtuple 
是一個(gè)指向觸發(fā)觸發(fā)器的記錄的指針.這是一個(gè)正在被 插入(INSERT),刪除(DELETE)或更新(UPDATE)的記錄.如果是 INSERT/DELETE ,那么這就是你將返回給執(zhí)行器的東西--如果你不想用另一條記錄覆蓋此記錄(INSERT)或忽略操作. 
tg_newtuple 
如果是 UPDATE,這是一個(gè)指向新版本的記錄的指針,如果是 INSERT 或 DELETE,就是 NULL這就是你將返回給執(zhí)行器的東西-- 如果你是 UPDATE 并且你不想用另一條記錄替換這條記錄或忽略操作. 
tg_trigger 
是一個(gè)指向結(jié)構(gòu) Trigger 的指針,該結(jié)構(gòu)在 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 是觸發(fā)器的名稱,tgnargs 是在 tgargs 里參數(shù)的數(shù)量,tgargs 是一個(gè)指針數(shù)組,數(shù)組里每個(gè)指針指向在 CREATE TRIGGER 語(yǔ)句里聲明的參數(shù).其他成員只在內(nèi)部使用.

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

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

由查詢 Q 造成的改變可以為查詢 Q 以后運(yùn)行的查詢可見(jiàn),不管這些查詢 
是在查詢 Q 內(nèi)部開(kāi)始運(yùn)行(在 Q 運(yùn)行期間)的還是Q運(yùn)行完畢后開(kāi)始運(yùn)行的
這些對(duì)觸發(fā)器而言也是正確的,盡管被插入的記錄?。╰g_trigtuple)對(duì) BEFORE 觸發(fā)器是不可見(jiàn)的,這個(gè)剛被插入的記錄卻可以被一個(gè) AFTER 觸發(fā)器看到,并且對(duì)所有這個(gè)(觸發(fā)器)以后的所有 BEFORE/AFTER 觸發(fā)器均可見(jiàn)!

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

例子
在 src/test/regress/regress.c 和 contrib/spi 里有更復(fù)雜的例子. 
這里是一個(gè)非常簡(jiǎn)單的觸發(fā)器使用的例子.函數(shù) trigf 報(bào)告在被觸發(fā)的關(guān)系 ttest 中記錄數(shù)量,并且如果查詢?cè)噲D把 NULL 插入到 x 里(例如?。鰹橐粋€(gè) NOT NULL 約束但不退出事務(wù)的約束)時(shí)略過(guò)操作. 

#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);
}
然后,編譯和創(chuàng)建表 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)

--------------------------------------------------------------------------------
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

a级黄色一级片| 一级片免费在线播放| 国产麻豆精品视频| 无码国产69精品久久久久网站| 亚洲福利视频网站| 日韩精品免费视频一区二区三区| 欧美性猛交xxxx乱| 少妇高潮一区二区三区99小说| 日本中文字幕视频| 欧美午夜欧美| 波多野结衣的一区二区三区| 欧美高清激情brazzers| 午夜精品影视国产一区在线麻豆| 日韩av电影国产| 欧美一区二区成人6969| 国产精品无码一本二本三本色| 国产精品不卡av| 国产精品久久久久久亚洲调教| 亚洲一区二区| 欧美黑人巨大xxxxx| 无码人妻丰满熟妇精品| 97在线观看免费| 免费看日韩av| 国产精品亚洲欧美一级在线| 五月精品视频| 国产精品视频999| 久久中文字幕无码| 噜噜噜久久亚洲精品国产品麻豆| 一区二区三区四区视频在线观看| 日本一区二区欧美| 日韩一区二区电影在线| 久久九九免费| 久久久99免费| 97婷婷大伊香蕉精品视频| 在线播放 亚洲| 91久久一区二区| 欧美h片在线观看| 亚洲男人7777| 午夜久久一区| 欧美日韩精品在线视频| 中文字幕成人网| 91xxx视频| 成人免费毛片a| 亚洲一区二区伦理| 人妻 丝袜美腿 中文字幕| 天堂av网在线| 成人av影音| 日本一区二区不卡在线| 91porny九色| 麻豆一区二区三区| 在线视频观看国产| xfplay每日更新av资源| 亚洲国产视频一区| 久久精品久久精品亚洲人| 丝袜脚交免费网站xx| 好想男人揉我下面好多水| 天天爽夜夜爽夜夜爽| 一本一道精品欧美中文字幕| 久久久一区二区三区| 91国偷自产中文字幕久久| 天堂网在线观看| 在线看国产一区| 奇米777在线视频| 欧美在线视频观看| 亚洲二区精品| xxx在线视频| 国产二区三区在线| 无码日韩精品一区二区免费| 视频一区视频二区视频| 成年人小视频在线观看| 亚洲依依成人| 啊啊啊射了视频网站| 一区二区三区在线视频播放| 亚洲国产日日夜夜| 日韩欧美一区二区三区免费看| 蜜臀91精品一区二区三区| 中文字幕第一区| 国产欧美精品久久久| 免费电影网站在线观看| 91国产福利在线| 四虎影院免费在线| 十大免费污污软件| 欧美熟妇另类久久久久久不卡| 欧美插天视频在线播放| 国产在线精品一区二区夜色| 国产乱人伦精品一区二区三区| 国产在线中文字幕| 国产亚洲精品超碰| 高清av资源| 丝袜综合欧美| 涩爱av色老久久精品偷偷鲁| 无码精品人妻一区二区| 日本一区二区免费不卡| 99久久精品免费看国产四区| 手机免费看av片| 日本精品性网站在线观看| 日本视频精品一区| 免费在线观看的av| 美女视频一区在线观看| 国产女主播一区二区三区| 免费在线观看91| 免费高清视频精品| 国产人成精品一区二区三| 国产av一区二区三区传媒| 青青草观看免费视频在线| 99九九热只有国产精品| 成人在线免费观看视视频| 污污免费在线观看| 亚洲福中文字幕伊人影院| 日日av拍夜夜添久久免费| 91精品国产66| 四虎精品影院在线观看视频| 国产高清在线视频| 亚洲国产成人在线| 亚洲精品中文字幕在线播放| 久久日韩粉嫩一区二区三区| 国产三级国产精品国产专区50| 精品国产免费第一区二区| 天堂网av手机版| 都市激情一区| 亚洲片av在线| 日本免费一二三区| 亚洲国模精品私拍| 欧美日韩一区二区不卡| 中文字幕一区二区三区域| 欧美做受高潮电影o| 免费美女久久99| 中文一区一区三区免费在线观看| 日韩久久视频| 亚洲a视频在线观看| 日韩免费高清在线| 国产精品高潮久久久久无| 可骚可骚的黄视频网站| yiren22综合网成人| 精品三级久久久久久久电影聊斋| 亚洲国产成人精品女人久久久| 国产精品一区二区久久国产| 中文字幕777| 性猛交ⅹxxx富婆video| av激情综合网| 麻豆视频网站在线观看| 中文字幕av一区二区三区四区| 亚洲精品视频导航| 在线免费看污| 欧美性猛交xxxx免费看手交| 激情图区综合网| 日韩精品卡通动漫网站| 日韩精品一区第一页| 成人免费福利片| 精品处破学生在线二十三| 久久久久久久国产精品视频| 正在播放亚洲一区| 精品免费av在线| 日韩av在线综合| 精品一区二区三区影院在线午夜| 亚洲最大网站| 欧美二区不卡| 欧美牲交a欧美牲交aⅴ免费下载| 日韩av123| 三级三级久久三级久久18| 国产精品一区hongkong| 伊人中文在线| 国产午夜精品一区二区三区嫩草| 亚洲欧洲日韩一区二区三区| 亚洲婷婷综合久久一本伊一区| 欧美18—20岁hd第一次| 久久久久久久美女| 久久久久观看| 欧美成人精品xxx| 三级在线视频| 日本少妇xxxx动漫| 久久美女高清视频| 亚洲第一页视频| 欧美色另类天堂2015| 免费观看亚洲天堂| 日日狠狠久久偷偷四色综合免费| 精品人妻人人做人人爽夜夜爽| 人妻激情偷乱视频一区二区三区| 亚洲第一区第二区第三区| 欧美欧美天天天天操| 久久成年人网站| 国产精品午夜在线观看| 黄网站在线免费| a级国产乱理论片在线观看99| 亚洲va欧美va国产综合剧情| 色国产精品一区在线观看| 国产一卡二卡在线播放| 欧美激情一级二级三级在线视频| av黄色在线观看| 毛片aaaaaa| 国产亚洲一区二区在线观看| 欧美色老头old∨ideo| 26uuu亚洲综合色| 久久久久久久久久久久久久久久av| 国产又大又黄又粗又爽| 亚洲区在线播放| 精品极品三级久久久久| 亚洲黄页在线观看| 中文字幕精品一区二区三区精品| 人妻无码一区二区三区久久99| 日本免费一区二区三区视频| 亚洲黄色一级大片| 国产免费毛卡片| 欧美精品一区二区三区很污很色的| 欧美成人精品激情在线观看| 国产探花一区在线观看| 欧美性xxxxx| 国产毛片av在线| www.女人的天堂.com| 欧美男女性生活在线直播观看| 免费不卡av网站| 欧美日韩影视| 日韩无码精品一区二区| 亚洲欧美日韩网| 国产婷婷色综合av蜜臀av| 亚洲午夜av在线| 一区二区精品免费| 三级黄在线观看| 日本福利在线| 91在线观看| 午夜视频1000| 极品视频在线| 欧洲杯什么时候开赛| 日韩一区二区久久久| 久久精品国产第一区二区三区| 欧美91在线|欧美| 欧美大片在线影院| qvod激情图片| 激情六月丁香| 五月天综合在线| 国产一级片在线| 色婷婷av777| 国产嫩草一区二区三区在线观看| 日本wwwwwww| 91精品国产91久久久久久密臀| 欧美黄色免费观看| 久久精品a一级国产免视看成人| 欧美视频一区在线| 久久手机精品视频| 色综合久久88色综合天天| 欧美另类videosbestsex日本| 熟女人妻在线视频| 免费在线观看的电影网站| 91精品国产色综合久久不卡蜜臀| 日本不卡在线| 国产+成+人+亚洲欧洲自线| 久久亚洲一区二区三区明星换脸| 成人免费黄色网| 国产精品粉嫩| 农民人伦一区二区三区| 国产日韩三级| 一级特黄录像免费播放全99| 欧美一区成人| 亚洲综合日韩中文字幕v在线| 秋霞午夜电影| 国产精品入口尤物| 美女扒开内裤让男人桶| 97超级碰碰人国产在线观看| palipali轻量版永久网页入口| 国产成人短视频| 日本一线产区和二线产区| 精品少妇一区二区三区在线| 欧美精品一区二区三区中文字幕| 蜜桃视频在线观看免费视频| 国产精品久久久久久久无码| 久久久久天天天天| 国产高清无密码一区二区三区| 日韩和欧美一区二区三区| 九色91av视频| 亚洲wwww| 黄色免费电影网站| 欧美精品激情在线| 日日噜噜夜夜狠狠视频| 国精品一区二区三区| 欧美成人首页| 电影天堂av在线| 日本阿v视频在线观看| 国产一区二区三区四区五区在线| 国产肉丝袜一区二区| 久久国产尿小便嘘嘘| 久久躁日日躁aaaaxxxx| 久久久久久久久久久久久女国产乱| 欧洲精品码一区二区三区免费看| 久久99热这里只有精品国产| 免费av一区二区三区四区| 污网站免费在线| 九九热99久久久国产盗摄| 亚洲主播在线观看| 国产第一页第二页| 国产乱淫av片免费| 中文字幕免费一区二区三区| 欧美凹凸一区二区三区视频| 亚洲va在线va天堂va偷拍| www黄色在线观看视频| 美国av一区二区三区| 亚洲一区黄色| 国模私拍在线观看| 又黄又爽毛片免费观看| 亚洲国产成人va在线观看麻豆| 三级黄在线播放| 美女被人操网站| 国内成人自拍视频| 日韩欧美在线1卡| 人人做人人草| 免费国产羞羞网站视频| a级片在线观看视频| av片在线免费观看| 十大免费污污软件| 老司机精品视频网站| 中文在线中文资源| 国产精品66| 麻豆av在线免费看| 麻豆久久久av免费| 亚洲成人黄色网址| 一级二级黄色片| 日韩免费一区二区三区在线播放| 国产精品视频久久一区| 亚洲国产高清福利视频| 最近2019中文字幕在线高清| 大桥未久一区二区| 美日韩一区二区三区| 成人亚洲综合色就1024| 日韩av电影免费观看| 美女爽到呻吟久久久久| 日本在线观看一区| 国产日韩一区二区在线观看| 91免费看蜜桃| 99精品在线免费视频|