редактирование таблиц

Maria
Дата: 07.12.2000 09:32:02
Добрый день, All
У меня вопрос:
После редактирования структуры таблицы (добавление или стирание полей) перестают корректно работать представления и процедуры типа select * from [table] where ... . Это связано с неправильной установкой SQL-server, с какими-нибудь настройками, или так и должно быть? Есть ли sp, которые восстанавливают все представления и процедуры в этой ситуации?

Заранее спасибо за помощь,
Мария
SergSuper
Дата: 07.12.2000 09:47:18
Может поможет

sp_recompile (T-SQL)
Causes stored procedures and triggers to be recompiled the next time they are run.

Syntax
sp_recompile [@objname =] 'object'

Arguments
[@objname =] 'object'
Is the qualified or unqualified name of a stored procedure, trigger, table, or view in the current database. object is nvarchar(776), with no default. If object is the name of a stored procedure or trigger, the stored procedure or trigger will be recompiled the next time it is run. If object is the name of a table or view, all the stored procedures that reference the table or view will be recompiled the next time they are run.
Return Code Values
0 (success) or a nonzero number (failure)

Result Sets
None

Remarks
sp_recompile looks for an object in the current database only.

The queries used by stored procedures and triggers are optimized only when they are compiled. As indexes or other changes that affect statistics are made to the database, compiled stored procedures and triggers may lose efficiency. By recompiling stored procedures and triggers that act on a table, you can reoptimize the queries.


--------------------------------------------------------------------------------

Note Microsoft® SQL Server™ automatically recompiles stored procedures and triggers when it is advantageous to do so.


--------------------------------------------------------------------------------
Дед+Маздай
Дата: 07.12.2000 10:10:34
Вы не указали версию, но, по-видимому, речь идет о 6.х, потому что в более поздних версиях SQL Server при ALTER TABLE / VIEW выполняет автоматическую перекомпиляцию всех планов, зависящих от данной схемы. В 6.х перекомпиляция в этом случае не поможет. Простейший пример: create proc sp1 as select * from tbl, в tbl добавляем новое поле, но это никак не отражается на выдачах sp1. Единственный выход - drop / create процедуры, потому что команды ALTER PROCEDURE в 6.х тоже не было.
Maria
Дата: 07.12.2000 12:48:40
Большое спасибо за ответы.
Что касается программы, у меня 7 версия; база данных писалась сразу в SQL-server 7.0. Тем не менее, при редактировании таблиц, соответствующие представления и процедуры автоматически не компилируются. Может быть отсутствуют какие-то настройки? (Это вполне может быть, т.к. опыт работы с SQL-server у меня пока небольшой).

Мария
AnS1
Дата: 07.12.2000 17:27:37
Действительно, в семерке изменение структуры view без перекомпиляции
приводит к некорректной работе.
С sp такого нет - они компилятся при первом обращении.
Дед Маздай
Дата: 07.12.2000 18:12:08
AnS1, можно пример? Желательно, короткий.
Maria
Дата: 07.12.2000 19:31:19
Пример некорректной работы view после редактирования таблицы:
Берем таблицу:
create table tab
(tab_id int identity primary key,
b char(10),
c char(10))
insert tab (b,c)
values (34,45)

Для нее делаем view и stored procedure:

create view v as select * from tab

create proc st_p as select * from tab

и выполняем запрос:

select * from v
exec st_p

alter table tab
add n char(10), m char(10)

select * from v
exec st_p

alter table tab
drop column b

select * from v
exec st_p

помогает вроде бы только стереть view и создать его заново.
Дед+Маздай
Дата: 08.12.2000 09:30:53
Да, с view какая-то задница. Радует хотя бы то, что хранимые процедуры ведут себя прилично. Ну, делать нечего, поведение view придется доработать напильником. Во-первых, drop / create заново делать не надо. alter view тоже помогает ему одуматься. И чтобы по максимуму автоматизировать этот процесс, предлагается следующая процедура:

create proc AlterView @ViewName sysname as
declare @query varchar(8000)
select @query = view_definition from information_schema.views where table_name = @ViewName
set @query = replace(@query, 'create', 'alter')
exec (@query)

После чего все работает гладко:
...
select * from v

alter table tab add d char(10)
exec AlterView 'v'
select * from v

alter table tab drop column c
exec AlterView 'v'
select * from v
Maria
Дата: 08.12.2000 19:32:41
Действительно все замечательно работает. Большое спасибо!
alexeyvg
Дата: 09.12.2000 08:53:35
К сожалению, процедура AlterView будет работать только для малеьких view. Если чуть побольше (более 8000 байт), поле view_definition из information_schema.views возвращает NULL