2010-07-17 20 views
1

的Informix-SQL(SE)4.10.DD6(MS-DOS 6.22):表權限問題試圖刪除表時

我作爲創建的表: 「pcuser」 .tablename。我試圖用,以刪除該表:

DROP TABLE tablename; 

並收到以下錯誤消息:

545: No write permission for table pcuser.tablename. 

由於我的應用程序是單用戶,我不關心限制任何表的權限,我安裝了不帶密碼保護的ISQL 4.10(即啓動SE引擎時不需要用戶名或密碼)。所以默認和唯一的用戶名/表所有者總是「pcuser」。使用ISQL 2.10時,在刪除,創建,讀取或寫入表格時,我不必指定「table-owner」.tablename。不過,我確實授予了所有公共桌面名稱並將dba授予公衆。我還在4.10中執行了同樣的授權聲明。

刪除表就像當我必須指定表的所有者:

DROP TABLE "pcuser".tablename; 

對不起,我沒有爲ISQL 4.10的文檔。

以下是表名SYSTABAUTH和SYSTABLES行perform.out屏幕輸出:

SYSTABAUTH: 

grantor   [pcuser ] 
grantee   [public ] 
tabid    [102  ] 
tabauth   [su-idxa] 


SYSTABLES: 

tabname   [tablename   ] 
owner    [pcuser ] 
dirpath   [C:\DBFILES.DBS\TABLENAME  ] 
        [        ] 
tabid    [102  ] 
rowsize   [256 ] 
ncols    [48 ] 
nindexes   [5  ] 
nrows    [1082594 ] 
created   [07-13-2010] 
version   [9   ] 
tabtype   [T] 
audpath   [        ] 
        [        ] 

下面是我的應用程序兩個SQL特效。第一個正常的高管,但第二個失敗,在DROP TABLE語句中的ERR 545:

{CREATEDB.SQL - First SQL Proc} 

DROP DATABASE dbfiles; 

CREATE DATABASE dbfiles; 

CREATE TABLE tablename 
    (
    col1 char(18), 
    col2 char(60), 
    [...] 
    ) in "C:\DBFILES.DBS\TABLENAME"; 

LOAD FROM "tablename.unl" INSERT INTO tablename; 

CREATE UNIQUE INDEX tablename_idx1 ON tablename (col1); 

GRANT ALL ON tablename TO PUBLIC; 

GRANT DBA TO PUBLIC; 

UPDATE STATISTICS; 

--- 

{DROPTAB.SQL - Second SQL Proc} 

DROP TABLE tablename; 
     ^
      ERROR 545: No Write Permission.... 
+1

通常不需要定位文件 - 那麼如果在創建步驟中刪除IN子句,會發生什麼情況? DROP步驟是否有效?如果你保持TABLENAME組件爲DOS 8.3格式(所以你指定'IN「C:\ DBFILES.DBS \ TBLNAME」')? – 2010-07-19 05:05:28

+0

@Jonathan:「CREATE TABLE ... IN ...」正常工作!我使用它的原因是爲了避免SE將它的日誌數字追加到SE文件名的前五個字母,例如SYSME101.DAT ..你認爲這可能是SQL腳本中寫入perm錯誤的原因嗎?..我使用ISQL中的表名最多爲8個字符,我只是使用「TABLENAME」來描述示例。在ISQL 4.10(DOS)以及2.10中,如果您使用多於8個字符的表名,DOS將截斷8以上的任何內容,從而強制執行8.3 ..我只是將SYSTABAUTH行值添加到問題中。這個問題沒有發生在2.10! – 2010-07-19 05:27:18

+0

@Jonathan:當我安裝ISQL 2.10(DOS)時,我選擇了用戶名/密碼選項,這樣除非用戶提供了正確的用戶名和密碼,否則沒有人可以啓動SE引擎。這也允許我以用戶informix的身份登錄,這樣我就可以操作.DBS目錄中的所有SYS *表(主要是爲了更改SYSTABLES cuz SE的.DAT和.IDX默認命名方法在更改表時引入問題,以後我使用CREATE TABLE時會引起問題。 ..在「C:\ DBFILES.DBS \ TABLENAM」; – 2010-07-19 05:37:00

回答

3

運行「finderr -545」,我得到的信息:

-545對於沒有寫權限表格表名稱。

查看隨附的ISAM錯誤代碼以獲取更多信息。通過此 數據庫服務器,數據庫是一個名稱爲dbname.dbs, 的目錄,而表和索引是該目錄中的文件。您需要 對所有這些文件具有讀取和寫入權限才能執行 正常的數據庫功能。

您需要查看數據庫目錄(dbname.dbs)的目錄權限。如果你是以'pcuser'登錄的,你需要擁有這個目錄並有權刪除它(並創建文件等)。

我不知道如何從DOS(實際上沒有用戶)的ISQL和SE適應現代版本的Windows(有用戶)。

如果您在其他平臺上運行,我會爲您提供針對'授予DBA公佈'的諮詢意見;這是一場災難。我仍然不相信這是一個好主意,但是我沒有任何可以指出的明確反對它的具體細節 - 但這種感覺是錯誤的;你應該關心誰訪問數據庫以及誰有能力重建數據庫。

回答'我必須在DROP TABLE語句中指定用戶名?'的答案是'否'。錯誤消息來自查詢被解析和驗證後的階段;它理解表名。只是運行查詢的用戶似乎沒有足夠的權限來執行請求的操作。

+0

在這個特定情況下,它是DOS 6.22中的C:\ DBFILES.DBS。.DBS目錄上沒有任何屬性設置爲寫保護,而不像unix中的chmod 500,它只允許所有者讀取和執行燙髮。你可以說.DBS具有相當於chmod 777的功能。我甚至測試了使用perform來添加/更新/刪除行,並且它一切正常,但是當試圖執行一個sql proc時,它會刪除,創建並將一個.unl加載到表中,proc在'drop table tablename'失敗,錯誤爲545.我需要爲單獨的用戶(當鋪所有者)提供完整的dba訪問權限,所以他可以運行reorg proc – 2010-07-18 00:44:31

+0

請參閱編輯的問題,使用SYSTABLES行爲表名和SQL腳本。我不希望對這個舊版本有任何支持,但感謝您的反饋! – 2010-07-19 01:09:55