[SQL] Constraints disablen, data importeren en weer enablen*

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

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
In een java app die gebruik maakt van SQL Server 2005 zou ik data moeten gaan importeren adhv csv files.. ik doe het zo

1/ Eerst een aantal foreign keys uitschakelen omdat de data er anders nooit ingeraakt
2/ De data importeren
3/ De uitgezette foreign keys weer inschakelen

Tot en met stap 3 gaat het gaat maar bij 3 loop het mis,.. daar krijg ik de fout dat de fk die ik terugaanmaak in conflict ligt met een foreign key met dezelfde naam, dus het ziet er naar uit dat hij hem niet als "verwijderd" ziet..

het uitzetten en terug activeren van de foreign keys doe ik dmv drop en met alter table add foreign key...

in Oracle disable en enable ik de FK's maar heb het nog niet gevonden in SQL server hoe het daar werkt..

Allessinds ik kan er gewoonweg niet meer aanuit, waarom ziet sql server die verwijderde FK's nog niet, heeft dit te maken met het feit dat dit pas gebeurd na een commit ofzo? maar dat lijkt me sterkt..

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik neem aan dat je constraints bedoelt in plaats van FK's?
En waarom insert je de data uberhaupt niet gewoon dusdanig dat de comstraints kunnen blijven bestaan? Wat je nu doet (en dat is dus vanaf punt 1) vind ik wel heel erg lomp en er is IMHO maar zelden een excuus om deze methode te gebruiken. Die constraints zijn er natuurlijk niet voor niets ;)
bibawa schreef op donderdag 24 mei 2007 @ 21:43:
Allessinds ik kan er gewoonweg niet meer aanuit, waarom ziet sql server die verwijderde FK's nog niet, heeft dit te maken met het feit dat dit pas gebeurd na een commit ofzo? maar dat lijkt me sterkt..
Dat is met een paar regels SQL natuurlijk zo getest ;)

SQL:
1
2
3
4
5
6
7
8
9
BEGIN TRANSACTION

ALTER TABLE [dbo].[Table_A] DROP CONSTRAINT [FK_Table_A_Table_B]
ALTER TABLE [dbo].[Table_B] DROP CONSTRAINT [PK_Table_B]

ALTER TABLE [dbo].[Table_B] ADD CONSTRAINT [PK_Table_B] PRIMARY KEY  CLUSTERED ([id])  ON [PRIMARY] 
ALTER TABLE [dbo].[Table_A] ADD CONSTRAINT [FK_Table_A_Table_B] FOREIGN KEY ([fk]) REFERENCES [Table_B] ([id])

COMMIT TRANSACTION

Dat werkt hier gewoon :?

[ Voor 67% gewijzigd door RobIII op 24-05-2007 21:57 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
ja ik heb de databank niet ontworpen en er liggen tussen 2 tabellen 2 relaties hoe het komt dat ze er liggen weet ik ook niet :d

  • geforce5_guy
  • Registratie: December 2001
  • Niet online
Kijk naar de volgorde van het inserten van de gegevens.

SERVER A doet eerst tabel A en dan B
dan die je op de andere eerst B en dan A

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
bibawa schreef op donderdag 24 mei 2007 @ 21:54:
hoe het komt dat ze er liggen weet ik ook niet :d
Hoe het komt is waarschijnlijk omdat iemand ze gemaakt heeft ;)
Waarom het zo is zou je aan diegene moeten vragen of moeten kunnen afleiden uit het datamodel ;)

Maar dan geldt mijn standpunt nog steeds: waarom drop je die constraints uberhaupt? Waarom maak je niet eerst netjes de FK records om vervolgens de bijbehorende records te inserten?
geforce5_guy schreef op donderdag 24 mei 2007 @ 21:57:
Kijk naar de volgorde van het inserten van de gegevens.

SERVER A doet eerst tabel A en dan B
dan die je op de andere eerst B en dan A
Da's mijn post ;) En daar wordt niets in ge-insert maar daar worden constraints gedropped en weer aangemaakt binnen een transactie ;)

[ Voor 27% gewijzigd door RobIII op 24-05-2007 22:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • geforce5_guy
  • Registratie: December 2001
  • Niet online
RobIII schreef op donderdag 24 mei 2007 @ 21:59:
[...]

Hoe het komt is waarschijnlijk omdat iemand ze gemaakt heeft ;)
Waarom het zo is zou je aan diegene moeten vragen of moeten kunnen afleiden uit het datamodel ;)

Maar dan geldt mijn standpunt nog steeds: waarom drop je die constraints uberhaupt? Waarom maak je niet eerst netjes de FK records om vervolgens de bijbehorende records te inserten?

[...]

Da's mijn post ;) En daar wordt niets in ge-insert maar daar worden constraints gedropped en weer aangemaakt binnen een transactie ;)
Als de de contraints er af zijn. Loop je het risico dat het mis kan gaan als er ook op de database word gewerkt waar je tijdelijk die contraints er af haalt.. Die contraints zijn er niet voor niets op.
Wat je kan doen is kijken naar SQLBulkCopy die kan je bepaalde regels laten negeren.

SQLBulkcopy is onderdeel van het .net framework.
Dit werkt alleen voor inserts.

Verwijderd

bibawa schreef op donderdag 24 mei 2007 @ 21:43:
1/ Eerst een aantal foreign keys uitschakelen omdat de data er anders nooit ingeraakt
2/ De data importeren
3/ De uitgezette foreign keys weer inschakelen

Tot en met stap 3 gaat het gaat maar bij 3 loop het mis,.. daar krijg ik de fout dat de fk die ik terugaanmaak in conflict ligt met een foreign key met dezelfde naam, dus het ziet er naar uit dat hij hem niet als "verwijderd" ziet..
...
Allessinds ik kan er gewoonweg niet meer aanuit, waarom ziet sql server die verwijderde FK's nog niet, heeft dit te maken met het feit dat dit pas gebeurd na een commit ofzo? maar dat lijkt me sterkt..
Misschien komt het, omdat de database, tabellen, fk's gebruikt worden door een andere gebruiker?
Het is verstandig om een commit te doen na metadata veranderingen, voordat je daadwerkelijk met de data aan de slag gaat.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hoe importeer je die csv files ? Doe je dit met BULK INSERT ?
Hoe enable / disable je de constraints ? Is het disablen, of is het droppen / recreaten ?

https://fgheysels.github.io/


Verwijderd

Oracle kent daar 'direct path' voor, waarmee je in essentie direct tabellen aan het schrijven bent. Een korte search via google gaf mij geen resultaat of iets dergelijks ook voor SQL Server beschikbaar is. Maar ik heb dan ook niet echt lang gezocht.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 01-12 15:17

lier

MikroTik nerd

Wordt er veel data manipulatie gedaan ? Anders is het misschien veel interessanter om gebruik te maken van DTS. Kan je uberhaupt aangeven waarom je hiervoor een Java client probeert in te zetten ?

Eerst het probleem, dan de oplossing


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 20:47
Bulk Insert doet standaard niks met constraints.

Als je INSERT .. SELECT ... gebruikt kun je tablehints gebruiken.

http://msdn2.microsoft.com/en-us/library/ms186247.aspx
Pagina: 1