ALTER GROUP向組中增加用戶或從組中刪除用戶 ALTER GROUP Name ALTER GROUP -- 向組中增加用戶或從組中刪除用戶 Synopsis ALTER GROUP name ADD USER username [, ... ] ALTER GROUP name DROP USER username [, ... ] 輸入 Name 要更改的組名稱。 Username 準備向組中增加或從組中刪除的用戶名。用戶名必須已經存在。 輸出 ALTER GROUP 更改成功的返回信息。 描述 ALTER GROUP用于向組中增加用戶或者從組中刪除用戶。 只有數據庫超級用戶才能使用這條命令。向組中增加用戶并不創建用戶。同樣從組中刪除用戶也不刪除用戶本身。 使用 CREATE GROUP創建新組以及 DROP GROUP刪除一個組。 用法 向組中增加用戶: ALTER GROUP staff ADD USER Karl, john; 從組中刪除用戶: ALTER GROUP workers DROP USER Beth; 兼容性 SQL92 里沒有 ALTER GROUP 語句。角色(roles)的概念與之類似。
ALTER TABLE修改表的定義 ALTER TABLE Name ALTER TABLE -- 修改表的定義 Synopsis ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type [ column constraint [ ... ] ]
ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT } ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column SET STATISTICS integer ALTER TABLE [ ONLY ] table [ * ] RENAME [ COLUMN ] column TO new column ALTER TABLE RENAME TO new table ALTER TABLE ADD table constraint definition ALTER TABLE [ ONLY ] table DROP CONSTRAINT constraint { RESTRICT | CASCADE } ALTER TABLE table OWNER TO new owner
輸入 table 試圖更改的現存表的名稱. column 現存或新的列名稱. type 新列的類型. newcolumn 現存列的新名稱. new table 表的新名稱. table constraint definition 表的新的約束定義. New user 該表的新所有者的用戶名. 輸出 ALTER 從被改名的列或表返回的信息. ERROR 如果一個列或表不存在返回的信息. 描述 ALTER TABLE變更一個現存表的定義. ADD COLUMN形式使用與 CREATE TABLE一樣的語法向表中增加一個新列/字段。 ALTER COLUMN SET/DROP DEFAULT形式允許你從列/字段中設置或者刪除缺?。ㄖ担?注意缺?。ㄖ担┲贿m用于隨后的 INSERT 命令。 它們不會改變已經存在于表中的行. ALTER COLUMN SET STATISTICS形式允許你為 隨后的 ANALYZE 操作 設置收集統計信息的對象. RENAME 子句可以在不影響任何相關數據的情況下更改 一個表,字段,索引或者序列名稱。因此, 在此命令執行后數據仍將是相同尺寸和類型。 ADD table constraint definition子句使用與 CREATE TABLE一樣的語法向表中增加一個新的約束。 DROP CONSTRAINT constraint子句刪除所有表上匹配 constraint 的 CHECK 約束(以及其子表) OWNER 把該表的所有者改為用戶 new user. 如果要改變表的綱要,你必須是表的所有者. 注意 COLUMN 關鍵字是多余的,可以省略. 在目前的 ADD COLUMN實現里還不支持 新列/字段的缺?。ㄖ担┖?NOT NULL 子句。不過你可以隨后用 ALTER TABLE 的 SET DEFAULT 形式設置缺省(值)。(你可能還想用 UPDATE 把已存在行更新為缺省值。) 目前只有 CHECK 約束可以從表中刪除.RESTRICT 關鍵字是必須的,盡管 并不檢查依賴性.還不支持 CASCADE 選項.要刪除一個 PRIMARY 或者 UNIQUE 約束,用 DROP INDEX 命令刪除相關的索引. 要刪除 FOREIGN KEY 約束,你需要重新創建并重新裝載該表, 創建的時候使用 CREATE TABLE命令的其它參數. 比如,要刪除在表 distributors 上的所有約束∶ CREATE TABLE temp AS SELECT * FROM distributors; DROP TABLE distributors; CREATE TABLE distributors AS SELECT * FROM temp; DROP TABLE temp;
要修改表的結構,你必須是表的所有人。不允許更改系統表結構的任何部分。 PostgreSQL 用戶手冊里有關于繼承的更多信息. 請參考CREATE TABLE 部分獲取更多有效參數的描述. 用法 向表中增加一個 varchar 列: ALTER TABLE distributors ADD COLUMN address VARCHAR(30); 對現存列改名: ALTER TABLE distributors RENAME COLUMN address TO city; 更改現存表的名字∶ ALTER TABLE distributors RENAME TO suppliers; 給一個表增加一個檢查約束∶ ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5); 刪除一個表和它的所有子表的監查約束∶ ALTER TABLE distributors DROP CONSTRAINT zipchk; 向表中增加一個外鍵約束: ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL; 給表增加一個(多字段)唯一約束∶ ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode); 兼容性 SQL92 ADD COLUMN 形式是兼容的,除了上面說的缺?。ㄖ担┖?NOT NULL 約束外。 ALTER COLUMN 形式是完全兼容的。 對 ALTER TABLE 聲明了一些附加的 PostgreSQL 目前還不直接支持的功能: ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
從一個表中刪除一個列. 目前,要刪除一個現存的列,表必須重新創建和重新裝載: CREATE TABLE temp AS SELECT did, city FROM distributors; DROP TABLE distributors; CREATE TABLE distributors ( did DECIMAL(3) DEFAULT 1, name VARCHAR(40) NOT NULL ); INSERT INTO distributors SELECT * FROM temp; DROP TABLE temp;
ALTER USER ALTER USER Name ALTER USER -- 改變數據庫用戶帳號. Synopsis ALTER USER username [ [ WITH ] option [ ... ] ] 這里 option 可以是∶ [ ENCRYPTED | UNENCRYPTED ] PASSWord 'password' | CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | VALID UNTIL 'abstime' 輸入 username 想進行更改的用戶的名字。 [ encrypted | unencrypted ] password 此帳號所使用的新口令。 Encrypted/ unencrypted 控制該口令在數據庫里是否以加密形式存儲. CREATEDB NOCREATEDB 這個子句定義該用戶創建數據庫的能力。 如果聲明了 CREATEDB,該用戶可以創建她自己的數據庫。用 NOCREATEDB 將剝奪一個用戶創建數據庫的能力。 CREATEUSER NOCREATEUSER 這個子句決定一個用戶能否創建新用戶。 這個選項同樣還令該用戶成為超級用戶,可以超越所有訪問限制。 abstime 該用戶帳號口令的有效日期(和可選的時間)。 輸出 ALTER USER 更改成功的返回信息. ERROR: ALTER USER: user "username" does not exist 如果數據庫不認識你所聲明的用戶返回的信息. 描述 ALTER USER用于更改用戶的 PostgreSQL 帳號的屬性.沒有在該命令中出現的屬性保持原值. 只有一個數據庫超級用戶可以用這個命令更改權限和口令有效期。 普通用戶只能更改他們自己的口令。 ALTER USER無法改變一個用戶的組的成員性. 用 ALTER GROUP實現這個目地. 使用 CREATE USER創建新用戶和 DROP USER刪除用戶。 用法 更改一用戶口令: ALTER USER divide WITH PASSWORD 'hu8jmn3'; 更改一用戶有效期 ALTER USER Manuel VALID UNTIL 'Jan 31 2030'; 更改一用戶有效期, 聲明其權限應該在用比UTC早一小時的時區記時的1998年5月4日正午失效 ALTER USER Chris VALID UNTIL 'May 4 12:00:00 1998 +1'; 賦予一用戶創建新用戶和新數據庫的權限: ALTER USER Miriam CREATEUSER CREATEDB; 兼容性 SQL92 里沒有 ALTER USER. 該標準將用戶定義部分交給具體數據庫實現處理.
CLOSE CLOSE Name CLOSE -- 關閉一個游標 Synopsis CLOSE cursor 輸入 cursor 一個待關閉的游標的名字. 輸出 CLOSE 游標關閉成功返回的信息. NOTICE PerformPortalClose: portal "cursor" not found 如果該 cursor 沒有聲明或已經關閉,返回該信息. 描述 CLOSE釋放和一個游標關聯的資源. 一個游標關閉后,不允許對其再做任何操作.一個不再使用的游標應該關閉掉. 如果用 COMMIT 或 ROLLBACK 提交了一個事務,將對每個打開的游標執行隱含的關閉操作. 注意 PostgreSQL 沒有明確的 OPEN (打開)游標的語句; 我們認為一個游標在聲明時就打開了.使用 DECLARE 語句聲明一個游標. 用法 關閉游標liahona: CLOSE liahona; 兼容性 SQL92 CLOSE與 完全兼容.
CLUSTER Name CLUSTER -- 根據一個索引對某個表集簇 Synopsis CLUSTER indexname ON table name
輸入 indexname 一個索引名稱. table 準備建簇的表的名稱. 輸出 CLUSTER 成功建簇. ERROR: relation <tablerelation_number> inherits "table" ERROR: Relation table does not exist! 描述 CLUSTER指示PostgreSQL 近似地基于索引 indexname 的度量對表 table 進行存儲建簇. 索引必須已經在表 table name. 上定義了. 當對一個表建簇后,該表的物理存儲將基于索引信息進行. 建簇是靜態的,也就是說,當表被更新后,改變的內容不會建簇. 不會試圖對更新過的記錄重新建簇.如果需要,可以通過手工執行該命令的方法重建簇. 注意 該表實際上按索引順序拷貝到了一個臨時表中,然后重新改成原名. 因此,在建簇時所有賦予的權限和其它索引都將丟失. 如果你只是隨機的訪問表中的行, 那么在堆表中的數據的實際存儲順序是無關緊要的. 但是,如果你對某些數據的訪問多于其他數據,而且有一個索引將這些數據分組,那你就將從 使用 CLUSTER 中獲益. 另一個CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時. 如果你從一個表中請求一定索引范圍的值,或者是一個索引過的值對應多行, CLUSTER 也會有助于應用,因為如果索引標識出第一匹配行所在的堆存儲頁,所有 其他行也可能已經在同一堆存儲頁里了,這樣便節省了磁盤訪問的時間,加速了查詢. 有兩種建簇的數據.第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排列.這個動作在操作大表時可能會很慢,因為每一行都從堆存儲頁里按索引順序取出,如果存儲頁表沒有排序,整個表是隨機存放在各個頁面的,因而每行都要進行依次磁盤頁面操作. PostgreSQL 有一個緩沖, 但一個大表的主體是不可能都放到緩沖去的. 另一個對數據建簇的方法是使用 SELECT column list INTO TABLE new table FROM table ORDER BY column list
這個用法使用PostgreSQL 排序的代碼 ORDER BY 來匹配索引,在對未排序的數據操作時速度快得多. 然后你可以刪除舊表,用 ALTER TABLE...RENAME將 new table 改成舊表名, 并且重建該表所有索引.唯一的問題是 OID 將不保留.這時再做 CLUSTER 將快得多, 因為大多數堆棧數據已經排過序了而且使用現有的索引. 用法 以雇員的薪水屬性對雇員關系建簇. CLUSTER emp_ind ON emp; 兼容性 SQL92 在 規范里沒有 CLUSTER 語句.
COMMENT COMMENT Name COMMENT -- 定義或者改變一個對象的評注 Synopsis COMMENT ON [ [ DATABASE | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ] object_name | COLUMN table_name.column_name| AGGREGATE agg_name agg_type| FUNCTION func_name (arg1, arg2, ...)| OPERATOR op (leftoperand_type rightoperand_type) | TRIGGER trigger_name ON table_name ] IS 'text' 輸入 object_name, table_name, column_name, agg_name, func_name, op, trigger_name 要加入評注的對象名稱. text 要加入的評注. 輸出 COMMENT 成功對表評注后的返回. 描述 COMMENT 存儲一個數據庫對象的評注, 這個評注可以很容易用 psql的 /dd或 /d+ 或者 /l+ 命令檢索出來.其它檢索評注的用戶接口可以建設在 psql 所用地同樣地內部函數的基礎上,也就是 obj_description() 和 col_description(). 要修改一個評注,為同一個對象發出一條新的 COMMENT 命令即可.每個對象只存儲一條評注. 要刪除評注,在文本字串的位置寫上 NULL.當刪除對象時,評注自動被刪除掉. 需要說明的是目前評注沒有安全機制∶任何聯接到某數據庫上地用戶 都可以看到所有該數據庫對象地評注(盡管只有超級用戶可以修改 不屬于它地對象的評注).因此,不要在評注里放安全性敏感地信息. 用法 給表mytable 加評注: COMMENT ON mytable IS 'This is my table.'; 一些例子: COMMENT ON DATABASE my_database IS 'Development Database'; COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee id'; COMMENT ON RULE my_rule IS 'Logs UPDATES of employee records'; COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys'; COMMENT ON TABLE my_table IS 'Employee Information'; COMMENT ON TYPE my_type IS 'Complex Number support'; COMMENT ON VIEW my_view IS 'View of departmental costs'; COMMENT ON COLUMN my_table.my_field IS 'Employee ID number'; COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Computes sample variance'; COMMENT ON FUNCTION my_function (timestamp) IS 'Returns Roman Numeral'; COMMENT ON OPERATOR ^ (text, text) IS 'Performs intersection of two text'; COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for R.I.'; 兼容性 SQL92 里沒有COMMENT.
輸入 name 要創建的數據庫名. dbpath 在文件系統里存儲新數據庫的可選位置;用字串文本聲明. 或者用 DEFAULT 表示使用缺省位置. template 從哪個模板創建新數據庫,這是模板名.或者用 DEFAULT 使用缺省模板(template1). encoding 創建新數據庫用的多字節編碼方法.聲明一個字串文本名字 (比如,'SQL_ASCII'),或者一個整數編號,或者是 DEFAULT 表示使用缺省編碼. 輸出 CREATE DATABASE 命令成功執行的返回信息. ERROR: user 'username' is not allowed to create/drop databases 你必須有特殊的 CREATEDB 權限來創建數據庫。參閱 See CREATE USER。 ERROR: createdb: database "name" already exists 如果聲明的數據庫 name 已經存在返回的信息. ERROR: database path may not contain single quotes 數據庫路徑名 dbpath 不能包含單引號。這樣要求是為了創建數據庫目錄的 shell 命令能夠正確執行。 ERROR: CREATE DATABASE: may not be called in a transaction block 如果你有一個明確的事務塊正在處理,你不能調用 CREATE DATABASE。你必須先結束事務。 ERROR: Unable to create database directory 'path'. ERROR: Could not initialize database directory. 這種情況最有可能是因為對數據目錄權限不夠, 磁盤已滿或其他文件系統問題。數據庫服務器運行的機器上的用戶必 須能訪問該路徑。 描述 CREATE DATABASE創建一個新的 PostgreSQL 數據庫.創建者成為新數據庫的管理員. 可以聲明一個可選的數據庫位置,例如,在另一塊硬盤上存放數據庫。 該路徑必須是事先用 initlocation命令準備好了的. 如果路徑名不包含斜杠,那么它被解釋成一個環境變量, 該變量必須為服務進程所知。這樣數據庫管理員可以對能夠在那里創建數據庫進行控制。(例如,一個用戶化的選擇是 'PGDATA2'。)如果服務器帶著 ALLOW_ABSOLUTE_DBPATHS (缺省時沒有)選項編譯,那么也允許使用以斜杠開頭為標識的絕對路徑(例如, ' '/usr/local/pgsql/data')。 缺省時,新數據庫將通過克隆標準系統數據庫 template1 來創建.不同的模板可以用 TEMPLATE = name 來寫.尤其是,如果你用 TEMPLATE = template0,你可以創建一個很純凈的數據庫,只包括你的版本的 PostgreSQL 預定義的標準對象.這個方法可以避免把任何已經加入到template1 里的本地安裝對象拷貝到新數據庫. 可選的編碼參數允許選擇數據庫編碼, 如果你的服務器是帶著多字節編碼支持編譯的話. 如果沒有聲明,缺省是所選用的模板數據庫用的編碼. 可選參數可以以任意順序寫,而不僅是上面顯示的順序. 注意 CREATE DATABASE是 PostgreSQL 語言的擴展. 使用 DROP DATABASE刪除一個數據庫. 程序 createdb是 是這個命令的 shell 腳本的封裝,提供來方便使用。 在用絕對路徑指定的可選數據庫位置時, 有一些安全和數據完整性的問題, 而且缺省時只有后端識別的環境變量可以聲明為可選的路徑.參考管理員手冊獲取更多的信息. 盡管我們可以通過把某數據庫名聲明為模板從非template1數據庫拷貝數據庫,但是這(還)不是一個通用的 COPY DATABASE 功能. 因此,我們建議當做模板使用的數據庫都應該是以只讀方式對待的.參閱管理員手冊獲取更多信息. 用法 創建一個新的數據庫: olly=> create database lusiadas;
在另一個地方 ~/private_db創建新數據庫: $ mkdir private_db $ initlocation ~/private_db The location will be initialized with username "olly". This user will own all the files and must also own the server process. Creating directory /home/olly/private_db Creating directory /home/olly/private_db/base
initlocation is complete. $ psql olly Welcome to psql, the PostgreSQL interactive terminal.
Type: /copyright for distribution terms /h for help with SQL commands /? for help on internal slash commands /g or terminate with semicolon to execute query /q to quit olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db'; CREATE DATABASE 兼容性 SQL92 在 里沒有 CREATE DATABASE 語句. 數據庫等同于目錄,其創建是由實現決定的.
CREATE FUNCTION CREATE FUNCTION Name CREATE FUNCTION -- 定義一個新函數 Synopsis CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS 'definition' LANGUAGE 'langname' [ WITH ( attribute [, ...] ) ] CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype AS 'obj_file' , 'link_symbol' LANGUAGE langname [ WITH ( attribute [, ...] ) ]
描述 CREATE FUNCTION定義一個新的函數. CREATE OR REPLACE FUNCTION 將要么創建一個新函數,要么替換現有的定義. 參數 name 要創建的函數名字.這個名字可以不是唯一的, 因為函數可以重載,膽識同名的函數必須有不同的參數類型. argtype 該函數的數據類型(如果有).輸入類型可以是基本類型,也可以是復合類型,opaque,或者和一個現有字段相同的類型. Opaque 表示該函數接受非 SQL 類型,比如 char *. 一個字段的類型是用 tablename.columnname%TYPE 表示的;使用這個東西可以幫助函數獨立于表定義的修改. rettype 返回數據類型.輸出類型可以聲明為一個基本類型,復合類型, setof 類型,opaque, 或者和現有字段同類型. setof 修飾詞表示該函數將返回一套條目,而不是一條條目.返回類型聲明為 opaque 的函數不返回數值.它們不能直接調用;觸發器函數可以利用這個 特性. definition 一個定義函數的字串;含義取決于語言.它可以是一個內部函數名字, 一個指向某個目標文件的路徑,一個 SQL 查詢,或者一個用過程語言 寫的文本. obj_file, link_symbol 這個形式的 AS 子句用于在函數的 C 源文件 名字和 SQL 函數的名字不同的時候動態聯接 C 語言函數. 字串 obj_file 是包含可動態裝載的對象的文件名,而 link_symbol 是對象的聯接符號,也就是該函數在 C 源文件列的名字. langname 可以是 SQL,C, internal,或者 plname,這里的 plname 是一種已創建過程語言的名字. 參閱 CREATE LANGUAGE獲取細節. 為了保持向下兼容,該名字可以用單引號包圍. attribute 一段可選的有關該函數的信息,用于優化.見下文獲取細節. 創建該函數的用戶成為該函數所有者. 下面的屬性可以出現在 WITH 子句里∶ iscachable Iscachable 表示此函數在輸入相同時總是返回相同的值 (也就是說, 它不做數據庫查找或者是使用沒有直接在它的參數列表出現的信息)。 優化器使用 iscachable 來認知對該函數的調用進行預先計算是否安全。 isstrict isstrict 表明如果它的任何參數是 NULL,此函數總是返回 NULL. 如果聲明了這個屬性,則如果存在 NULL 參數時不會執行該函數;而只是自動假設一個 NULL 結果.如果沒有聲明 isstrict 該函數將為 NULL 輸入調用并進行處理.那么剩下的事就是函數作者的責任來檢查 NULL 是否必須并且做相應響應. 注意 請參閱 PostgreSQL 程序員手冊 關于通過函數擴展 PostgreSQL 的章節獲取更多關于書寫外部函數的信息. 我們允許你將完整的 SQL 類型語法用于 輸入參數和返回值.不過,有些類型聲明的細節(比如, numeric 類型的精度域)是由下層函數實現負責的, 并且會被 CREATE FUNCTION 命令悄悄地吞掉. (也就是說,不再被識別或強制). PostgreSQL 允許函數 重載;也就是說,同一個函數名可以用于幾個不同的函數, 只要它們的參數可以區分它們。不過,這個功能在用于 internal(內部)和 C 語言 的函數時要小心。 兩個 internal 函數擁有相同 C 名稱時肯定會發生鏈接時錯誤。 要解決這個問題,給它們賦予不同的 C 名稱(例如,使用參數類型做為 C 名稱的一部分),然后在 CREATE FUNCTION 的 AS 子句里面聲明這些名字。 如果 AS 子句為空,那么 CREATE FUNCTION 假設函數的 C 名稱與SQL名稱一樣。 類似的還有,如果用多個 C 語言函數重載 SQL 函數, 給每個 C 語言函數的實例一個獨立的名稱,然后使用 CREATE FUNCTION 語法里的 AS 句的不同形式來選擇每個重載的 SQL 函數的正確的 C 語言實現. 如果重復調用 CREATE FUNCTION,并且都指向同一個目標文件,那么該文件只裝載一次.要卸載和恢復裝載 該文件(可能是在開發過程中),你可以使用 LOAD命令. 使用 DROP FUNCTION 刪除一個用戶定義函數. 要更新現存函數的定義,用 CREATE OR REPLACE FUNCTION.請注意不可能用這種方法改變一個函數的名字或者參數類型 (如果你這么干,你只是會創建一個新的,不同的函數). 同樣,CREATE OR REPLACE FUNCTION 也不會讓你改變一個現存函數的返回類型.要干這些事,你必須刪除并 重新創建該函數. 如果你刪除然后重新創建一個函數,新函數和舊的并非相同實體; 你會破壞現存的引用了原有函數的規則,視圖,觸發器等等.使用 CREATE OR REPLACE FUNCTION 可以改變一個函數的定義而又不會破壞引用該函數的對象. 例子 要創建一個簡單的 SQL 函數∶ CREATE FUNCTION one() RETURNS integer AS 'SELECT 1 AS RESULT;' LANGUAGE SQL; SELECT one() AS answer; answer -------- 1 這個例子通過調用一個用戶創建的名為 funcs.so (擴展名因平臺而異)的共享庫過程創建一個 C 函數.該共享庫文件應該位于服務器的動態搜索路徑里.該路徑計算一個檢測位并且如果函數參數里的檢測位 正確就返回一個 TRUE .這些可以通過用一個 CHECK 約束實現的. CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean AS 'funcs' LANGUAGE C; CREATE TABLE product ( id char(8) PRIMARY KEY, eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}') REFERENCES brandname(ean_prefix), eancode char(6) CHECK (eancode ~ '[0-9]{6}'), CONSTRAINT ean CHECK (ean_checkdigit(eanprefix, eancode)) ); 這個例子創建一個在用戶定義類型 complex 和內部類型 point 之間做類型轉換的函數。該函數是用一個從 C 源代碼編譯的動態裝載的對象來實現的。(我們演示了使用聲明共享目標文件 的準確路徑名的過時方法). 對于 PostgreSQL 而言,要自動尋找類型轉換函數,SQL 函數必須和返回類型同名,因而重載是不可避免的。 該函數名通過使用 SQL定義里 AS 子句的第二種類型來重載: CREATE FUNCTION point(complex) RETURNS point AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point' LANGUAGE C; 該函數的 C 聲明可以是∶ Point * complex_to_point (Complex *z) { Point *p; p = (Point *) palloc(sizeof(Point)); p->x = z->x; p->y = z->y; return p; } 兼容性 SQL92 在 SQL99 里的確定義了一個CREATE FUNCTION PostgreSQL 的和它類似但是不兼容.這個屬性是不可移植的,可以使用的不同語言也是如此. 又見 DROP FUNCTION , LOAD, PostgreSQL程序員手冊
CREATE GROUP CREATE GROUP Name CREATE GROUP -- 定義一個新的用戶組 Synopsis CREATE GROUP name [ [ WITH ] option [ ... ] ]
這里 option 可以是∶
SYSID gid | USER username [, ...]
輸入 name 組名。 gid SYSID 子句可以用于選擇 PostgreSQL 里新組的組標識(group id)。 不過,這樣做不是必須的。 如果沒有聲明這個,將使用從 1 開始的,已分配的最高組標識加一作為缺省值。 username 包括到組里面的用戶列表。用戶必須已經存在。 輸出 CREATE GROUP 成功創建組后的返回。 描述 CREATE GROUP 將在數據庫節點上創建一個新組。參考管理員手冊獲取關于使用組來認證的信息。 要使用這條命令, 你必須是數據庫超級用戶。 使用 ALTER GROUP修改組成員,DROP GROUP刪除一個組。 用法 創建一個空組: CREATE GROUP staff 創建一個有成員的組: CREATE GROUP marketing WITH USER jonathan, david 兼容性 SQL92