adodb: удаление всех constraints
noisette
Дата: 25.11.2006 21:57:00
господа, подскажите, как с помощью adodb одним махом удалить все constraints из базы данных?
Alexander G
Дата: 26.11.2006 08:48:19
С чистым ADO (ADODB) вы этого не сделаете, тут нужно пользовать библиотеку ActiveX Data Objects Extensions (ADOX). Там копайте объекты Key и Index (не знаю, что из них вы имели в виду, упоминая предложение CONSTRAINT)
noisette
Дата: 26.11.2006 11:20:13
Alexander G, спасибо, покопаюсь. Я хочу удалить все связи между таблицами в двух десятках пользовательских копий базы (не знаю, что там есть, что удалено, что создано потом), чтобы прописать все связи заново. А "праймари ки" все хочу оставить.
Shuhard
Дата: 26.11.2006 12:13:37
примерно так:
MyCat As ADOX.Catalog
'======================= внешние ключи ==============
For Each Mytable In MyCat.Tables
If Mytable.Type = "Table" Then
Set MyAmbar = New Collection
For Each MyKey In Mytable.Keys
If MyKey.Type = adKeyForeign Then
MyAmbar.Add MyKey.Name
End If
Next MyKey
For Each MyPoint In MyAmbar
Mytable.Keys.Delete MyPoint
Next MyPoint
Set MyAmbar = Nothing
End If
Next Mytable
noisette
Дата: 26.11.2006 13:20:23
Shuhard, спаибо!
господа, прошу прощения за неточность: я хотел бы знать, как убить все связи между таблицами посредством sql. дело в том, что, например, dao.relation связи считать считает, а при попытке удалить, ругается, мол нет такой в коллекции и связь остается неудаленной. drop constraint требует имени связи и убивает только одну. или я не все знаю? а как все сразу?
Alexander G
Дата: 26.11.2006 14:41:31
В DAO это примерно так:
Dim rel As DAO.Relation
Dim dbs As DAO.Database
Dim fld As DAO.Fields
Set dbs = CurrentDb
For Each rel In dbs.Relations
dbs.Relations.Delete rel.Name
Next
Alexander G
Дата: 26.11.2006 14:42:32
fld ни к к чему, извиняюсь
noisette
Дата: 26.11.2006 15:10:09
Alexander G, спасибо. я это знаю, но, как написал выше, машина ругается, мол, нет в коллекции такого relation, если я использую for i=1 to db.relations.count, или просто игнорирует, если
пишу
dim rel as variant
for each rel in db.relations
Alexander G
Дата: 27.11.2006 00:29:59
1.
Dim rel As DAO.Relation
....
Для этого варианта нужно было подключить библиотеку DAO
2. Без подключения библиотеки DAO
Dim rel As Object
Dim dbs As Object
Set dbs = CurrentDb
Do While dbs.Relations.Count > 0
For Each rel In dbs.Relations
dbs.Relations.Delete rel.Name
Next
Loop
noisette
Дата: 27.11.2006 08:32:36
Alexander G, а зачем "внешний" цикл do while? по идее ведь должны все объекты в коллекции убиваться с "первого захода". Нет?
Экспериментально я уже убедился, что все работает корректно (у меня все было ровно также, но без цикла do while).
и хочу я все же понять, а средствами SQL можно подсчитать связи и, обратившись к каждой (если мы не знаем предварительно ни их числа, ни их имен!), удалить их?