2010-07-17 2 views
1

Informix-SQL (SE) 4.10.DD6 (MS-DOS 6,22):Tableau des problèmes d'autorisation lorsque vous tentez de supprimer une table

J'ai une table créée comme: "pcuser" .tablename. J'ai essayé de laisser tomber cette table avec:

DROP TABLE tablename; 

et reçu le message d'erreur suivant:

545: No write permission for table pcuser.tablename. 

Depuis mon application est mono-utilisateur et je ne suis pas concerné par la restriction des privilèges pour une table, je ISQL 4.10 installé sans protection par mot de passe (aucun nom d'utilisateur ou mot de passe n'est requis pour démarrer le moteur SE). Ainsi, le nom d'utilisateur et le propriétaire de la table par défaut et uniquement les utilisateurs sont toujours "pcuser". Avec ISQL 2.10, je n'ai pas eu à spécifier "table-owner" .tablename lors de la suppression, la création, la lecture ou l'écriture dans une table. Cependant j'ai tout donné sur le nom de table au public et j'accorde dba au public. J'ai également exécuté les mêmes déclarations de subvention en 4.10.

Dois-je préciser le propriétaire de la table lors de la suppression d'une table comme:

DROP TABLE "pcuser".tablename; 

Désolé, je n'ai pas la documentation ISQL 4.10.

Voici les sorties d'écran perform.out de ligne SYSTABAUTH et SYSTABLES pour tablename:

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   [        ] 
        [        ] 

Voici deux procs sql dans mon application. Le premier execs correctement, mais la seconde échoue avec l'err 545 sur la déclaration drop table:

{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

Normalement, vous n'avez pas besoin de localiser les fichiers. Que se passe-t-il si vous supprimez la clause IN dans l'étape de création? Est-ce que l'étape DROP fonctionne? Qu'en est-il si vous gardez le composant TABLENAME au format DOS 8.3 (donc vous spécifiez 'IN" C: \ DBFILES.DBS \ TBLNAME "')? –

+0

@Jonathan: Le "CREATE TABLE ... IN ..." fonctionne bien! La raison pour laquelle je l'utilise est d'éviter SE d'ajouter ses numéros de journalisation aux cinq premières lettres de noms de fichiers SE comme par exemple SYSME101.DAT .. Pensez-vous que cela pourrait être la cause des erreurs d'écriture perm dans les scripts sql? 8 caractères max pour les noms de tables dans ISQL, je viens d'utiliser "TABLENAME" pour décrire des exemples. Dans ISQL 4.10 (DOS), ainsi que 2.10, si vous utilisez plus de 8 caractères pour les noms de table, DOS tronque quoi que ce soit sur 8, appliquant ainsi 8.3. J'ai juste ajouté les valeurs de ligne SYSTABAUTH à la question. Ce problème n'est pas arrivé avec 2.10! –

+0

@Jonathan: Lorsque j'ai installé ISQL 2.10 (DOS), j'ai choisi l'option nom d'utilisateur/mot de passe pour que personne ne puisse lancer le moteur SE à moins de fournir le bon identifiant et le bon mot de passe. Cela m'a également permis de me connecter en tant qu'informix utilisateur afin que je puisse manipuler toutes les tables SYS * dans le répertoire .DBS (principalement pour modifier SYSTABLES cuz SE .DAT et .IDX méthode de dénomination par défaut introduit des problèmes lors de la modification des tables, plus tard en utilisant CREATE TABLE. .. "C: \ DBFILES.DBS \ TABLENAM"; –

Répondre

3

Running 'finderr -545', je reçois l'information:

-545 Aucune autorisation d'écriture pour table nom de la table.

Vérifiez le code d'erreur ISAM fourni pour plus d'informations. Avec ce serveur de base de données , une base de données est un répertoire avec le nom dbname.dbs, tandis que les tables et les index sont des fichiers dans ce répertoire. Vous devez avoir accès en lecture et en écriture à tous ces fichiers afin d'exercer fonctions de base de données normales.

Vous devez consulter les autorisations de répertoire dans le répertoire de base de données (nombdd.dbs). Si vous êtes connecté en tant que 'pcuser', vous devez posséder le répertoire et avoir la permission d'en retirer des fichiers (et de créer des fichiers, etc.).

Je ne suis pas sûr comment ISQL et SE de DOS (où il n'y avait pas vraiment d'utilisateurs) s'adaptent aux versions modernes de Windows (où il y a des utilisateurs).

Si vous utilisiez une autre plate-forme, je vous conseillerais de ne pas accorder de DBA AU PUBLIC; C'est une recette pour le désastre. Je ne suis toujours pas convaincu que ce soit une bonne idée, mais je n'ai pas de détails sur lesquels je puisse pointer, mais qui me paraissent erronés; vous devriez vous soucier de qui accède à la base de données et qui a la capacité de reconstruire la base de données.

En réponse à la question "Dois-je spécifier le nom d'utilisateur dans l'instruction DROP TABLE?", La réponse est "Non". Le message d'erreur provient d'une étape après que la requête a été analysée et validée; il comprend le nom de la table.C'est juste que l'utilisateur exécutant la requête semble avoir un privilège insuffisant pour faire l'opération demandée.

+0

dans ce cas précis, c'est C: \ DBFILES.DBS dans DOS 6.22 .. Aucun attribut sur le répertoire .DBS n'a été défini pour le protéger en écriture, contrairement à, disons chmod 500 dans unix qui donne seulement au propriétaire de lire et d'exécuter les perms. On pourrait dire que le .DBS a l'équivalent de chmod 777. J'ai même testé ajouter/mettre à jour/enlever des lignes avec perform et tout fonctionne bien, cependant en essayant d'exécuter un proc de sql qui tombe, crée et charge un .unl dans la table , le proc échoue à 'drop table nomtable' avec err 545. Je dois fournir l'utilisateur solitaire (le propriétaire du prêteur sur gages) avec un accès dba complet afin qu'il puisse exécuter le processus de reorg –

+0

Veuillez voir la question éditée avec la ligne SYSTABLES pour le nom de table et le script SQL . Je ne m'attends pas à un support pour cette version héritée, mais j'apprécie tous vos commentaires! –

Questions connexes