¿Cómo puedo sacar la relación de unas tablas hechas en SQL server?

Como puedo sacar la relación de unas tablas echas en sql server. Es que soy nueva en mi lugar de trabajo y nadie me puede aportar dicha información. Así que imaginate el follón cuando quiero trabajar con ellas!
Respuesta
1
carmen:}
Disculpa la tardanza pero he estado muy ocupado, de todos modos ya me entere que tuviste bronca con otros, espero que lo que te mando te sirva, sonríe y se feliz como una lombriz, y si no ponte enojada como querrás, de todos modos no vas a ganar nada ( buen verso ), solo quiero subrrayar que el presente no es de mi cosecha sino que lo halle hace rato en internet, ¿y gratis lo que es gratis verdad?, bueno aquí va.
create proc JR_SP_GettingPKFK @catalogo as char(100) as
SELECT a.TABLE_NAME, b.COLUMN_NAME, a.CONSTRAINT_TYPE
FROM
INFORMATION_SCHEMA.table_constraints a,
INFORMATION_SCHEMA.key_column_usage b
WHERE a.CONSTRAINT_CATALOG =@catalogo and
a.CONSTRAINT_CATALOG = b.CONSTRAINT_CATALOG and
a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA and
a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
ORDER BY A.TABLE_NAME
GO
Para ejecutarlo solo tienes que escribir así:
exec JR_SP_GettingPKFK nombrebasededatos
Disculpa la redacción.
Jorge
Desde guatemala
¿Bronca? ¿Por qué dices eso? Simplemente pregunte a otra gente ademas de ti! A parte me lo podrías explicar un poco lo que hace es que me gusta siempre saber lo que esto y haciendo si no es mucho pedir.
Gracias de antemano.
Voy a tratar de ir paso por paso no se si lo haga bien o no sino me avisas:}
Lo que hace es crear un stored procedure ( procedimiento almacenado ). La segunda cosa es que es un procedimiento almacenados que acepta un único parámetro de entrada ( el nombre de la base de datos a la que quieres aplicarle el mismo, este no tiene que ir entre apostrofes ni comillas).
Cada vez que se crea un base de datos o tabla o indice o constraint esto se registra en tablas del sistema que son aquellas que empiezan su nombre con sys. Entonces lo que hace el stored procedure es utilizar unas vistas del sistema que apuntan a esas tablas de manera que podas saber cual es la llave que quedo almacenada para una tabla en particular para una base de datos en particular ( que es el nombre que acabas de mandarle como parámetro). El resultado sera tres columnas mostrándote la primera el nombre de la tabla a la cual hace referencia, la segunda columna que contiene el nombre de la columna que contiene el constraint y la tercera columna te muestra el constraint ( primary key, foreign key), si lo ves bien ordenando las columnas podes ver los duplicados que tienes y así organizar tus relaciones mejor dicho joins en tu base de datos).
Creo que eso ya lo habías entendido, se ve al leer el sp, lo cual implica que podrías agregar algunas columnas más al sp para que funcione 100% como quieres, si esto aun no te sirve avisame, no soy muy bueno pero lo poco que se no lo se muy bien, que relajo.
Ciao
Jorge
Desde guatemala
Resulta que yo quiero saber la relación que hay entre 150 tablas más o menos. ¿Esto cambia ya no?
No entendí la pregunta, ¿pero bueno el stored procedure (sp) te muestra las llaves foráneas que tiene una tabla contra otra ok?, por ejemplo tengo la tabla A con las columnas a1, a2, a3 y la tabla B con las columnas b1, b2, a3 quiere decir que a3 es una llave foránea en la tabla A, esto es una relación ! Si!, segundo te dije que ordenaras las columnas para que aquellas que se repitieran ( obviamente en dos tablas diferentes) quiere decir que forman una relación y la tercera cosa que te aconseje es que si querías ver más a partir de allí agregaras más columnas para afinarlo como lo quieres. Por ejemplo si el resultado del script fuera así:
Tabla columna constraint
A a1 Pk
B b1 Pk
B a1 Pk
C c1 Pk
C a1 pk
C b1 pk
A simple vista esto puede verse que ( en teoría) hay una relación entre A, B, ¿C
por los nombres de las columnas no? ( Cierto aunque sea en teoría ).
Si esto no te resulta porque no me mandas el script de la base de datos e intento sacártelo ( esto ya es extremo), eso si el script debe contener que constraints contiene la db.
Carmen me estas costanto un ojo de la cara, no importa la cantidad de tablas que contenga la base de datos, lo que creo es que algunas puedan ser temporales o sumarizadas, ¿no te preocupes de la cantidad de tablas total el problema es si esta bien organizada la base de datos ok?
Ci vediamo dopo
Jorge
Desde guatemala
Si lo malo es eso que la base de datos esta fatal organizada porque quien lo hizo por lo visto no tenia mucha idea de esto o no se en que estaba pensando.si quieres te mando el script aunque a mi si me preocupa la cantidad de tablas
Mi dirección de correo es
[email protected]
Bueno, el comentario de que no me preocupa la cantidad de tablas es porque he visto bases de datos com más de 300 tablas, etc, yo me dedico al datawarehouse y no al transaccional, y se aprende un poco, habría que ver la normalización que utilizaron, ¿bueno hasta ver el script saber ok?
Ciao
Jorge
Desde guatemala

3 respuestas más de otros expertos

Respuesta
1
Si deseas saber si dos tablas tienen una relación implementada (que no siempre es así), lo más fácil es acudir al SQL Enterprise Manager y seleccionar la tabla que desees de la base de datos donde se encuentre.
Una vez en ella, pincha con el botón derecho en la tabla y selecciona "Design table", en esta pantalla existen una serie de botones arriba, el antepenúltimo ("Manage relationship...") te da la información sobre relaciones con otras tablas.
También puedes ver las relaciones de una tabla con todo de una sola vez pulsando con el botón derecho sobre ella, seleccionando "All Tasks" y "Display Dependencies"
¿Si pero no podría coger y que me muestre la relación inmediata de todos las tablas? ¿Es qué tengo alrededor de 100 tablas e ir una por una es un poco coñazo no?
Gracias
Con la siguiente Query puedes ver la relación entre las tablas (sin saber los campos), modifícala a tu gusto con los "order by" o restricciones para ver lo que necesites.
SELECT SubString(nombre.name, 1, 30) AS 'Nombre de la Referencia',
SubString(origen. Name, 1, 30) AS 'Tabla Origen',
SubString(destino. Name, 1, 30) AS 'Tabla Destino'
FROM sysobjects AS origen, sysobjects AS destino,
sysobjects AS nombre, sysforeignkeys AS referencia
WHERE referencia.constid = nombre.id
AND referencia.fkeyid = origen.id
AND referencia.rkeyid = destino.id
Si necesitas ampliar la información y necesitas apoyo dímelo, veré de donde sacar lo que necesites.
¿Pero aquí simplemente se hace referencia a la relación que hay entre dos tablas solamente no? Es que la base de datos posee cerca de ciento y pico tablas y seria mucho más sencillo si huebiese una sentencia o un comando que me mostrara todas las dependencias (relaciones) de todas la tablas. Gracias.
La query te da las relaciones físicas entre TODAS las tablas.
Si la has ejecutado y no te da lo que esperas, quizás las relaciones no están creadas. Accede a una tabla que creas que tiene la relación y compruébala siguiendo los pasos que di inicialmente. Si no esta, es que las relaciones son lógicas, con lo cual tendrás que acudir a la documentación de quien creó la base de datos.
Lo malo de todo esto es que quien puede darme toda esa documentación no esta por la labor de ayudar y ya llevo un par de meses pidiéndole dicha relación pero no quiere.
¿La query que tu me has explicado se pone tal cual o ahí que adaptarla?
Gracias
La query se pone tal cual, bueno siempre y cuando estés en la base de datos que te interese.
¿Qué le pica al tio/a que realizó la base de datos? ¿Cree qué es dios/a y no se puede vivir sin el/ella?
¡ Estas cosas me ponen de los nervios !
Si necesitas una ayuda más profunda puedes contar conmigo para extraer los datos y la información que necesites directamente de la base de datos.
es un gilí... hablando mal y pronto! Es que resulta que esta un poco picao porque ya no vamos a trabajar más con ellos debido a que vamos a incorporar sap.
Osea que por eso no esta muy por la labor.
¿Bueno voy a probar y ahora te cuento ok?
Si es que hay cada uno...
Si prefieres seguir la conversación por e-mail, cierra esta consulta y escríbeme a:
[email protected]
¿Oye esta sentencia la podría ejecutar en access? Es por hacer una prueba! Es por no ir a donde tengo el sqlserver instalado, y hacerlo directamente en mi máquina con un pequeño ejemplo.
Claro que si, solo tienes que vincular las tablas que se usan:
- Sysobjects
- Sysforeignkeys
Y realizar la consulta.
¿Pero cómo las vinculo?
¿He probado a hacer la sentencia que me has dicho pero al ejecutarla me da un error en el from en sysforeignkeys porque puede ser?
Crea una conexión ODBC contra la base de datos:
- Inicio, Panel de control.
- NT: Orígenes de datos(ODBC)
- 2000: Herramientas administrativas/Origenes de datos(ODBC)
- Selecciona la pestaña "System DSN"
- Pulsa "Add..."
- Selecciona el driver de SQLServer
- Pon el nombre que desees y en la caja de "Server" el nombre o IP del servidor de base de datos.
- Pulsa "Siguiente".
- Selecciona la autentificación introducida por usuario.
- Introduce el usuario y la password.
- Pulsa "Siguiente".
- Cambia la base de datos a la cual te quieres conectar.
- Pulsa "Finalizar".
Crea una base de datos Access en blanco.
- En el menú selecciona "Archivo/Obtener datos externos/Vincular tablas..."
- Selecciona en "Tipo de archivo" "ODBC Databases"
- En la etiqueta "Machine Data Source" selecciona el nombre que diste en la conexión ODBC.
- Introduce el login y la password y pulsa en "Aceptar".
- Selecciona todas las tablas que deseas vincular y pulsa "Aceptar".
Creo que no me dejo nada, si tienes algún problema, dímelo.
¿E probado en el servidor donde tengo el sqlserver
pero al ejecutarla me da un error en el from en sysforeignkeys porque puede ser?
La consulta la he probado en mi SQLServer y funciona correctamente...
Envíame más datos (texto del error) para intentar saber el porque no te funciona.
Mira iñaki el mensaje es este:
msg 208, level 16, state 1
invalid object name 'sysforeignkeys'.
Ese es el dichoso mensajito.
¿?
No entiendo como no va a existir "sysforeignkeys" si existe en TODAS las bases de datos.
Conéctate a la base de datos que te interesa mediante el SQL Server Enterprise Manager y busca la tabla "sysforeignkeys" o cualquier otra tabla que empiece por "sys".
Si no ves ninguna, es que el usuario con que te has conectado no tiene privilegios para ver esas tablas (cosa curiosa porque casi siempre lo tiene). Si es así tienes que conectarte con algún usuario que tenga estos privilegios (administrador u otro creado explícitamente).
Por si acaso he ejecutado la consulta en un SQLServer 7.x (lo estaba haciendo en un SQLServer 2000) y también es correcta.
joba! Si lo curioso es que estoy como administrador!
No e ido a probar por eso ! Porque yo siempre entro como administrador osea que tengo todos los privilegios!
Esto es ya pa morirse!
¡¿?!
No entiendo nada. Es todo correcto.
Si quieres puedes crear un script de la base de datos:
- Botón derecho en la base de datos, "Todas las tareas" y "Generate SQL Scripts"
Y enviármelo al mail que te dí antes, yo me creo la base de datos y te envío lo que necesitas (si es que no desaparece la famosita tabla)
No se me ocurre otra solución.
Esto es de locos, no puede desaparecer esa tabla...
Respuesta
1
Si dispones de una versión de SQL Server 7.0 o posterior, lo puedes hacer a través del Enterprise Manager --> Database --> Tu Database -- > Diagrams. Con el botón derecho ubicas la opción "New Diagram" y listo, escoges las tablas y se hace un diagrama con las relaciones entre esas tablas.
Otra forma es desde el query analizer con el storte procedure sp_help <tabla>, la cual indica las propiedades de las tablas y sus relaciones, pero a modo texto.
Ambos métodos te sirve, el primero es gráfico y más entendible, el segundo es más preciso y te da más información
La version es la 6.5 osea que lo del diagrama nada de nada. Y lo de sp_help te indica las tablas que tenemos y poco más, el caso de poner sp_help y el nombre de la tabla no te discuto que te muestre las relaciones pero ir una por una teniendo en cuenta que hay 150 tablas más o menos, ¿creo qué no es plan no?
Hay herramientas de tercros que permiten hacer diagramas de BD. Yo utilizo el PowerDesing (funciona para SQL 6.4) que viene con el suite PowerBuilder. Pero he visto de otras casas, no se me ocurre una gratuita, pero tal vez en dowloand.com puedas ver algunas en la sección de utilitarios de SQL, SQL SERVER, Diagramas de BD, etc.
En www.microsoft.com/sqlserver, hay una sección de programas de terceros que resuelven problemas como el tuyo.
Respuesta
1
Si estas utilizando el analizador de consultas de sql server prueba con:
sp_help
Si no, tienes que anexar el sql dmo a tu proyecto para que con estos objetos vayas trabajando en la obtención de las listas. Checa la ayuda del MSDN en línea de microsoft ahí tiene buenos ejemplos y código de como realizar la conexión con el DMO.
e-mail: [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas