¿GRANT CREATE INDEX o GRANT DROP TABLE?

En Teradata, cuando un usuario crea una tabla, automáticamente se le otorgan sobre esa misma tabla los privilegios:

• CREATE TRIGGER y DROP TRIGGER
• DELETE
• DROP TABLE
• DUMP
• INDEX
• INSERT
• REFERENCES
• RESTORE
• SELECT
• UPDATE
• WITH GRANT OPTION para todos los privilegios asignados automáticamente.

Por otra parte, los privilegios para el propietario (“owner“) de la tabla son los mismos que se le otorgan automáticamente al creador (“creator“), salvo que en este caso no se insertan las filas correspondientes en DBC.AccessRights.

Normalmente no ocurre que un usuario que no sea el creador tenga que crear índices sobre una tabla de la cual no es el propietario (además el privilegio “INDEX” era necesario para crear estadísticas en una tabla hasta la versión 12 de Teradata. En la versión 13 ha aparecido el nuevo privilegio “STATISTICS”). Pero si se presentara el caso nos podemos encontrar sorpresas.

Primero, como el usuario CARLOS vamos a crear un usuario CARLOS2:

 BTEQ -- Enter your SQL request or BTEQ command:
CREATE USER CARLOS2
  FROM CARLOS
AS
PERMANENT = 1073741824 BYTES --1GB
TEMPORARY = 39384679218 BYTES
    SPOOL = 39384679218 BYTES
 PASSWORD = xxxxxxxx
;

 *** User has been created.
 *** Total elapsed time was 1 second.

Este usuario -CARLOS2- no puede hacer nada (ni siquiera SELECT) sobre la base de datos CARLOS ni sobre ninguno de sus objetos. Así, como CARLOS hacemos:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT * FROM CARLOS.PRUEBA01;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

       id_n  C_TXT
-----------  -------------------------
          3  TRES
          1  UNO
          2  DOS

Pero como CARLOS2 -al que no se le ha asignado ningún privilegio sobre la base de datos CARLOS- si intentamos lo mismo, tenemos:

SELECT * FROM CARLOS.PRUEBA01;
 *** Failure 3523 The user does not have SELECT access to CARLOS.prueba01.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

Ahora viene lo bueno. Supongamos que queremos permitir a CARLOS2 crear índices sobre las tablas de CARLOS. En Teradata existe el privilegio “INDEX”, que permite crear índices. Pero lo malo es que este privilegio se otorga por tabla, no por base de datos. Aun así, podríamos hacer como CARLOS:

 BTEQ -- Enter your SQL request or BTEQ command:
GRANT INDEX ON CARLOS.PRUEBA01 TO CARLOS2;

 *** Grant accepted.
 *** Total elapsed time was 1 second.

Y como CARLOS2 podríamos:

 BTEQ -- Enter your SQL request or BTEQ command:
CREATE INDEX PRUEBA01_NUSI(C_TXT) ON CARLOS.PRUEBA01;

 *** Index has been created.
 *** Total elapsed time was 1 second.

Pero ¿qué pasa si queremos que CARLOS2 pueda crear índices en todas las tablas de CARLOS? No existe el privilegio “INDEX” ni “CREATE INDEX” para bases de datos.

Pues la respuesta, enrevesada, es que el privilegio requerido es “DROP TABLE” (¿¡!?):

Otra vez como CARLOS:

 BTEQ -- Enter your SQL request or BTEQ command:
REVOKE INDEX ON CARLOS.PRUEBA01 FROM CARLOS2;

 *** Revoke accepted.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
GRANT DROP TABLE ON CARLOS TO CARLOS2;

 *** Grant accepted.
 *** Total elapsed time was 1 second.

Y, para nuestra sorpresa, vemos que CARLOS2:

 BTEQ -- Enter your SQL request or BTEQ command:
CREATE INDEX PRUEBA01_NUSI(C_TXT) ON CARLOS.PRUEBA01;

 *** Index has been created.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SHOW TABLE  CARLOS.PRUEBA01;

 *** Text of DDL statement returned.
 *** Total elapsed time was 1 second.

---------------------------------------------------------------------------
CREATE SET TABLE CARLOS.PRUEBA01 ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      id_n INTEGER NOT NULL,
      C_TXT VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL)
UNIQUE PRIMARY INDEX PRUEBA01_UPI ( id_n )
INDEX PRUEBA01_NUSI ( C_TXT );

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT * FROM  CARLOS.PRUEBA01;
 *** Failure 3523 The user does not have SELECT access to CARLOS.prueba01.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

Es decir, el usuario CARLOS2 no puede hacer casi nada sobre la base de datos CARLOS, pero teniendo el privilegio “DROP TABLE” puede crear índices sobre las tablas existentes.

Saludos.

Carlos.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: