Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сгенерить скрипт не через EM? / 24 сообщений из 24, страница 1 из 1
23.08.2001, 06:49
    #32012610
Denniz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Я что-то не нашел (или не там искал?) - как в ms sql 7.0 не
прибегая к помощи EM сгенерить скрипт какого-либо объекта
в базе?
...
Рейтинг: 0 / 0
23.08.2001, 07:08
    #32012612
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Можно через SQL-DMO, а вот пользуясь только T-SQL, насколько я знаю, не получится. Можно отдельно выдернуть скрипты из системных таблиц, но записывать их в batch-файл в нужном порядке придется самому.
Если кто-то знает, как обойтись только T-SQL, напишите, плз. Меня этот вопрос тоже очень интересует
...
Рейтинг: 0 / 0
23.08.2001, 07:36
    #32012620
BiSas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Для GreenSunrise

Помоему всю информацию можно вытащить через системные таблицы.
Например Тексты процедур, View, функции и т.д. и т.п. есть в таблице syscomments.
Script по созданию таблицы можно сгенерить по информации из sysobjects, syscolumns, systypes, sysindexes.
Ну и т.д.

Я лично так и поступаю. Потому что чтобы использовать DMO на клиенте, то его надо сперва туда установить. А на сервере вызывать OLE объекты через хранимые процедуры, что-то боязно. Я пробовал, все работает, но я не понимаю четко механизма работы и поэтому не знаю что там происходит в случае различных ошибок. Вследствие этого боюсь замусорить память на сервере.
...
Рейтинг: 0 / 0
23.08.2001, 11:37
    #32012680
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2BiSas:

Это понятно, что всю информацию можно выдернуть из системных таблиц - проблем нет. Основные вопросы начинаются, когда надо сгенерить скрипт не только для самого объекта, но и для зависящих от него других объектов. К примеру, чтобы родительская таблица создавалась прежде дочерних; процедуры только после того, как все участвующие в них объекты уже созданы и т.д. Не так просто сваять полноценный скрипт для базы в целом, чтобы он отрабатывал все действия правильно.

А по отдельности - это не вопрос...
...
Рейтинг: 0 / 0
23.08.2001, 11:50
    #32012683
Denniz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2GreenSunrise Да, ты прав - основной геморой это связь и последовательность

А можно подробнее про SQL-DMO - как с ним работать, что для этого
нужно и как сгенерить скрипт... данная задача будет заведомо работать только на сервере.
...
Рейтинг: 0 / 0
23.08.2001, 12:24
    #32012686
BiSas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Согласен, да это геморрой.
Но если хочется, то можно сделать.
Зависимости кажется можно выяснить по таблице sysdepends.
А может я не прав. В этом направлении я не работал.
...
Рейтинг: 0 / 0
23.08.2001, 12:26
    #32012687
Pandre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Для хранимых процедур, view и тригеров скрипт генериться процедурой
sp_helptext obj_name
Для таблиц информацию выдает
sp_help, но в сложных случаях придется лезть в системные таблицы.
Что касается References, то их как и триггеры, процедуры и view надо создавать после создания таблиц. Зависимости между объектами (кроме таблиц) храниться в sysdepends. Задача не тривиальная, хотя, повидимому, сводиться к построению дерева.
...
Рейтинг: 0 / 0
23.08.2001, 12:49
    #32012689
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Да я только теоретически знаю, что так можно. См. BOL: Contents->Creating and Maintaining Databases->Databases->Documenting and Scripting Databases.
В конце статьи есть ссылки как сгенерить скрипт, пользуясь EM или SQL-DMO. Там точно также выставляются флажки, что вносить в скрипт (триггера, констрейнты, индексы...), и флажок "скриптовать зависимые объекты" тоже есть.

sp_help выдает информацию в виде нескольких recordset'ов, а не скрипта, так что не слишком удобно, хотя ее и можно поставить на службу отечеству

А насчет вытаскивания информации из системных таблиц... Там много чего тащить надо. Например, для скрипта одной единственной таблицы нужно тащить информацию из sysobjects, syscolumns, syscomments (там хранятся default'ы для колонок, тексты триггеров, вьюх, процедур), sysforeignkeys, sysconstraints, наверняка еще откуда-нибудь. Не забыть про null, identity, rowguidcol, default, автогенерируемые и вычисляемые поля и т.д. и т.п. Короче, я не говорю, что это нечто невозможное, но если подходить к этой задаче по-серьезному, то там есть где засесть на немалое время и насажать прилично ошибок.
Судя по логу профайлера, у MS для этой задачи нет единой процедуры - поправьте меня, если я ошибаюсь. Они используют несколько внутренних хранимых процедур (с префиксом sp_MS), если сильно невтерпеж, можно и на их код посмотреть.

Возможно, у "третьих фирм" есть некоторые инструменты. Если кто сталкивался, отзовитесь! Но боюсь, что у них это тоже ограничится мышиным интерфейсом, а не единой хранимой процедурой.

Связи, скорее всего, действительно надо запихивать в древовидную структуру. Тут же вылезет проблема с рекурсивными процедурами.
...
Рейтинг: 0 / 0
23.08.2001, 13:54
    #32012699
Как сгенерить скрипт не через EM?
В инете где-то мне попадалась такая единая процедурка. Кажется это было на http://www.swynk.com или http://sqlserver.superexpert.com
...
Рейтинг: 0 / 0
23.08.2001, 14:44
    #32012703
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Denniz, 2GreenSunrise
Проблемы связей между объектами не существует!
Порядок создания объектов примерно следующий - возможно не полный, желающие могут расширить
1) types
2) defaults
3) bind defaults to types
4) tables
5) views
6) references keys
7) triggers
procedures
9) load data into tables

пытаться создавать деревья по sysdepends я бы не советовал
т.к. связи между таблицами там не отражаются - это делается в sysreferences: fkeyid, rkeyid соответственно id,
а кроме того таблица похоже оставлена в версиях после седьмой только для совместимости и реальной картины зависимостей объектов в БД вообще не отражает.
посмотреть на это очень просто -
выполняем скрипт:
CREATE TABLE tab1 (a int)
GO
CREATE PROC proc1 AS SELECT * FROM tab1
и в sysdepends попадет зависимость процедуры proc1 от таблицы tab1
а если так:
CREATE PROC proc2 AS SELECT * FROM tab2
GO
CREATE TABLE tab2 (a int)
то в sysdepends не попадет зависимость процедуры proc2 от таблицы tab2
вот такие пироги ;(


анализировать sysreferences на предмет связей между таблицами я тоже не советую,
потому что это могут быть не "деревья" а "кольца"
пример:


CREATE TABLE a( a int not null primary key,
b int null)
GO
CREATE TABLE b( b int not null primary key,
a int null)
GO
ALTER TABLE a
ADD CONSTRAINT FK_a_b FOREIGN KEY (b) REFERENCES b(b)
GO
ALTER TABLE b
ADD CONSTRAINT FK_b_a FOREIGN KEY (a) REFERENCES a(a)
GO

select * from sysreferences where fkeyid in (select id from sysobjects where name in ('a', 'b'))

и все равно придется создавать ссылки между таблицами отдельно от самих таблиц
хотя задача анализа "деревьев" сама по себе очень интересна, и только ради либви к искусству стоит ею хотябы раз в жизни позаниматься ))
...
Рейтинг: 0 / 0
23.08.2001, 14:54
    #32012704
Pandre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Denis
пункт
load data into tables
надо делать до references keys, а то придется разбираться с "кольцами"
)
Кроме того, что же делать с View? Попробуй выполнить команду
create view qq1 as select * from qq2
если view qq2 не создана

Удачи
...
Рейтинг: 0 / 0
23.08.2001, 15:10
    #32012706
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Denis:
Твой порядок не жизнеспособен. Вот пример:

create table t1(
col1 as func1(getdate())
)

create trigger tr1 on t1
for ...
as
begin
insert into t2
exec proc1
end

и т.д. В одних случаях надо создавать таблицы, потом функции, потом процедуры. В другом сначала пару функций, потом часть таблиц, потом часть процедур, потом снова таблицы...

Вообще говоря, соблюдение порядка принципиально важно только при создании внешних ключей - если перепутать, то получишь ошибку и нужный объект не создастся.
Неправильный порядок создания таблиц, процедур и функций приведет только к warning'у "нельзя добавить в sysdepends", но все объекты тем не менее создадутся.
...
Рейтинг: 0 / 0
24.08.2001, 04:06
    #32012726
Denniz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2All: Хм... Вот уж не думал, что мой вопрос вызовет такое бурное обсуждение
2GreenSunrise: Спасибо за наводку в BOL - будем посмотреть...

Для чего мне было все это нужно?
Да потому, что встроенные средства разработки в 7.0 жутко
неудобные. Если забыл, где и в какой проце использовал какую-либо
константу или выражение - хрен сделаешь поиск... Можно, конечно,
извратиться с sp_help... но имхо еще гиморней.
Вот для этого и приходится создавать скрипт, делать поиск в фаре,
что-то менять, редактировать, а потом обратно. Опять же для
быстрой и легкой возможности переноса структуры базы на тестовый
сервер полезно. Замаялся я генерить скрипт руками в EM - вот и
решил поинтересоваться о способах автоматизации...

Так вот... может я чего-то не вижу, что лежит на поверхности?
Может есть продукты третьих фирм предназначенные для разработки в 7.0?

ps: а есть ли продукты, позволяющие проскриптовать _содержимое_ базы?
то есть в скрипте получить набор insert'ов?
...
Рейтинг: 0 / 0
24.08.2001, 05:15
    #32012736
VictorS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
А ErWin не пробовали?
...
Рейтинг: 0 / 0
24.08.2001, 06:51
    #32012752
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Pandre
посыпаю голову пеплом, действительно данные надо лить до ссылок
и с представлениями ты меня уел
действительно их надо заливать в строго определенном порядке... но это очень грустно т.к.
как я уже говорил sysdepends верить нельзя:

create view view1 as select 1 as num
GO
create view view2 as select * from view1
GO
drop view view1
GO
create view view1 as select 'text' as text

в sysdepends записи нет
таким образом остается только идти по syscomments, а это тоже не всегда возможно
только если коды не криптованы
т.о. с view задача в общем виде не решается must die!!!

2GreenSunrise
Извини, но ты не прав
речь шла изначально про 7-ку поэтому функции не рассматривались, а создавать их надо просто до всех таблиц...
проблем с созданием типов объектов вперемешку (одна таблица, одна процедура, две функции, другая таблица) нет,
как ты сам заметил '...приведет только к warning'у "нельзя добавить в sysdepends",...'
но вот как раз c функциями в качестве полей таблиц так не прокатит ;(

а вот со связями между view как замечено Pandre действительно проблема... особенно если это view на linked сервера
...
Рейтинг: 0 / 0
24.08.2001, 07:18
    #32012754
Pandre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
С созданием view скриптом типа
if exists.. drop view ...
create view ...
go
if exists.. drop view ...
create view ...
go
if exists.. drop view ...
create view ...
go
можно поступать следующим образом - прогнать скрипт несколько раз, пусть ошибки вылетают они не кому не мешают
...
Рейтинг: 0 / 0
24.08.2001, 07:19
    #32012755
Pandre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Лопухнулся
:
if exists.. drop view ...
в скрипте не нужны
...
Рейтинг: 0 / 0
24.08.2001, 07:36
    #32012766
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Denniz: в том или ином виде с этой проблемой сталкивались, наверное, почти все, поэтому такой бурный отклик
Насчет вопроса про процедурку, которая по содержимому таблицы сделает набор insert'ов - у меня есть такая (тоже как-то возникала надобность, пришлось написать), если хочешь, черкни на мыло -GreenSunrise@mail.ru-, я тебе скину.

2Denis: я думаю, что подобную проблему стоит рассматривать более широко, чем с привязкой к конкретной версии сиквела, так что вопрос "что делать с функциями" вполне актуален. И насчет создания функций до таблиц - тоже неловко выходит. Функции могут использовать данные из других таблиц. Создание объектов в неправильном порядке приведет опять-таки к отсутствию записей в sysdepends, если только это действует на функции.

2All: если вываливается предупреждение "нельзя добавить в sysdepends", это не страшно в случае создания объектов БЕЗ указания опции WITH SCHEMABINDING. А вот если ее указывать, то НЕЛЬЗЯ будет создать объекты БД в неправильном порядке.

Напоследок - просветите меня, почему данные надо заливать до создания references keys? Я что-то не догоняю...
...
Рейтинг: 0 / 0
24.08.2001, 07:44
    #32012769
Pandre
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2GreenSunrise
Данные надо заливать до создания references keys, чтобы не учитывать references keys в последовательности заливки
...
Рейтинг: 0 / 0
24.08.2001, 08:10
    #32012773
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2Pandre
Идея про прогон скриптов несколько раз мне понравилась
У меня в это время тоже решение вызрело - в конце концов заливку объектов можно (и нужно в нашем случае) делать через exec и анализировать результат, если обломилось, повторить позже (только не весь скрипт, а только ту часть что обломилать) и так до полной победы

2GreenSunrise
Если честно я уже не закладываюсь на sysdepends в силу описанных мною ранее причин:
в процессе экслуатации системы кто-нибудь "очень умный" может дробнуть и вновь создать любой объект и прощай sysdepends а с такими "умными" нам постоянно приходится сталкиваться,
поэтому я не ситаю что при заливке данных следует содержать sysdepends в порядке.
С другой стороны я не претендую на всезнание
Про хинт SCHEMABINDING услышал от тебя первый раз - это может сильно поколебать мою позицию по данному вопросу ;(
мой books on-line сказал что оно появилось только в 2000 - а я все больше пока 7-й занимаюсь ;(

про заливку данных все просто, если ты ее делаешь после построения foreign keys то выполнять ее надо в строго даданной последовательности - сначала родитель потом дети - а в общем случае это не возможно (см. мой пример выше про циклические завязки между таблицами) хотя конечно никто не мешает тебе создавать все ссылки, потом отключать их у всех объектов, заливать все данные, потом опять их включать (лично я так и делал иногда) но при этом, если не ошибаюсь, при включении их обратно проверки целостности БД сервер не производит ;( надо самому об этом позаботиться
...
Рейтинг: 0 / 0
24.08.2001, 11:01
    #32012801
Denniz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
2VictorS: Насчет ErWin - много слышал, но все как-то руки не доходят попробовать...
можно краткую аннотацию (url)?
...
Рейтинг: 0 / 0
24.08.2001, 12:54
    #32012815
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Поддерживаю VictorS, ну в самом деле ну нафига изобретать велосипед?

2 Denniz

Посмотрите на www.interface.ru
...
Рейтинг: 0 / 0
26.08.2001, 18:34
    #32012847
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Что касается последовательности - взгляните на sp_MSdependencies.
...
Рейтинг: 0 / 0
27.08.2001, 10:53
    #32012912
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сгенерить скрипт не через EM?
Вопрос для Гуру!

Можно ли считать объективной информацию из таблицы sysdepends?

Как видно из текста системных процедур sp_MSdependencies и sp_depends эта таблица там активно используется, но при этом "неправильный" порядок создания связанных объектов в БД не создает записей в таблице sysdepends (см. мои примеры выше в этом топике).
Есть ли другой спрособ, кроме использования sysdepends выяснить иерархию объектов в БД?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сгенерить скрипт не через EM? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]