Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

ALTER TABLE en SQL Server 2k

Estas en el tema de ALTER TABLE en SQL Server 2k en el foro de Bases de Datos General en Foros del Web. Hola, Mi problema es bien simple, no encuentro donde dar permisos en SQL Server para que un usuario distinto a "sa" pueda hacer "alter", "create" ...
  #1 (permalink)  
Antiguo 05/08/2004, 03:20
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
ALTER TABLE en SQL Server 2k

Hola,

Mi problema es bien simple, no encuentro donde dar permisos en SQL Server para que un usuario distinto a "sa" pueda hacer "alter", "create" y demas sobre una tabla concreta de una base de datos.

Hay alguna forma de darle permisos a esos usuarios para que despues pueda implementar codigo SQL con funciones "alter" desde ASP?

Gracias
  #2 (permalink)  
Antiguo 05/08/2004, 14:42
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Revisa Alter Table en los Books Online (la ayuda)

Ahi cita:
Cita:
Permissions
ALTER TABLE permissions default to the table owner, members of the sysadmin fixed server role, and the db_owner and db_ddladmin fixed database roles, and are not transferable.
El menos peligroso sería db_ddladmin, es un rol al que tienes que meter el usuario
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 06/08/2004, 03:10
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Mensaje

Gracias x tu respuesta porque no me apetecia darle roles de db_owner a mi usuario. Ahora lo que me pasa es que tengo otro problemilla al hacer el ALTER TABLE añado una columna a una tabla de tipo 'bit' y me funciona bien.
Código:
requeteSQL2 = "alter table news add " + nomListe + " bit NOT NULL DEFAULT(0)"
nomListe es una variable de cadena de caracteres.
El problema es al ir a borrar estas columnas me da un error que no entiendo muy bien, como si la tabla estuviese abierta y no me dejase borrarla. La sentencia SQL es la siguiente
Código:
requeteSQL2 = "alter table news drop column " + nomListe +""
El error que me da es el siguiente
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Le objet 'DF__news__asoo__46E78A0C' dépend du colonne 'asoo'.

PD: Perdon que este en frances
  #4 (permalink)  
Antiguo 06/08/2004, 10:42
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Lo que pasa es que cuando creas una tabla y le asignas un valor por default y haces posteriomente un drop a esa columna te marca una dependencia...lo que puedes hacer es lo siguiente:

requeteSQL2 = "alter table news add " + nomListe + " bit NULL"
...
...
requeteSQL2 = "alter table news drop column " + nomListe +""


Y ya sin valor por default y que acepte nulls podrás eliminarla sin problemas

La otra forma es jugar con alter para que acepte valores por default y sin nulls.. y cuando desees eliminarla le quites esas opciones para que no caigas en el mismo problema..

Prueba y nos avisas que tal..

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 06/08/2004, 14:40
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
O también crea el default con un nombre explícito (asi ya no te agrega el "__46E78A0C" que es aleatorio), asi ANTES de borrar la columna puedes (y debes) de borrar el default creado.

Eso tiene la ventaja de que la logica de tu aplicacion (o sea, el resto del codigo) permanezca sin cambios
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 09/08/2004, 02:28
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
He probado a modificar la tabla como me dijisteis quitandole el Default y aceptando NULL de la siguiente forma
Código:
requeteSQL2 = "alter table news alter column " + nomListe + " bit null"
Sin embargo no funciona me sigue dando el mismo error a la hora de hacer el drop
Cita:
O también crea el default con un nombre explícito (asi ya no te agrega el "__46E78A0C" que es aleatorio), asi ANTES de borrar la columna puedes (y debes) de borrar el default creado.
Y como hago eso exactamente, perdona es que soy novatillo
Gracias por vuestra ayuda
  #7 (permalink)  
Antiguo 09/08/2004, 15:03
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Cita:
Y como hago eso exactamente
Haciendo 2 add's, no se si lo puedas hacer algo como esto dentro de la misma tabla (me invento parte de la sintaxis, investiga como sería exactamente):

ALTER TABLE miTabla
ADD columna BIT NOT NULL
ADD default miDefault 0 TO columna

Si no funciona (probable), prueba creando un default externo (externo a la tabla) con:
CREATE DEFAULT default_a_cero AS 0

Y luego ligandolo al campo:
ALTER TABLE miTabla
ADD columna BIT NOT NULL
GO
sp_bindefault default_a_cero, 'miTabla.columna' --Aqui lo estas ligando

Para borrar la columna usando el Default externo primero necesitas hacer:
sp_unbinddefault default_a_cero, 'miTabla.columna' --primero quitas el default
GO
ALTER TABLE miTabla --ya despues si borramos la columna
DROP columna

Es importante que sepas que el DEFAULT sigue existiendo aún después de que borras la columna, de manera que lo puedes seguir ligando con N cantidad de campos sin problemas y sin andar borrandolo y re-creandolo. Todo esto precisamente por que es externo a la defincion de tu columna

suerte
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 10/08/2004, 05:44
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Resuelto

Bueno parece que por fin me funciona os explico como he hecho
Código:
//requeteSQL2 = "CREATE DEFAULT default_a_cero AS 0";
//rsql2.Open(requeteSQL2,cnx);
Esto solo lo he descomentado una vez ya que no lo destruyo en ninguna parte del codigo y como bien dice Mithrandir queda residente en la bbdd.
Código:
requeteSQL2 = "ALTER TABLE news ADD " + nomListe + " bit NULL";
			rsql2.Open(requeteSQL2,cnx);
			requeteSQL2 = "UPDATE news SET " + nomListe + "=0";
			rsql2.Open(requeteSQL2,cnx);
			requeteSQL2 = "ALTER TABLE news ALTER COLUMN " + nomListe + " bit NOT NULL";
			rsql2.Open(requeteSQL2,cnx);
			requeteSQL2 = "sp_bindefault default_a_cero, 'news." + nomListe + "'";
			rsql2.Open(requeteSQL2,cnx);
Todo esto es pa añadir la columna de marras, la tengo que crear como NULL para que me admita valorers NULOS al principio, luego le doy a cada registro en esa columna el valor 0 para que no me de error al pasarla a NOT NULL y por ultimo le defino el DEFAULT. No le podia definir un default al principio cuando creo la columna porque muego no me deja quitarlo con sp_unbindefault.
Por ultimo para borrar esa tabla hago lo siguiente
Código:
requeteSQL2 = "sp_unbindefault 'news." + nomListe + "'";
			rsql2.Open(requeteSQL2,cnx);
			requeteSQL2 = "alter table news drop column " + nomListe +"";
			rsql2.Open(requeteSQL2,cnx);
Y asi me funciona a la perfeccion espero que os sea de ayuda. Muchas gracias a los que me habeis ayudado, yo por mi parte he aprendido un huevo con esto
  #9 (permalink)  
Antiguo 10/08/2004, 14:36
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Excelente, felicidades
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:11.