Automatizar truncado de tablas

01/12/2006 - 11:36 por Jesus Suarez | Informe spam
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.

Preguntas similare

Leer las respuestas

#6 Eladio Rincón
01/12/2006 - 12:40 | Informe spam
Igual me cae algún palo que otro, pero desde mi punto de vista, el uso de
cursores para tareas administrativas es perfectamente válido :-)

Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"J.A. García Barceló" wrote in message
news:
Otra pregunta me surge...

Las ventajas de usar cursores, para este caso, en el que la eficiencia no
se va a ver comprometida (serán n tablas, las diferencias en rendimiento
de usar cursores a no usarlos sería una funcion lineal dependiente de n).
¿Merece la pena evitar usar cursores intentando tu sugerencia que, al
final ejecuta una única instrucción, que en cuanto falle cualquier tabla,
te debería hacer un rollback del borrado de todas ellas (supongo, ¿no?) ¿y
si tienes en cuenta que este código se va a ejecutar una única vez? ¿y si
tienes en cueenta la legibilidad del código (siempre es mas legible una
implementación iterativa)?

En definitiva ¿merece la pena siempre evitar los cursores a toda costa?

J.A. García Barceló
http://jagbarcelo.blogspot.com


"Miguel egea" escribió en el mensaje
news:
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes
garantizar no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias, el
orden es muy importante para no violar fks, así que voy a ver si le doy
una vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes
un script que itera (con cursores) sobre las tablas like 'sistemas_td%'
para hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los
datos de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE
TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and type='U'
order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de
una base de datos que comienzen por la palabra sistemas_td, ya que
tengo problemas con las claves foraneas.













Respuesta Responder a este mensaje
#7 Eladio Rincón
01/12/2006 - 12:41 | Informe spam
Jesús, asumo que el truncado es alguna tarea administrativa, ¿verdad?

Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Jesus Suarez" wrote in message
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.

Respuesta Responder a este mensaje
#8 J.A. García Barceló
01/12/2006 - 12:59 | Informe spam
Me refería a las constraints que afectan a las tablas que vas a BORRAR
suponiendo que lo que quería hacer Jesús era borrar las tablas, y no hacer
truncates. Efectivamente, si hay que hacer truncates, entonces tenemos otro
problema ya que las restricciones habría que volverlas a crear.

Tampoco esto último es un problema:
En mi entorno de producción usamos replicación y, aunque en 2005 hay una
nueva opción para replicar las constraints que aplican a una tabla a los
suscriptores, esta opción solo funciona cuando las 2 tablas implicadas están
en la publicación; si una de las tablas cae dentro de la publicación y otra
se encuentra fuera (aunque sea dentro de otra publicación) entonces ese
constraint no se replica a los suscriptores. En mi blog tengo una entrada
donde explico como replicar TODAS las restricciones de integridad a los
suscriptores (independientemente de que dichas constraints salten de una
publicación a otra)

Mirad en:
http://jagbarcelo.blogspot.com/2006...ys-to.html

Lo que hago es crearme una tabla que también replico a los suscriptores
donde introduzco la información de las FKs que tengo que reconstruir en los
suscriptores. También tengo un par de SPs para extraer la información e
introducirla en esas tablas (debe ejecutarse en el publicador) y otros SPs
para ejecutar en los suscriptores para hacer DROPs y CREATEs de las FKs con
la información de esta tabla que sirve de transporte de FKs entre sitios.

Supongo que esos SPs podrían servir (al menos de ayuda) para borar las FKs y
luego volver a crearlas despues de haber hecho los DROP TABLEs o TRUNCATE
TABLEs. Lamentablemente uso cursores ;)

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Miguel egea" escribió en el mensaje
news:
Definitivamente no, es decir, no todos los cursores son el demonio,
aunque a mi me guste decir que el unico cursor bueno es el cursor muerto.

De hecho ni siquiera es verdad absoluta que lo que se puede hacer con
cursores se puede hacer sin ellos más rápido. Eladio y yo estuvimos en un
proyecto en que por la distribución de los datos, y las estadísticas, el
cursor, era más rápido que la instrucción equivalente, lamentablemente era
así porque la clave era un guid y la distribución era muy muy poco
uniforme.

En cualquier caso, en el foro yo prefiero decir que todos son malos, y que
hay que evitarlos, por que es cierto que diciendo eso hierras menos que si
no lo dices y haces mejor papel a la gente que nos lee :)

Yo no quería borrar las constraints sino crear el script en el orden
correcto, porque las constraints si no hay que volver a crearlas o dejas
la BBDD echa un solar :)..

De todas formas, me encantan estas discusiones, nos enriquecen a todos IMO
:)


"J.A. García Barceló" wrote in message
news:
Otra pregunta me surge...

Las ventajas de usar cursores, para este caso, en el que la eficiencia no
se va a ver comprometida (serán n tablas, las diferencias en rendimiento
de usar cursores a no usarlos sería una funcion lineal dependiente de n).
¿Merece la pena evitar usar cursores intentando tu sugerencia que, al
final ejecuta una única instrucción, que en cuanto falle cualquier tabla,
te debería hacer un rollback del borrado de todas ellas (supongo, ¿no?)
¿y si tienes en cuenta que este código se va a ejecutar una única vez? ¿y
si tienes en cueenta la legibilidad del código (siempre es mas legible
una implementación iterativa)?

En definitiva ¿merece la pena siempre evitar los cursores a toda costa?

J.A. García Barceló
http://jagbarcelo.blogspot.com


"Miguel egea" escribió en el mensaje
news:
Si en 2005, concatenando en un varchar(max) (en 2000 no puedes
garantizar no pasarte de 8000 caracteres
/* codigo sin probar para nada */
Declare @v varchar(max)
set @v=''
select @v=@v+'DROP TABLE [' + schema_name+'].['+table_name+']' from
information_schema.tables where table_name like xxxx
exec(@v)

Pero tanto tu código como el mio tienen un problema, las dependencias,
el orden es muy importante para no violar fks, así que voy a ver si le
doy una vuelta y escribo algo para portalsql,

tengo un millón de cosas pendientes a ver si esta la cumplo

Saludos
Miguel Egea


"J.A. García Barceló" wrote in message
news:%
Una cosa es truncado de tablas y otra el borrado de tablas. Aqui tienes
un script que itera (con cursores) sobre las tablas like 'sistemas_td%'
para hacer un drop table
Esto te BORRA las tablas, que es diferente a truncarlas (borrar los
datos de las tablas). Si lo que quieres es truncar, utiliza TRUNCATE
TABLE.


DECLARE @N nvarchar(2048),
@sql nvarchar(2048)

DECLARE MiCursor CURSOR LOCAL FOR
select name from sys.objects where name like 'sistemas_td%' and
type='U' order by name

OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @N
WHILE (@@FETCH_STATUS <> -1) BEGIN
IF (@@FETCH_STATUS <> -2) BEGIN

SELECT @sql = N'DROP TABLE ' + QUOTENAME(@N)
PRINT @sql
efectivamente EJECUTAR el borrado de las tablas
END
FETCH NEXT FROM MiCursor INTO @N
END
CLOSE MiCursor
DEALLOCATE MiCursor


Pregunta para los acérrimos anticursores: Entiendo vuestra postura y yo
también intento no usarlos pero... ¿se podría hacer esto mismo sin
cursores?

Un saludo.

J.A. García Barceló
http://jagbarcelo.blogspot.com

"Jesus Suarez" escribió en el mensaje
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de
una base de datos que comienzen por la palabra sistemas_td, ya que
tengo problemas con las claves foraneas.

















Respuesta Responder a este mensaje
#9 Javier Loria
01/12/2006 - 14:06 | Informe spam
Hola Jesus:
El siguiente codigo te genera las sentencias necesarias:
SELECT 'BEGIN TRAN' AS Sentencia
UNION ALL
SELECT DISTINCT 'ALTER TABLE ' + CCU.TABLE_SCHEMA +'.'
+CCU.TABLE_NAME+' DROP CONSTRAINT ' + CCU.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCU
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC
ON CCU.CONSTRAINT_NAME=RC.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCUPK
ON RC.UNIQUE_CONSTRAINT_NAMEÌUPK.CONSTRAINT_NAME
WHERE CCUPK.TABLE_NAME LIKE 'sistemas_td%'
UNION ALL
SELECT 'DROP TABLE '+TABLE_SCHEMA+'.'+TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sistemas_td%'
AND TABLE_TYPE='BASE TABLE'
UNION ALL
SELECT 'COMMIT'
Saludos,


Javier Loria
Costa Rica-MVP
Solid Quality Learning


"Jesus Suarez" wrote in message
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.

Respuesta Responder a este mensaje
#10 Jesus Suarez
01/12/2006 - 15:05 | Informe spam
exactamente, es una tarea administrativa

"Eladio Rincón" escribió en el mensaje
news:%
Jesús, asumo que el truncado es alguna tarea administrativa, ¿verdad?

Saludos,

Eladio Rincón,
Mentor Solid Quality Learning
SQL Server MVP


Visita mi página web
Artículos, recursos y trucos de SQL Server 2000 y 2005
http://www.siquelnet.com


"Jesus Suarez" wrote in message
news:
Hola a todos

como puedo hacer para borarr de forma automatica todas las talbas de una
base de datos que comienzen por la palabra sistemas_td, ya que tengo
problemas con las claves foraneas.





Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida