DarkAngelRev Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
José Lopes Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
Caça Posted March 19, 2012 Report Share Posted March 19, 2012 Podes extrair toda a informação de um determinado objecto utilizando o sp_help EXEC sys.sp_help 'NomeDoObjecto' Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
Caça Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
José Lopes Posted March 19, 2012 Report Share Posted March 19, 2012 Mas a chave estrangeira só te diz que existe um relacionamento...é a partir daí que identificas que essa tabela é para duplicar??? Em que SGBD estas a trabalhar? Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!! Link to comment Share on other sites More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 Mas a chave estrangeira só te diz que existe um relacionamento...é a partir daí que identificas que essa tabela é para duplicar??? Em que SGBD estas a trabalhar? sim... estou a trabalhar em sql server.. Link to comment Share on other sites More sharing options...
Caça Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
José Lopes Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
Caça Posted March 19, 2012 Report Share Posted March 19, 2012 No entanto desconhecia a sugestão do @José Lopes que já te tira muito trabalho. Neste caso isso já não era necessário. Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
José Lopes Posted March 19, 2012 Report Share Posted March 19, 2012 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 More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
Caça Posted March 19, 2012 Report Share Posted March 19, 2012 Como é o script que estás a utilizar? Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
DarkAngelRev Posted March 19, 2012 Author Report Share Posted March 19, 2012 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 More sharing options...
DarkAngelRev Posted March 20, 2012 Author Report Share Posted March 20, 2012 Mais uma questão... :s alguém sabe uma maneira de através do sqlbulkcopy se na base de dados de destino não existir nenhuma tabela esta ser automaticamente criada? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now