[MS-SQL + Delphi] db zichzelf laten kopieëren

Pagina: 1
Acties:
  • 148 views sinds 30-01-2008
  • Reageer

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Hoi,

Voor een programma moet een read-only database zichzelf kopieëren met een andere bestandsnaam met het voorvoegsel begr_ . Deze database moet vervolgens wel te wijzigen zijn.

Bijv. In het programma wat in delphi geschreven is wordt een nieuw project aangemaakt. Op het moment dat het project aangemaakt wordt moet een nieuwe db aangemaakt worden die gekopieërd wordt van een bestaande db (zie het maar als een template zeg maar.)

Hoe werkt dit ongeveer? Zijn hier in MSSQL stored procedures voor?

[ Voor 5% gewijzigd door whitecom op 29-03-2004 11:03 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Welke DB ? Een MS SQL db kopieëren?

Je kunt eens kijken naar de SP's sp_detach en sp_attach, en hoe je de *.mdf files kunt kopieeren en daarna kunt attachen.

Ik vind het trouwens wazig dat je een bestaande DB als 'template' oid wilt gaan gebruiken?

Je kunt misschien ook eens naar de model DB kijken, dit is de 'template' die als basis gebruikt wordt bij het maken van een nieuwe DB in Sql Server.

https://fgheysels.github.io/


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Nou kijk we hebben zeg maar een lege db met 5 tabellen met kolomnamen.
Daar kan vanuit ons programma naar geschreven worden.

Maar voor ieder project heb je een nieuwe db nodig met dezelfde kolomnamen en tabellen dus leek het ons meer dan logisch om een lege standaard db met die kolomnamen en tabellen te kopieëren en er dan een andere naam aan mee te geven.

en vervolgens met die nieuw aangemaakte database te werken

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Mjah, je kan ook een SQL scriptje maken waarmee je die 5 tabellen en hun relaties enzo mee gaat gaan maken, en bij het starten van een nieuw project, creeër je een nieuwe DB, en voer je dat scriptje uit.

https://fgheysels.github.io/


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik heb die Stored proc. bekeken, ik kom er niet helemaal uit.
Die sp_attach_db sp. is iets anders dan het kopieëren van een db, geloof ik.


En in het geval van scripten: Het gaat hier om een database die redelijk groot is
er zou een script geschreven moeten worden wat echt een aanzienlijke grootte zou hebben, daar zou echt veel tijd in zitten. En wij hebben hier altijd te weinig tijd. :)

Volgens mij is het nog best ingewikkeld
ik zit hier die sql books door te pluizen maar ik kom er echt niet uit :S

  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Staat er in de template ook data? Of is het alleen de db-structuur?

Script kun je trouwens automagisch extracten van een bestaande tabel (Generate SQL Script).
Kan zelfs met data volgens mij :)

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Als je een kopie wilt maken van de DB - files (*.mdf, *.ldf, *.ndf), dan zal je eerst je DB moeten detachen, dan je kopies maken, en dan je DB - files attachen aan het DBMS.

Het maken van zo'n script kost niet zoveel tijd en moeite hoor, zeker als je de (template)DB al staan hebt: Sql Server kan nl. een 'create-' scriptje voor je genereren. Enkele muisklikken, en enkele seconden wachten en je hebt 't.

https://fgheysels.github.io/


Verwijderd

kijk anders even naar MS-DMO, microsoft distributed management objects. Hiermee kan het zeker...lekker makelijke com interface

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
@ SysRq: Er is een tabel waar 7 records vast in staan en de rest v.d. tabellen zijn standaard leeg


@whoami: Dat detach en attach aanroepen vanuit Delphi geeft geen foutmelding, maar er gebeurd verder ook niks op de SQL-server :S

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Heb je detach aangeroepen, en direct erna attach?

Trouwens, ik denk dat het laten generern van zo'n scriptje de makkelijkste oplossing is hoor. Het vergt vrijwel geen tijd om het te maken, en bij het maken van een nieuw project is het uitvoeren van dat scriptje nu ook weer niet zo'n lastig karwei.

https://fgheysels.github.io/


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Bij het detachen zul je ook niet veel merken denk ik. Dat is gewoon uw DB 'loskoppelen' . Alle data die nog in het geheugen zouden zitten worden dan mooi gekopieerd naar uw HDD zodat je geen gegevensverlies hebt. Wanneer je dat dus gedaan hebt, kun je je uw database files kopieeren. Een detachete database moet je opnieuw attachen om hem opnieuw te kunnen gebruiken.

En ik vindt een oplossing met scriptjes toch ook veel mooier en professioneler. Bovendien neemt het ook niet zoveel plaats in beslag.

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Volgens mij heb je nog niet naar Generate SQL script gekeken. Je kunt via een script nl de database/tabellen/records creëren. Het script vervolgens met Delphi uitvoeren, en voilá :)

-


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik heb een script gemaakt :)

Ik loop er nu ff doorheen, maar ik zie wel dat er nu een vast db naam aan wordt meegegeven

hoe moet ik dat dan in delphi wijzigen?
een gebruiker mag zelf een naam verzinnen voor de gecreërde db, moet ik dan in dat sql script zoeken naar een stukje string en die runtime wijzigen opslaan en uitvoeren??

code:
1
2
3
4
5
6
7
8
9
CREATE DATABASE [begr_test]  ON (NAME = N'begr_test_dat', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\begr_test.mdf' , SIZE = 3, FILEGROWTH = 10%) LOG ON (NAME = N'begr_test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\begr_test.ldf' , SIZE = 3, FILEGROWTH = 10%)
 COLLATE Latin1_General_CI_AS
GO

exec sp_dboption N'begr_test', N'autoclose', N'false'
GO

exec sp_dboption N'begr_test', N'bulkcopy', N'true'
GO


Kijk waar begr_test staat moet dus een door de gebruiker ingevulde naam komen
En dat db path moet verwijzen naar de standaard database zeker? Ik snap het nog niet 100% iig, maar ik ben wel een stuk op weg

[ Voor 60% gewijzigd door whitecom op 29-03-2004 13:32 ]


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Precies, vervang éénmaal de db-naam door bijvoorbeeld :databasename oid. Vervolgens met een stringreplace vervangen. :)

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Ik zou een script maken die enkel de nodige tabellen creeërt in de databank die jij 'actief' maakt.

https://fgheysels.github.io/


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
[code]
CREATE DATABASE [begr_test] ON (NAME = N'begr_test_dat', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\begr_test.mdf'
[\code]

dan gaat het script dus uit van begr_test.mdf?

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Nee, je script bestaat gewoon uit een aantal CREATE TABLE en ALTER TABLE statements, en bevat geen CREATE DATABASE statement.

Je maakt je DB gewoon via de Enterprise manager, en in Query Analyzer laadt je dat scriptje op. Je zet bovenaan 'USE databasenaam', en je voert het script uit.

Er komt dus wel nog wat manueel werk bij kijken, maar 't gaat snel. IMO weegt het automatiseren van iets dergelijks niet op tegen het aantal keer dat je het gaat gebruiken.

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Is het niet handiger als je de database wel met een create database aanmaakt? Je kun toch gewoon met een stringreplace iedere verwijzing aanpassen naar de nieuwe databasenaam?

-


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 09:42

gorgi_19

Kruimeltjes zijn weer op :9

SysRq schreef op 29 maart 2004 @ 13:54:
Is het niet handiger als je de database wel met een create database aanmaakt? Je kun toch gewoon met een stringreplace iedere verwijzing aanpassen naar de nieuwe databasenaam?
* gorgi_19 denkt het ook; dmv Generate Script in EM te gebruiken heb je min of meer al een complete database. Je moet 1x een template maken. Dmv Find / replace kan je hem dan heel makkelijk aanpassen en in QA gebruiken.

Evt. kan je het script ook als template gebruiken en dmv een stukje code automatisch de juiste db te laten aanmaken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
Hmmm, wat als je in 't ene geval een DB creeërt waarvan je verwacht dat ie veel groter zal zijn, en sneller zal groeien dan de DB die je voor het vorige project hebt aangemaakt?
Dan moet je in je scriptje ook nog eens het aantal MB ruimte dat gealloceerd wordt voor de DB gaan veranderen, moet je de 'growth ratio' ed ook gaan veranderen, etc...

https://fgheysels.github.io/


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
@ whoami: Ok, maar manual werk? Het moet dus voor de eindgebruiker volledig geautomatiseerd zijn, de mensen die met dit programma gaan werken moeten alleen een project naam invullen en ze moeten kunnen werken.

Het moet niet zo zijn dat ze handmatig taken moeten gaan verrichten met de enterprise manager.

Het is toch zo dat ik het script in een query component gooi en dat uitvoer dat het ok is? ik geef in dat sql-statement gewoon een variabele db-naam mee zoals SysRq zegt.

Dan gaat het toch automatisch?

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
whitecom schreef op 29 maart 2004 @ 14:00:
@ whoami: Ok, maar manual werk? Het moet dus voor de eindgebruiker volledig geautomatiseerd zijn, de mensen die met dit programma gaan werken moeten alleen een project naam invullen en ze moeten kunnen werken.
Eindgebruikers?
Ik dacht dat je die 5 tabellen voor ieder nieuw project (als in applicatie die jullie ontwikkelen) nodig had?
Waarom maak je per project dan voor de eindgebruiker dan een nieuwe DB aan?
Kan je dat niet anders oplossen, door bv. een nieuw record te maken in een 'Project - tabel' in je DB, etc... ?

https://fgheysels.github.io/


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
@Whoami: Ja maar die 5 tabellen worden voor ieder project gevuld met data, het werkt met een bepaald niveausysteem ik kan het je niet helemaal uitleggen,

kijk maar op http://people.zeelandnet.nl/pdewitte/

let niet op de gui maar misschien begrijp je het idee.


Misschien begrijp ik je compleet verkeerd :S

  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
whoami bedoelt dat je bij die 5 tabellen een primaire sleutel "projectid" toe kan voegen. Vervolgens maak je een tabel projecten en je bent er. (op een heel wat makkelijker en eenvoudiger manier ) :)

/edit en die screens maken het niet echt duidelijk op ;)

[ Voor 16% gewijzigd door SysRq op 29-03-2004 14:31 ]

-


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik snapwel dat er een tabel project o.i.d bijgezet kan worden, maar jullie denken volgens mij te veel volgens de tradionele relationele database theorie.

Wat jullie zeggen klopt wel maar is voor ons niet werkbaar:

In het kader van performance (grootte tabellen: 6000 + records per tabel, per begrotingsproject), onderhoudbaarheid(overzichtelijkheid) en scheiding van begrotingsprojecten willen wij voor ieder begrotingsproject een aparte db genereren met daarin de basistabellen.

Kortom, we hebben een default database met de default (deels gevulde) tabellen, die we willen kopieren. En daar gaat het nu om, hoe kopieren we de default database naar een nieuwe database voor een nieuw begrotingsproject ?

  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
6000 records? :) Dat is niet veel hoor. Ik werk vaak met tabellen met meer dan 10000000 records (statistiek e.d.) en begin nu een beetje vertraging te merken. Als je zorgt dat je query's goed geoptimaliseerd zijn heb je nergens last van. :)

Mocht je het toch met meerdere db's willen doen: er zijn hierboven volgens mij voldoende oplossingen aangedragen toch?

[ Voor 4% gewijzigd door SysRq op 29-03-2004 15:17 ]

-


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
whitecom schreef op 29 maart 2004 @ 15:12:
Ik snapwel dat er een tabel project o.i.d bijgezet kan worden, maar jullie denken volgens mij te veel volgens de tradionele relationele database theorie.

Wat jullie zeggen klopt wel maar is voor ons niet werkbaar:

In het kader van performance (grootte tabellen: 6000 + records per tabel, per begrotingsproject), onderhoudbaarheid(overzichtelijkheid) en scheiding van begrotingsprojecten willen wij voor ieder begrotingsproject een aparte db genereren met daarin de basistabellen.
6000 records? Dat is peanuts. Ik werk momenteel op een RDB waarbij de 'grootste' tabel momenteel ongeveer 4.100.000 records bevat.

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
tss, whoami is 1337... :+ Daar zit ik dan met m'n 1.200.000 record's :'(

@whitecom: dmv filtering op projectid (zit in de index) heb je echt geen performanceverschil :)

[ Voor 6% gewijzigd door SysRq op 29-03-2004 15:28 ]

-


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik ben een beginner he, wat voor jullie peanuts is .... kan voor iemand anders nog wel ingewikkeld zijn :)

Mij lijkt het overzichtelijker als ik voor ieder project met een nieuwe database begin. En in een van die tabellen zit een codering die uniek moet zijn, je kunt dus niet twee projecten in een tabel neerzetten omdat er dan dezelfde elementen meerdere keren voorkomen dit mag niet.

Bijv. je hebt laag ca1 t/m ca7 hier zit een bedrag aan gekoppeld. maar die laag is bij ieder project ca1 t/m ca7 dus zodra je dat in een tabel zou moeten onderbrengen zou dat onoverzichtelijk worden en zouden waarden verkeerd uitgelezen kunnen worden.

Ik heb nu een boek besteld om Microsoft Certified SQL engineer te worden. Ik hoop dat dat ook wat zal helpen :) :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:06
whitecom schreef op 29 maart 2004 @ 15:31:
Mij lijkt het overzichtelijker als ik voor ieder project met een nieuwe database begin. En in een van die tabellen zit een codering die uniek moet zijn, je kunt dus niet twee projecten in een tabel neerzetten omdat er dan dezelfde elementen meerdere keren voorkomen dit mag niet.
Volgens mij ga je je hetzelf op die manier enkel maar moeilijker maken. Je kunt ook uniqueness afdwingen op een combinatie van velden.

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
whitecom schreef op 29 maart 2004 @ 15:31:
Bijv. je hebt laag ca1 t/m ca7 hier zit een bedrag aan gekoppeld. maar die laag is bij ieder project ca1 t/m ca7 dus zodra je dat in een tabel zou moeten onderbrengen
Dus een veld projectid toevoegen :) Die vervolgens samen met laag de primary key (dus uniek) is. Kun je daarna met sql filteren: (where projectid = :projectid)
Ik heb nu een boek besteld om Microsoft Certified SQL engineer te worden. Ik hoop dat dat ook wat zal helpen :) :)
Succes! ;)

-


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Wij gaan uit van een bestaand dosprogramma wat wij in nu opnieuw in windows-omgeving programmeren en hebben de manier waarop dat programma met zijn db werkt overgenomen.

Het werkt met Dbase 5 en creeërt iedere keer voor ieder project een nieuwe db, onze opdrachtgever wilt dat wij dit zo houden, dus we zijn niet helemaal vrij in ons doen en laten

@SysRq: Thnx het zal nog wat worden met dat leren, dit project is in het kader van onze eindstage en we hebben al zo ontzettend veel geleerd en we blijven iedere dag weer bijleren. Ik hoop dat ik aan het eind van deze stageperiode dan ook redelijk wat verstand van sql server 2000 heb :)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Heb je een dedicated server tot je beschikking? Zo ja, dan zou je ervoor kunnen kiezen om de tabellen met de standaard data in de database model op te nemen. Als je vervolgens een CREATE DATABASE doet, neemt ie automatisch alle tabellen met hun data over van de model database.

Een ander alternatief om relatief eenvoudig een database te "copy-pasten" is om via een sql statement een BACKUP te doen en vervolgens een restore naar een andere naam. Als je even in Books Online kijkt, ben je er waarschijnlijk zo achter hoe het moet.
En anders moet je het één keertje via de Enterprise Manager simuleren, terwijl je de Profiler hebt draaien. Daarin kun je dan precies zien welke queries er uitgevoerd worden en dan hoef je alleen nog maar de variabelen erin te zetten.

Houd je trouwens wel rekening met de security, want om een database aan te maken, heb je nogal wat rechten nodig binnen SQL Server en misbruik komt zo wel dichter bij.

Never underestimate the power of

Pagina: 1