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 можно подсчитать связи и, обратившись к каждой (если мы не знаем предварительно ни их числа, ни их имен!), удалить их?