|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Добрый день, All У меня вопрос: После редактирования структуры таблицы (добавление или стирание полей) перестают корректно работать представления и процедуры типа select * from [table] where ... . Это связано с неправильной установкой SQL-server, с какими-нибудь настройками, или так и должно быть? Есть ли sp, которые восстанавливают все представления и процедуры в этой ситуации? Заранее спасибо за помощь, Мария ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 09:32 |
|
редактирование таблиц
|
|||
---|---|---|---|
#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, 09:47 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Вы не указали версию, но, по-видимому, речь идет о 6.х, потому что в более поздних версиях SQL Server при ALTER TABLE / VIEW выполняет автоматическую перекомпиляцию всех планов, зависящих от данной схемы. В 6.х перекомпиляция в этом случае не поможет. Простейший пример: create proc sp1 as select * from tbl, в tbl добавляем новое поле, но это никак не отражается на выдачах sp1. Единственный выход - drop / create процедуры, потому что команды ALTER PROCEDURE в 6.х тоже не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 10:10 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Большое спасибо за ответы. Что касается программы, у меня 7 версия; база данных писалась сразу в SQL-server 7.0. Тем не менее, при редактировании таблиц, соответствующие представления и процедуры автоматически не компилируются. Может быть отсутствуют какие-то настройки? (Это вполне может быть, т.к. опыт работы с SQL-server у меня пока небольшой). Мария ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 12:48 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Действительно, в семерке изменение структуры view без перекомпиляции приводит к некорректной работе. С sp такого нет - они компилятся при первом обращении. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 17:27 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
AnS1, можно пример? Желательно, короткий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 18:12 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Пример некорректной работы 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 и создать его заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2000, 19:31 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Да, с 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2000, 09:30 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Действительно все замечательно работает. Большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2000, 19:32 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
К сожалению, процедура AlterView будет работать только для малеьких view. Если чуть побольше (более 8000 байт), поле view_definition из information_schema.views возвращает NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2000, 08:53 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Мне пока что сложно представить View такого размера. Насколько я понимаю, такие представления нельзя редактировать и в Ent.Manager, раз они не умещаются в ctext? По поводу процедур: в если поменять только имена полей в таблице, процедура типа select * from tab это не замечает и выдает данные со старыми именами. (Это выяснилось, когда я начала менять русские названия на английские. В связи с этим вопрос: русские названия таблиц, полей и т.д. действительно лучше не использовать?) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2000, 12:25 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Модификация предыдущей процедуры на случай, когда определение view не умещается в типе char/varchar: CREATE PROCEDURE AlterView1 @ViewName sysname AS declare @s varchar(100), @i int, @view_id int select @view_id = id from sysobjects where name = @ViewName and xtype = 'V' declare @s0 varchar(8000), @s1 varchar(8000), @s2 varchar(8000), @s3 varchar(8000), @s4 varchar(8000) declare @s5 varchar(8000), @s6 varchar(8000), @s7 varchar(8000), @s8 varchar(8000), @s9 varchar(8000) select @s0 = '', @s1 = '', @s2 = '', @s3 = '', @s4 = '', @s5 = '', @s6 = '', @s7 = '', @s8 = '', @s9 = '' select @s0 = text from syscomments where id = @view_id and colid = 1 select @s1 = text from syscomments where id = @view_id and colid = 2 select @s2 = text from syscomments where id = @view_id and colid = 3 select @s3 = text from syscomments where id = @view_id and colid = 4 select @s4 = text from syscomments where id = @view_id and colid = 5 select @s5 = text from syscomments where id = @view_id and colid = 6 select @s6 = text from syscomments where id = @view_id and colid = 7 select @s7 = text from syscomments where id = @view_id and colid = 8 select @s8 = text from syscomments where id = @view_id and colid = 9 select @s9 = text from syscomments where id = @view_id and colid = 10 set @s0 = replace(@s0, 'create', 'alter') exec (@s0 + @s1 + @s2 + @s3 + @s4 + @s5 + @s6 + @s7 + @s8 + @s9) GO Как легко видеть, данный вариант работает при длине определения view до 80000 символов. Смысл ясен: если необходима еще бОльшая длина, добавьте переменные @s10, @s11 и т.д. Пример для тестирования: create table VeryVeryLongTableName (a int identity primary key, b char(10), c char(10)) insert VeryVeryLongTableName (b, c) values ('b', 'c') create view v as select * from VeryVeryLongTableName union all ... (250 раз) ... select * from VeryVeryLongTableName union all select * from VeryVeryLongTableName Далее как в предыдущем примере. По поводу русских названий объектов - без разницы, могут использоваться вполне. Переименованные поля в таблице видятся под своими новыми заголовками в select * from view сразу после его alter. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2000, 17:29 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Работает и действительно можно наращивать при необходимости. Очень удобно, когда что-либо меняешь в таблице. Что касается переименованных полей, я имела в виду, что stored procedure требуют компиляции, а они, вроде бы, должны компилироваться автоматически при изменении структуры таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2000, 20:32 |
|
редактирование таблиц
|
|||
---|---|---|---|
#18+
Нет, у меня SPs при переименовании полей реагируют сразу. Никакой ручной перекомпиляции не требуется: create table tbl (a int identity primary key, [Поле] char(10), [Чудес] char(10)) insert tbl values ('абра', 'кадабра') go create proc MySp as select * from tbl go exec MySp a Поле Чудес ----------- ---------- ---------- 1 абра кадабра (1 row(s) affected) exec sp_rename 'tbl.[Поле]', 'Field', 'column' exec MySp a Field Чудес ----------- ---------- ---------- 1 абра кадабра (1 row(s) affected) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2000, 22:04 |
|
|
start [/forum/topic.php?fid=46&msg=32001113&tid=1827548]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 164ms |
0 / 0 |