powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / редактирование таблиц
15 сообщений из 15, страница 1 из 1
редактирование таблиц
    #32001075
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, All
У меня вопрос:
После редактирования структуры таблицы (добавление или стирание полей) перестают корректно работать представления и процедуры типа select * from [table] where ... . Это связано с неправильной установкой SQL-server, с какими-нибудь настройками, или так и должно быть? Есть ли sp, которые восстанавливают все представления и процедуры в этой ситуации?

Заранее спасибо за помощь,
Мария
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001076
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может поможет

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.


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

Мария
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001087
Фотография AnS1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, в семерке изменение структуры view без перекомпиляции
приводит к некорректной работе.
С sp такого нет - они компилятся при первом обращении.
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001088
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnS1, можно пример? Желательно, короткий.
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001089
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример некорректной работы 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 и создать его заново.
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001095
Дед+Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с 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
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001102
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно все замечательно работает. Большое спасибо!
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001105
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, процедура AlterView будет работать только для малеьких view. Если чуть побольше (более 8000 байт), поле view_definition из information_schema.views возвращает NULL
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001110
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне пока что сложно представить View такого размера. Насколько я понимаю, такие представления нельзя редактировать и в Ent.Manager, раз они не умещаются в ctext?

По поводу процедур: в если поменять только имена полей в таблице, процедура типа select * from tab это не замечает и выдает данные со старыми именами. (Это выяснилось, когда я начала менять русские названия на английские. В связи с этим вопрос: русские названия таблиц, полей и т.д. действительно лучше не использовать?)
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001112
Дед+Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модификация предыдущей процедуры на случай, когда определение 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.
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001113
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает и действительно можно наращивать при необходимости. Очень удобно, когда что-либо меняешь в таблице.
Что касается переименованных полей, я имела в виду, что stored procedure требуют компиляции, а они, вроде бы, должны компилироваться автоматически при изменении структуры таблицы.
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001115
Дед+Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, у меня 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)
...
Рейтинг: 0 / 0
редактирование таблиц
    #32001116
Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, действительно. На другом сервере у меня тоже все работает.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / редактирование таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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