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

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

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

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

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

А можно подробнее про SQL-DMO - как с ним работать, что для этого
нужно и как сгенерить скрипт... данная задача будет заведомо работать только на сервере.
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012686
BiSas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен, да это геморрой.
Но если хочется, то можно сделать.
Зависимости кажется можно выяснить по таблице sysdepends.
А может я не прав. В этом направлении я не работал.
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012687
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для хранимых процедур, view и тригеров скрипт генериться процедурой
sp_helptext obj_name
Для таблиц информацию выдает
sp_help, но в сложных случаях придется лезть в системные таблицы.
Что касается References, то их как и триггеры, процедуры и view надо создавать после создания таблиц. Зависимости между объектами (кроме таблиц) храниться в sysdepends. Задача не тривиальная, хотя, повидимому, сводиться к построению дерева.
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012689
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я только теоретически знаю, что так можно. См. 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
Как сгенерить скрипт не через EM?
    #32012699
В инете где-то мне попадалась такая единая процедурка. Кажется это было на http://www.swynk.com или http://sqlserver.superexpert.com
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012703
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как сгенерить скрипт не через EM?
    #32012704
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Denis
пункт
load data into tables
надо делать до references keys, а то придется разбираться с "кольцами"
)
Кроме того, что же делать с View? Попробуй выполнить команду
create view qq1 as select * from qq2
если view qq2 не создана

Удачи
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012706
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как сгенерить скрипт не через EM?
    #32012726
Denniz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2All: Хм... Вот уж не думал, что мой вопрос вызовет такое бурное обсуждение
2GreenSunrise: Спасибо за наводку в BOL - будем посмотреть...

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

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

ps: а есть ли продукты, позволяющие проскриптовать _содержимое_ базы?
то есть в скрипте получить набор insert'ов?
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012736
VictorS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ErWin не пробовали?
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012752
Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как сгенерить скрипт не через EM?
    #32012754
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С созданием view скриптом типа
if exists.. drop view ...
create view ...
go
if exists.. drop view ...
create view ...
go
if exists.. drop view ...
create view ...
go
можно поступать следующим образом - прогнать скрипт несколько раз, пусть ошибки вылетают они не кому не мешают
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012755
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лопухнулся
:
if exists.. drop view ...
в скрипте не нужны
...
Рейтинг: 0 / 0
Как сгенерить скрипт не через EM?
    #32012766
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Denniz: в том или ином виде с этой проблемой сталкивались, наверное, почти все, поэтому такой бурный отклик
Насчет вопроса про процедурку, которая по содержимому таблицы сделает набор insert'ов - у меня есть такая (тоже как-то возникала надобность, пришлось написать), если хочешь, черкни на мыло -GreenSunrise@mail.ru-, я тебе скину.

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

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

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

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

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

2 Denniz

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

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

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


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