CREATE RULE CREATE RULE Name CREATE RULE -- 定義一個(gè)新的重寫(xiě)規(guī)則 Synopsis CREATE RULE name AS ON event TO object [ WHERE condition ] DO [ INSTEAD ] action
輸入 name 創(chuàng)建的規(guī)則名. event 事件是 SELECT, UPDATE,DELETE 或 INSERT 之一. object 對(duì)象是 table 或 table.column.(目前只有 table 形式實(shí)際上是實(shí)現(xiàn)了的. condition 任意 SQL 布爾條件表達(dá)式.條件表達(dá)式除了引用 new 和 old 之外不能引用任何表. query 組成 action 的查詢可以是任何 SQL SELECT,INSERT, UPDATE,DELETE,或 NOTIFY 語(yǔ)句之一. 在 condition 和 action 里,特殊表名字 new 和 old 可以用于指向引用表 ( object) 里的數(shù)值 new 在 ON INSERT 和 ON UPDATE 規(guī)則里 可以指向被插入或更新的新行. old 在 ON UPDATE,和 ON DELETE 規(guī)則里可以指向現(xiàn)存的被更新,或者刪除的行. 輸出 CREATE 成功創(chuàng)建規(guī)則后的返回信息. 描述 PostgreSQL 規(guī)則系統(tǒng) 允許我們?cè)趶?a href="http://www.survivalescaperooms.com/sql.asp">數(shù)據(jù)庫(kù)或表中更新, 插入或刪除東西時(shí)定義一個(gè)可選的動(dòng)作來(lái)執(zhí)行。目前,規(guī)則用于實(shí)現(xiàn)表視圖。 規(guī)則的語(yǔ)意是在一個(gè)單獨(dú)的記錄正被訪問(wèn),更新,插入或刪除時(shí), 將存在一個(gè)舊記錄(用于檢索,更新和刪除)和一個(gè)新記錄(用于更新和追加).這時(shí)給定事件類型和給定目標(biāo)對(duì)象(表)的所有規(guī)則都將被檢查, (順序不定). 如果在 WHERE (如果有)子句里面所聲明的 condition? 為真,那么 action 部分的規(guī)則就被執(zhí)行. 如果聲明了 INSTEAD,那么 action 就會(huì)代替原來(lái)的查詢;否則,如果是 ON INSERT 那么它在原來(lái)的查詢之后執(zhí)行,如果是 ON UPDATE 或者 ON DELETE,那么它在原來(lái)的查詢之前執(zhí)行.在 condition 和 action 里面, 在舊記錄里字段的數(shù)值和/或新記錄里字段的數(shù)值被 old. attribute-name 和 new. attribute-name 代替. 規(guī)則的 action 部分可以由一條或者多條查詢組成.要寫(xiě)多個(gè)查詢,用圓括弧或者方括弧 把它們包圍起來(lái).這樣的查詢將以聲明的順序執(zhí)行(只是我們不能保證對(duì)一個(gè)對(duì)象的多個(gè)規(guī)則的執(zhí)行順序). action 還可以是 NOTHING 表示沒(méi)有動(dòng)作.因此,一個(gè) DO INSTEAD NOTHING 規(guī)則制止了原來(lái)的查詢的運(yùn)行(當(dāng)條件為真時(shí)); DO NOTHING 規(guī)則是沒(méi)有用的. 規(guī)則的 action 部分 執(zhí)行的時(shí)候帶有和觸發(fā)動(dòng)作的用戶命令相同的命令和事務(wù)標(biāo)識(shí)符. 規(guī)則和視圖 目前,ON SELECT 規(guī)則必須是無(wú)條件的 INSTEAD 規(guī)則并且 必須有一個(gè)由一條 SELECT 查詢組成的動(dòng)作.因此,一條 ON SELECT 規(guī)則有效地把對(duì)象表轉(zhuǎn)成視圖,它的可見(jiàn)內(nèi)容 是規(guī)則的 SELECT 查詢返回的記錄而不是存儲(chǔ)在表中的內(nèi)容(如果有的話).我們認(rèn)為寫(xiě)一條 CREATE VIEW 命令比創(chuàng)建一個(gè)表然后定義一條 ON SELECT 規(guī)則在上面的風(fēng)格要好. CREATE VIEW 創(chuàng)建一個(gè)虛擬表(沒(méi)有下層的存儲(chǔ)) 以及相關(guān)的 ON SELECT 規(guī)則.系統(tǒng)不允許對(duì)視圖進(jìn)行更新,因?yàn)樗涝谝晥D上沒(méi)有真正的表.你可以創(chuàng)建一個(gè)可以更新的視圖的幻覺(jué), 方法是在視圖上定義 ON INSERT,ON UPDATE,和 ON DELETE 規(guī)則 (或者滿足你需要的任何上述規(guī)則的子集),用合適的對(duì)其它表的更新替換 在視圖上更新的動(dòng)作. 如果你想在視圖更新上使用條件規(guī)則,那么這里就有一個(gè)補(bǔ)充∶ 對(duì)你希望在視圖上允許的每個(gè)動(dòng)作,你都必須有一個(gè)無(wú)條件的 INSTEAD 規(guī)則.如果規(guī)則是有條件的,或者它不是 INSTEAD, 那么系統(tǒng)仍將拒絕執(zhí)行更新動(dòng)作的企圖,因?yàn)樗J(rèn)為它最終會(huì)在某種 程度上在虛擬表上執(zhí)行動(dòng)作.如果你想處理?xiàng)l件規(guī)則上的所由有用的情況,那也可以;只需要增加一個(gè)無(wú)條件的 DO INSTEAD NOTHING 規(guī)則確保系統(tǒng)明白它將決不會(huì)被調(diào)用來(lái)更新虛擬表就可以了.然后把條件規(guī)則做成非 INSTEAD; 在這種情況下,如果它們被觸發(fā),那么它們就增加到缺省的 INSTEAD NOTHING 動(dòng)作中.
注意 為了在表上定義規(guī)則,你必須有規(guī)則定義權(quán)限. 用 GRANT 和 REVOKE 修改權(quán)限. 有一件很重要的事情是要避免循環(huán)規(guī)則. 比如,盡管下面兩條規(guī)則定義都是 PostgreSQL 可以接受的, select 命令會(huì)導(dǎo)致 PostgreSQL 報(bào)告 一條錯(cuò)誤信息,因?yàn)樵摬樵冄h(huán)了太多次: CREATE RULE bad_rule_combination_1 AS ON SELECT TO emp DO INSTEAD SELECT * FROM toyemp; CREATE RULE bad_rule_combination_2 AS ON SELECT TO toyemp DO INSTEAD SELECT * FROM emp; 下面這個(gè)對(duì) EMP 的查詢企圖將導(dǎo)致 PostgreSQL 產(chǎn)生一個(gè)錯(cuò)誤信息, 因?yàn)樵摬樵冄h(huán)了太多次: SELECT * FROM emp; 目前,如果一個(gè)規(guī)則包含一個(gè) NOTIFY 查詢,那么該 NOTIFY 將被 無(wú)條件執(zhí)行 --- 也就是說(shuō),如果規(guī)則不施加到任何行上頭,該 NOTIFY 也會(huì)被發(fā)出.比如,在 CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable; UPDATE mytable SET name = 'foo' WHERE id = 42; 里,一個(gè) NOTIFY 事件將在 UPDATE 的時(shí)候發(fā)出,不管是否有某行的 id = 42.這是一個(gè)實(shí)現(xiàn)的限制,將來(lái)的版本應(yīng)該修補(bǔ)這個(gè)毛病. 兼容性 SQL92 CREATE RULE語(yǔ)句是 PostgreSQL 語(yǔ)言的擴(kuò)展. 在里沒(méi)有CREATE RULE 語(yǔ)句.
CREATE TRIGGER Name CREATE TRIGGER -- 定義一個(gè)新的觸發(fā)器 Synopsis CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] } ON table FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE func ( arguments ) 輸入 name 賦予新觸發(fā)器的名稱. table 現(xiàn)有表名稱. event INSERT,DELETE 或 UPDATE 之一. func 一個(gè)用戶提供的函數(shù). 輸出 CREATE 如果觸發(fā)器成功創(chuàng)建,返回此信息. 描述 CREATE TRIGGER將向現(xiàn)有數(shù)據(jù)庫(kù)中增加一個(gè)新的觸發(fā)器. 觸發(fā)器將與表 table 相聯(lián)并且將執(zhí)行聲明的函數(shù) func. 觸發(fā)器可以聲明為在對(duì)記錄進(jìn)行操作之前 在檢查約束之前和 INSERT,UPDATE 或 DELETE 執(zhí)行前)或之后(在檢 查約束之后和完成 INSERT, UPDATE 或 DELETE 操作)觸發(fā). 如果觸發(fā)器在事件之前,觸發(fā)器可能略過(guò)當(dāng)前記錄的操作或改變被插入的(當(dāng)前)記錄(只對(duì) INSERT 和 UPDATE 操作有效). 如果觸發(fā)器在事件之后,所有更改,包括最后的插入,更新或刪除對(duì)觸發(fā)器都是"可見(jiàn)"的. SELECT并不更改任何行,因此你不能創(chuàng)建 SELECT 觸發(fā)器.這種場(chǎng)合下規(guī)則和視圖更合適些. 請(qǐng)參考 PostgreSQL 程序員手冊(cè)中SPI 和觸發(fā)器章節(jié)獲取更多信息. 注意 CREATE TRIGGER是 PostgreSQL 語(yǔ)言擴(kuò)展. 只有表所有者可以就此表創(chuàng)建一個(gè)觸發(fā)器. 在當(dāng)前的版本,STATEMENT 觸發(fā)器還沒(méi)有實(shí)現(xiàn). 請(qǐng)參考 DROP TRIGGER 獲取如何刪除觸發(fā)器的信息. 用法 在插入或更新表 films 之前檢查一下聲明的分銷商代碼是否存在于 distributors 表中: CREATE TRIGGER if_dist_exists BEFORE INSERT OR UPDATE ON films FOR EACH ROW EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
在刪除或更新一個(gè)分銷商的內(nèi)容之前, 將所有記錄移到表 films 中: CREATE TRIGGER if_film_exists BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did'); 兼容性 SQL92 在 里沒(méi)有 CREATE TRIGGER語(yǔ)句. 上面第二個(gè)例子可以使用一個(gè) FOREIGN KEY 約束實(shí)現(xiàn): CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40), CONSTRAINT if_film_exists FOREIGN KEY(did) REFERENCES films ON UPDATE CASCADE ON DELETE CASCADE );
DELETE DELETE Name DELETE -- 刪除一個(gè)表中的行 Synopsis DELETE FROM [ ONLY ] table [ WHERE condition ]
輸入 table 一個(gè)現(xiàn)存表的名字 condition 這是一個(gè) SQL 選擇查詢,它返回要被刪除的行. 請(qǐng)參考 SELECT 語(yǔ)句獲取關(guān)于 WHERE 子句的更多信息. 輸出 DELETE count 如果行被成功的刪除返回此信息. count 是要被刪除的行數(shù). 如果 count 為 0, 沒(méi)有行被刪除. 描述 DELETE從指明的表里刪除滿足 WHERE condition (條件)的行. 如果 condition (WHERE 子句)不存在, 效果是刪除表中所有行.結(jié)果是一個(gè)有效的空表. 小技巧: TRUNCATE 是一個(gè) PostgreSQL 擴(kuò)展, 它提供一個(gè)更快的從表中刪除所有行的機(jī)制。 缺省時(shí)DELETE將刪除所聲明的表和所有它的子表的記錄. 如果你希望只更新提到的表,你應(yīng)該使用OLNY子句. 要對(duì)表進(jìn)行修改,你必須有寫(xiě)權(quán)限,同樣也必須有讀表的權(quán)限,這樣才能對(duì)符合 condition(條件) 的值進(jìn)行讀取操作. 用法 刪除所有電影(films)但不刪除音樂(lè)(musicals): DELETE FROM films WHERE kind <> 'Musical'; SELECT * FROM films;
code | title | did | date_prod | kind | len -------+---------------------------+-----+------------+---------+------- UA501 | West Side Story | 105 | 1961-01-03 | Musical | 02:32 TC901 | The King and I | 109 | 1956-08-11 | Musical | 02:13 WD101 | Bed Knobs and Broomsticks | 111 | | Musical | 01:57 (3 rows) 清空表 films: DELETE FROM films; SELECT * FROM films;
code | title | did | date_prod | kind | len ------+-------+-----+-----------+------+----- (0 rows) 兼容性 SQL92 允許定位的 DELETE (刪除)語(yǔ)句: DELETE FROM table WHERE CURRENT OF cursor 這里 cursor 表示一個(gè)打開(kāi)的游標(biāo). PostgreSQL 里交互式游標(biāo)是只讀的.
DROP AGGREGATE DROP AGGREGATE Name DROP AGGREGATE -- 刪除一個(gè)用戶定義的聚集函數(shù) Synopsis DROP AGGREGATE name type 輸入 name 現(xiàn)存的聚集函數(shù)名。 type 現(xiàn)存的聚集函數(shù)的輸入數(shù)據(jù)類型,或者 * -- 如果這個(gè)聚集函數(shù)接受任意輸入類型.(請(qǐng)參考 PostgreSQL 用戶手冊(cè) 獲取關(guān)于數(shù)據(jù)類型的更多信息)。 輸出 DROP 命令成功的返回信息. ERROR: RemoveAggregate: aggregate 'name' for type type does not exist 如果聲明的函數(shù)在數(shù)據(jù)庫(kù)中不存在,返回此信息. 描述 DROP AGGREGATE將刪除對(duì)一個(gè)現(xiàn)存聚集函數(shù)的所有索引. 執(zhí)行這條命令的用戶必須是該聚集函數(shù)的所有者. 注意 使用 CREATE AGGREGATE語(yǔ)句創(chuàng)建一個(gè)聚集函數(shù)。 用法 將類型 int4的聚集函數(shù) myavg 刪除: DROP AGGREGATE myavg(int4); 兼容性 SQL92 在 中沒(méi)有 DROP AGGREGATE語(yǔ)句. 該語(yǔ)句是一個(gè) PostgreSQL 語(yǔ)言的擴(kuò)展.
DROP DATABASE Name DROP DATABASE -- 刪除一個(gè)數(shù)據(jù)庫(kù). Synopsis DROP DATABASE name 輸入 name 要被刪除的現(xiàn)有數(shù)據(jù)庫(kù)名. 輸出 DROP DATABASE 如果命令成功執(zhí)行,返回此命令. DROP DATABASE: cannot be executed on the currently open database 你不能和準(zhǔn)備刪除的數(shù)據(jù)庫(kù)建立聯(lián)接.你需要和 template1 或者任何其它的數(shù)據(jù)庫(kù)相連來(lái)運(yùn)行這些命令. DROP DATABASE: cannot be executed on the currently open database 執(zhí)行這條命令之前你必須先結(jié)束正在處理的事務(wù)。 描述 DROP DATABASE刪除一個(gè)現(xiàn)存數(shù)據(jù)庫(kù)的目錄入口并且刪除包含數(shù)據(jù)的目錄.只有數(shù)據(jù)庫(kù)所有者能夠執(zhí)行這條命令(通常也是數(shù)據(jù)庫(kù)創(chuàng)建者). DROP DATABASE不能撤銷,小心使用. 注意 這條命令在和目標(biāo)數(shù)據(jù)庫(kù)聯(lián)接時(shí)不能執(zhí)行. 通常更好的做法是用 dropdb腳本代替,該腳本是此命令的一個(gè)封裝。 , 請(qǐng)參考 CREATE DATABASE語(yǔ)句獲取如何創(chuàng)建數(shù)據(jù)庫(kù)的信息. 兼容性 SQL92
DROP DATABASE是一個(gè) PostgreSQL 語(yǔ)言的擴(kuò)展. 在 中沒(méi)有這條命令.
DROP FUNCTION Name DROP FUNCTION -- 刪除一個(gè)用戶定義的函數(shù) Synopsis DROP FUNCTION name ( [ type [, ...] ] ) 輸入 name 現(xiàn)存的函數(shù)名稱. type 函數(shù)參數(shù)的類型. 輸出 DROP 命令成功執(zhí)行的返回信息. NOTICE RemoveFunction: Function "name" ("types") does not exist 如果當(dāng)前數(shù)據(jù)庫(kù)里不存在所聲明的函數(shù),返回此信息. 描述 DROP FUNCTION 將刪除一個(gè)現(xiàn)存的函數(shù)的引用.要執(zhí)行這條命令,用戶必須是函數(shù)的所有者. 必須聲明函數(shù)的輸入?yún)?shù)類型,因?yàn)閹讉€(gè)不同的函數(shù)可能會(huì)有同樣的名字 和不同的參數(shù)列表. 注意 請(qǐng)參考 CREATE FUNCTION 獲取創(chuàng)建聚集函數(shù)的信息. 對(duì)依賴于該函數(shù)的類型, 操作符訪問(wèn)方式或者觸發(fā)器是否事先被刪除不做任何校驗(yàn). 用法 這條命令刪除平方根函數(shù): DROP FUNCTION sqrt(int4); 兼容性 SQL92 DROP FUNCTION是 PostgreSQL 語(yǔ)言的擴(kuò)展. SQL/PSM SQL/PSM 是一個(gè)為實(shí)現(xiàn)函數(shù)擴(kuò)展能力而提出的標(biāo)準(zhǔn). SQL/PSM DROP FUNCTION 語(yǔ)句有下面的語(yǔ)法: DROP [ SPECIFIC ] FUNCTION name { RESTRICT | CASCADE }
DROP GROUP DROP GROUP Name DROP GROUP -- 刪除一個(gè)用戶組 Synopsis DROP GROUP name
輸入 name 現(xiàn)存組名。 輸出 DROP GROUP 成功刪除組后返回的信息。 描述 DROP GROUP從數(shù)據(jù)庫(kù)中刪除指定的組。組中的用戶不被刪除。 組中的用戶不被刪除。 使用 CREATE GROUP增加新組,用 ALTER GROUP修改組的成員。 用法 刪除一個(gè)組: DROP GROUP staff; 兼容性 SQL92
DROP INDEX Name DROP INDEX -- 刪除一個(gè)索引 Synopsis DROP INDEX index_name [, ...] 輸入 index_name 要?jiǎng)h除的索引名. 輸出 DROP 如果索引成功刪除返回的信息. ERROR: index "index_name" does not exist 如果 index_name 不是這個(gè)數(shù)據(jù)庫(kù)的索引,返回此信息. 描述 DROP INDEX從數(shù)據(jù)庫(kù)中刪除一個(gè)現(xiàn)存的索引. 要執(zhí)行這個(gè)命令,你必須是索引的所有者. the index. 注意 DROP INDEX是PostgreSQL 語(yǔ)言擴(kuò)展. 請(qǐng)參考 CREATE INDEX語(yǔ)句獲取如何創(chuàng)建索引的信息. 用法 此命令將刪除title_idx 索引: DROP INDEX title_idx; 兼容性 SQL92 定義用于訪問(wèn)純關(guān)系型數(shù)據(jù)庫(kù)的命令. 索引是一個(gè)與具體實(shí)現(xiàn)相關(guān)的特性,因而沒(méi)有與具體實(shí)現(xiàn)相關(guān)的特性或定義在 語(yǔ)言里面.
DROP RULE DROP RULE Name DROP RULE -- 刪除一個(gè)重寫(xiě)規(guī)則 Synopsis DROP RULE name [, ...] 輸入 name 要?jiǎng)h除的現(xiàn)存的規(guī)則. 輸出 DROP 刪除成功返回的信息. ERROR: Rule or view "name" not found 如果聲明的規(guī)則不存在,返回此信息. 描述 DROP RULE從聲明的 PostgreSQL規(guī)則系統(tǒng)里刪除一個(gè)規(guī)則. PostgreSQL 將立即停止使用之并且將會(huì)把它從系統(tǒng)表中清理出去. 注意 DROP RULE語(yǔ)句是 PostgreSQL 語(yǔ)言的擴(kuò)展. 請(qǐng)參考 CREATE RULE 獲取如何創(chuàng)建規(guī)則的信息. 一旦一個(gè)規(guī)則被刪除掉,該規(guī)則所寫(xiě)的歷史記錄信息將可能不存在. 用法 刪除重寫(xiě)規(guī)則 newrule: DROP RULE newrule; 兼容性 SQL92 在 中沒(méi)有DROP RULE.
DROP SEQUENCE DROP SEQUENCE Name DROP SEQUENCE -- 刪除一個(gè)序列 Synopsis DROP SEQUENCE name [, ...] 輸入 name 序列名. 輸出 DROP 序列成功刪除后返回的信息. ERROR: sequence "name" does not exist 如果聲明的序列不存在,返回此信息. 描述 DROP SEQUENCE從數(shù)據(jù)庫(kù)中刪除序列號(hào)生成器. 因?yàn)槟壳暗男蛄袑?shí)現(xiàn)是作為一個(gè)特殊的表,所以此語(yǔ)句就象 DROP TABLE 語(yǔ)句一樣. 注意 DROP SEQUENCE語(yǔ)句是 Postgres 語(yǔ)言擴(kuò)展. 請(qǐng)參考 CREATE SEQUENCE 語(yǔ)句獲取如何創(chuàng)建一個(gè)序列的信息. 用法 從數(shù)據(jù)庫(kù)中刪除序列 serial: DROP SEQUENCE serial; 兼容性 SQL92 在里沒(méi)有 DROP SEQUENCE.
DROP TRIGGER DROP TRIGGER Name DROP TRIGGER -- 刪除一個(gè)觸發(fā)器定義. Synopsis DROP TRIGGER name ON table
輸入 name 現(xiàn)存的觸發(fā)器名. table 表的名稱. 輸出 DROP 如果觸發(fā)器成功的刪除,返回此信息. ERROR: DropTrigger: there is no trigger name on relation "table" 如果聲明的觸發(fā)器不存在,返回此信息. 描述 DROP TRIGGER將刪除所有對(duì)一個(gè)現(xiàn)存觸發(fā)器的引用. 要執(zhí)行這個(gè)命令,當(dāng)前用戶必須是觸發(fā)器的所有者. 注意 DROP TRIGGER是 PostgreSQL 語(yǔ)言的擴(kuò)展. 請(qǐng)參考 CREATE TRIGGER 獲取如何創(chuàng)建觸發(fā)器的信息. 用法 刪除表films的if_dist_exists觸發(fā)器: DROP TRIGGER if_dist_exists ON films; 兼容性 SQL92 在里沒(méi)有DROP TRIGGER.
DROP TYPE DROP TYPE Name DROP TYPE -- 刪除一個(gè)用戶定義數(shù)據(jù)類型 Synopsis DROP TYPE typename [, ...] 輸入 typename 現(xiàn)存的類型名. 輸出 DROP 命令執(zhí)行成功的返回信息. ERROR: RemoveType: type 'typename' does not exist 如果聲明的類型沒(méi)有找到,返回此信息. 描述 DROP TYPE將從系統(tǒng)表里刪除用戶的類型. 只有類型所有者可以刪除類型. 注意 DROP TYPE 語(yǔ)句是 PostgreSQL 語(yǔ)言的擴(kuò)展. 請(qǐng)參考 CREATE TYPE 獲取如何創(chuàng)建類型的信息. 用戶有責(zé)任刪除任何使用了被刪除類型的操作符,函數(shù),聚集,訪問(wèn)模式, 子類型和表.不過(guò),相關(guān)等數(shù)組數(shù)據(jù)類型(由 CREATE TYPE 自動(dòng)創(chuàng)建)將自動(dòng)刪除. 如果刪除了一個(gè)內(nèi)建的類型,后端的行為將不可預(yù)測(cè). 用法 刪除 box 類型: DROP TYPE box; 兼容性 SQL92 SQL3 DROP TYPE是 SQL3 語(yǔ)句.
DROP USER DROP USER Name DROP USER -- 刪除一個(gè)數(shù)據(jù)庫(kù)用戶帳號(hào) Synopsis DROP USER name 輸入 name 一個(gè)現(xiàn)存用戶的名稱. 輸出 DROP USER 用戶被成功刪除的返回信息. ERROR: DROP USER: user "name" does not exist 如果用戶名沒(méi)有找到,返回此信息. DROP USER: user "name" owns database "name", cannot be removed 你必須先刪除數(shù)據(jù)庫(kù)或者改變其所有者。 描述 DROP USER從數(shù)據(jù)庫(kù)中刪除指定的用戶。 它不刪除數(shù)據(jù)庫(kù)里此用戶所有的表,視圖或其他對(duì)象。 如果該用戶擁有任何數(shù)據(jù)庫(kù),你會(huì)收到一個(gè)錯(cuò)誤信息。 使用 CREATE USER增加新用戶,用 ALTER USER修改用戶屬性。 PostgreSQL 還有一個(gè)腳本 dropuser,這個(gè)腳本和這條命令功能相同(實(shí)際上,腳本里調(diào)用此命令),但是可以在命令行上運(yùn)行。 用法 刪除一個(gè)用戶帳戶: DROP USER jonathan; 兼容性 SQL92 在里沒(méi)有DROP USER.
DROP VIEW DROP VIEW Name DROP VIEW -- 刪除一個(gè)視圖 Synopsis DROP VIEW name [, ...] 輸入 name 現(xiàn)存視圖名稱. 輸出 DROP 命令成功執(zhí)行的返回. ERROR: view name does not exist 如果聲明的視圖在數(shù)據(jù)庫(kù)中不存在,返回此信息. 描述 DROP VIEW從數(shù)據(jù)庫(kù)中刪除一個(gè)現(xiàn)存的視圖. 執(zhí)行這條命令必須是視圖的所有者. 注意 請(qǐng)參考CREATE VIEW 獲取關(guān)于如何創(chuàng)建視圖的信息. 用法 下面命令將刪除視圖 kinds: DROP VIEW kinds; 兼容性 SQL92 為 DROP VIEW 聲明了一些附加的功能: DROP VIEW view { RESTRICT | CASCADE } 輸入 RESTRICT 確保只有不存在關(guān)聯(lián)視圖或完整性約束的視圖可以被刪除. CASCADE 任何引用的視圖和完整性約束都將被刪除. 注意 目前,要從 PostgreSQL 數(shù)據(jù)庫(kù)中刪除一個(gè)視圖, 你必須明確地將其刪除.
END Name END -- 提交當(dāng)前的事務(wù) Synopsis END [ WORK | TRANSACTION ] 輸入 WORK TRANSACTION 可選關(guān)鍵字。沒(méi)有作用。 輸出 COMMIT 事務(wù)成功提交后的返回信息。 NOTICE: COMMIT: no transaction in progress 如果沒(méi)有正在處理的事務(wù),返回此信息。 描述 END是 PostgreSQL 而 -兼容的同義語(yǔ)句是 COMMIT. 注意 關(guān)鍵字 WORK 和 TRANSACTION 是多余的,可以省略。 使用 ROLLBACK退出一個(gè)事務(wù)。 用法 令所有改變生效: END WORK; 兼容性 SQL92 END是 PostgreSQL 的擴(kuò)展,提供與 COMMIT相同的功能。
GRANT Name GRANT -- 定義訪問(wèn)權(quán)限 Synopsis GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] objectname [, ...] TO { username | GROUP groupname | PUBLIC } [, ...] 描述 GRANT命令將某對(duì)象(表,視圖,序列) 上的特定權(quán)限給予一個(gè)用戶或者多個(gè)用戶或者一組用戶.這些權(quán)限將增加到那些已經(jīng)賦予的權(quán)限上,如果存在這些權(quán)限的話. 鍵字 PUBLIC 表示該權(quán)限要賦予所有用戶, 包括那些以后可能創(chuàng)建的用戶.PUBLIC 可以看做是一個(gè)隱含定義好的組,它總是包括所有用戶.請(qǐng)注意,任何特定的用戶都將擁有直接賦予他/她的權(quán)限,加上 他/她所處的任何組,以及再加上賦予 PUBLIC 的權(quán)限的總和. 在創(chuàng)建完對(duì)象之后,除了對(duì)象的創(chuàng)建者之外, 其它用戶沒(méi)有任何訪問(wèn)該對(duì)象的權(quán)限,除非創(chuàng)建者賦予某些權(quán)限.對(duì)對(duì)象的創(chuàng)建者而言,沒(méi)有什么權(quán)限需要賦予,因?yàn)閯?chuàng)建者自動(dòng)持有所有權(quán)限.(不過(guò),創(chuàng)建者出于安全考慮可以選擇廢棄一些他自己的權(quán)限.請(qǐng)注意賦予和廢止權(quán)限的能力是創(chuàng)建者與生具來(lái)的,并且不會(huì)丟失.刪除對(duì)象的權(quán)利也是創(chuàng)建者固有的,并且不能賦予或 撤銷.) 可能的權(quán)限有∶ SELECT 允許對(duì)聲明的表,試圖,或者序列 SELECT 仁義字段.還允許做 COPY 的源. INSERT 允許向聲明的表 INSERT 一個(gè)新行. 同時(shí)還允許做 COPY 的目標(biāo). UPDATE 允許對(duì)聲明的表中任意字段做 UPDATE . SELECT ... FOR UPDATE 也要求這個(gè)權(quán)限 (除了 SELECT 權(quán)限之外).比如, 這個(gè)權(quán)限允許使用nextval, currval 和 setval. DELETE 允許從聲明的表中 DELETE 行. RULE 允許在該表/視圖上創(chuàng)建規(guī)則.(參閱 CREATE RULE 語(yǔ)句.) REFERENCES 要在一個(gè)表上創(chuàng)建一個(gè)外鍵約束,你必須在帶參考健字的表上 擁有這個(gè)權(quán)限. TRIGGER 允許在聲明表上創(chuàng)建觸發(fā)器.(參閱 CREATE TRIGGER 語(yǔ)句.) ALL PRIVILEGES 把上面所有權(quán)限都一次賦予.PRIVILEGES 關(guān)鍵字在 PostgreSQL 里是可選的, 但是嚴(yán)格的 SQL 要求有這個(gè)關(guān)鍵字. 其它命令要求的權(quán)限都在相應(yīng)的命令的參考頁(yè)上列出. 注意 我們要注意數(shù)據(jù)庫(kù) superusers 可以訪問(wèn)所有對(duì)象, 而不會(huì)受對(duì)象的權(quán)限設(shè)置影響.這個(gè)特點(diǎn)類似 Unix 系統(tǒng)的 root 的權(quán)限.和 root 一樣,除了必要的情況,總是以超級(jí)用戶 身分進(jìn)行操作是不明智的做法. 目前,要在 PostgreSQL 里只對(duì)某幾列 賦予權(quán)限,你必須創(chuàng)建一個(gè)擁有那幾行的視圖然后給那個(gè)視圖賦予權(quán)限. 使用 psql的 /z 命令 獲取在現(xiàn)有對(duì)象上的與權(quán)限有關(guān)的信息. Database = lusitania +------------------+---------------------------------------------+ | Relation | Grant/Revoke Permissions | +------------------+---------------------------------------------+ | mytable | {"=rw","miriam=arwdRxt","group todos=rw"} | +------------------+---------------------------------------------+ Legend: uname=arwR -- privileges granted to a user group gname=arwR -- privileges granted to a group =arwR -- privileges granted to PUBLIC
r -- SELECT ("read") w -- UPDATE ("write") a -- INSERT ("append") d -- DELETE R -- RULE x -- REFERENCES t -- TRIGGER arwdRxt -- ALL PRIVILEGES 用 REVOKE 命令刪除訪問(wèn)權(quán)限. 例子 把表 films 的插入權(quán)限賦予所有用戶∶ GRANT INSERT ON films TO PUBLIC; 賦予用戶manuel對(duì)視圖kinds的所有權(quán)限∶ GRANT ALL PRIVILEGES ON kinds TO manuel; 兼容性 SQL92 在 ALL PRIVILEGES 里的 PRIVILEGES 關(guān)鍵字是必須的.SQL 不支持在一條命令里 對(duì)多個(gè)表設(shè)置權(quán)限. 的 GRANT 語(yǔ)法允許在一個(gè)表里 為獨(dú)立的字段設(shè)置權(quán)限,并且允許設(shè)置一個(gè)權(quán)限用來(lái)給其它人賦予同樣的權(quán)限∶ GRANT privilege [, ...] ON object [ ( column [, ...] ) ] [, ...] TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ] SQL 允許對(duì)其它類型的對(duì)象賦予 USAGE 權(quán)限∶CHARACTER SET,COLLATION,TRANSLATION,DOMAIN. TRIGGER 權(quán)限是 SQL99 引入的.RULE 權(quán)限是 PostgreSQL 擴(kuò)展. 又見(jiàn) REVOKE