Jump to content

Criar Tabelas através de script que devolve as chaves


DarkAngelRev
 Share

Recommended Posts

Bom dia,

no ambito de um projecto pretendia arranjar uma maneira de através de um script de sql que já tenho que coloquei numa função que devolve todas as chaves estrangeiras de uma tabela, criar automáticamente todas as tabelas com as quais certa tabela tem relações...

alguém tem ideias?

Obrigado!

Link to comment
Share on other sites

Bom..normalmente o que se faz nesses casos é criar todas as tabelas, as relações e depois popular as tabelas (pela ordem necessária para não haver problemas) com dados que reflectem a lógica implementa pelas chaves estrangeiras....

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Link to comment
Share on other sites

pois mas neste caso tem de ser dinamicamente... porque a ideia é ser independente da base de dados... ou seja, dada uma base de dados, pretende-se criar uma "cópia" de algumas tabelas dessa base de dados, mas mantendo os relacionamentos... dai eu querer uma função/conjunto de funções que através das chaves estrangeiras crie todas as tabelas necessárias para criar as tabelas relacionadas...

Link to comment
Share on other sites

isso é para eu a partir dai tirar informações sobre os relacionamentos e chaves e etc... certo? eu já tenho um script que devolve as chaves todas dada uma tabela... agora a duvida e como acham que seria melhor agora fazer para criar as tabelas a partir das chaves... recomendam usar uma lista do género Artigo(tabelaX(tabelaY,TabelaZ), TabelaW) e depois usar algo recursivo? ou outra solução? se sugerem lista, como crio uma lista deste género em vb?

Link to comment
Share on other sites

Primeiro vais ter de criar um gerador de código T-SQL que mediante a informação retirada de uma tabela vai criar o seu respectivo script.

Deves criar classes com as devidas propriedades para receber toda a informação necessária para depois ser compilada num script.

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

Primeiro vais ter de criar um gerador de código T-SQL que mediante a informação retirada de uma tabela vai criar o seu respectivo script.

Deves criar classes com as devidas propriedades para receber toda a informação necessária para depois ser compilada num script.

No meu caso o que quero "duplicar" são todas as tabelas relacionadas com encomendas(CabecDoc) e todas as tabelas relacionadas com Clientes... se percebi o que disseste, sugeres neste caso a criação de duas classes (Clientes e Encomendas) cada uma com um método get... desculpa eu sou verdinho nestes aspectos... qual a vantagem das classes? já agora alguma vez trabalhaste com base de dados do primavera? é que para entender aquilo... :S desculpa estar a massacrar te, como crio o gerador de T-SQL?

Link to comment
Share on other sites

No meu caso o que quero "duplicar" são todas as tabelas relacionadas com encomendas(CabecDoc) e todas as tabelas relacionadas com Clientes... se percebi o que disseste, sugeres neste caso a criação de duas classes (Clientes e Encomendas) cada uma com um método get... desculpa eu sou verdinho nestes aspectos... qual a vantagem das classes? já agora alguma vez trabalhaste com base de dados do primavera? é que para entender aquilo... :S desculpa estar a massacrar te, como crio o gerador de T-SQL?

Não, o que eu cria dizer com as classes era, como por exemplo, uma tabela tem varias colunas, terias uma classe Coluna que seria algo deste genero

Public Class Tabela
    Public Property Name As String
    Public Property Shema As String
End Class

Public Class Coluna
    Public Property Name As String
    Public Property Type As TipoDeDados
    Public Property Lenght As Integer?
    Public Property Prec As Integer?
    Public Property Nullable As Boolean
End Class

Public Enum TipoDeDados
    int
    varchar
    nvarchar
    'etc.
End Enum

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

Pelo que percebi,  neste caso específico, as classe seriam essencialmente usadas para guardar as definições dos campos na base de dados, pese embora, pense que neste caso específico, a unica informação que precisas guardar mesmo é a definição das chaves para criares à posteriori, porque para criares uma tabela igual é bastante simples:

SELECT * INTO NewTable FROM OldTable WHERE 1=0

por exemplo...deve criar-te a estrutura igualzinha...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Link to comment
Share on other sites

Não, o que eu cria dizer com as classes era, como por exemplo, uma tabela tem varias colunas, terias uma classe Coluna que seria algo deste genero

Public Class Tabela
    Public Property Name As String
    Public Property Shema As String
End Class

Public Class Coluna
    Public Property Name As String
    Public Property Type As TipoDeDados
    Public Property Lenght As Integer?
    Public Property Prec As Integer?
    Public Property Nullable As Boolean
End Class

Public Enum TipoDeDados
    int
    varchar
    nvarchar
    'etc.
End Enum

hum... estou a ver... pois eu estava a esquecer me do pormenor ou neste caso do "pormaior" das tipos de dados... vou debruçar-me um pouco sobre isto e tentar fazer.. porque como disse sou verdinho nisto... dentro de dias darei noticias... Obrigado a todos...

Link to comment
Share on other sites

Pelo que percebi,  neste caso específico, as classe seriam essencialmente usadas para guardar as definições dos campos na base de dados, pese embora, pense que neste caso específico, a unica informação que precisas guardar mesmo é a definição das chaves para criares à posteriori, porque para criares uma tabela igual é bastante simples:

SELECT * INTO NewTable FROM OldTable WHERE 1=0

por exemplo...deve criar-te a estrutura igualzinha...

A ideia disto é criar um web service para fazer integração com o primavera de forma a que através de um catálogo de produtos criado no primavera, se consigo disponibilizar isto para criar uma loja online... mas pretende-se uma réplica da parte dos clientes e encomendas da bd no lado do cliente para não estar a inserir dados desnecessários na bd da empresa (BD do primavera) para depois apenas sincronizar com o primavera os registos que a empresa considerar que devem ser adicionados a bd da empresa... O porque de não fazer eu exactamente a cópia das tabelas necessárias, é que a empresa pretende tornar isto independente do ERP.. para mais tarde se tiverem um cliente com outro ERP que não o primavera, poderem usar este serviço à mesma...

não sei se dá para perceber, provavelmente está um pouco confuso...

Link to comment
Share on other sites

Pois.. mas de qualquer modo, se quiseres fazer uma coisa independente, tens tu que definir que estrutura de dados queres usar, e depois carregar os dados que te interessarem... de outro qualquer sistema. Caso contrário andarás sempre a reboque ;-)

E provavelmente dá-te menos trabalho definir uma query para carregar as tuas tabelas que estares a actualizar parte do teu site...loja...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Link to comment
Share on other sites

Pois.. mas de qualquer modo, se quiseres fazer uma coisa independente, tens tu que definir que estrutura de dados queres usar, e depois carregar os dados que te interessarem... de outro qualquer sistema. Caso contrário andarás sempre a reboque ;-)

E provavelmente dá-te menos trabalho definir uma query para carregar as tuas tabelas que estares a actualizar parte do teu site...loja...

pois a questão é que isto é no âmbito de um projecto de final de curso.. e o orientador da empresa teimou que queria isto assim... foi ele próprio a dizer que queria que através dos relacionamentos criar as tabelas... mas de todo o caso a solução que referiste em cima parece me ser bastante útil.. desconhecia por completo... com isso que referiste só falta mesmo depois tratar os relacionamentos..

edit: além disso o projecto é apenas o web service não a aplicação cliente (loja online)

Link to comment
Share on other sites

Como é o script que estás a utilizar?

SELECT CONSTRAINT_NAME = REF_CONST.CONSTRAINT_NAME, 
TABLE_NAME = FK.TABLE_NAME, 
COLUMN_NAME = FK_COLS.COLUMN_NAME, 
REFERENCED_TABLE_NAME = PK.TABLE_NAME,
REFERENCED_COLUMN_NAME = PK_COLS.COLUMN_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS REF_CONST 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
	ON REF_CONST.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG
        AND REF_CONST.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA
        AND REF_CONST.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
        AND FK.CONSTRAINT_TYPE = 'FOREIGN KEY'
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
        ON REF_CONST.UNIQUE_CONSTRAINT_CATALOG = PK.CONSTRAINT_CATALOG
        AND REF_CONST.UNIQUE_CONSTRAINT_SCHEMA = PK.CONSTRAINT_SCHEMA
        AND REF_CONST.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
        AND PK.CONSTRAINT_TYPE = 'PRIMARY KEY'
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK_COLS
        ON REF_CONST.CONSTRAINT_NAME = FK_COLS.CONSTRAINT_NAME
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK_COLS
        ON PK.CONSTRAINT_NAME = PK_COLS.CONSTRAINT_NAME
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.