Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хранимые процедуры  [new]
ain
Member

Откуда:
Сообщений: 4
Здравствуйте. Подскажите пожалуйста.
Если есть несколько таблиц используемых в качестве справочников(например справочник организаций и т.д) можно ли написать хранимую процедуру что-бы работать со всеми таблицами, добавлять, удалять данные и т.д.
Т.е. передаем в хранимую процедуру, например, имя таблицы, и в зависимости от переданных данных производим необходимые действия.
Спасибо.
25 сен 02, 11:54    [57605]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
dao
Member

Откуда: Москва
Сообщений: 771
через динамический sql
25 сен 02, 11:59    [57609]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ain
Member

Откуда:
Сообщений: 4
По другому нельзя?
При большом количестве таблиц, процедура будет долго выполняться, насколько я понимаю невозможно будет оптимизировать выполнение.
25 сен 02, 12:05    [57615]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
dao
Member

Откуда: Москва
Сообщений: 771
по правильному - только так .
Можно подойти с другой стороны - одинаковые по структуре справочники обьединить в одну таблицу - добавить поле -какой это справочник и с этой таблицей работать (что то среднее между обьектных и традиционным подходом) -если есть возможность исправить структуру
25 сен 02, 12:10    [57619]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
fima
Member

Откуда: Москва
Сообщений: 583
Можно ещё обрабатывать переданные параметры, и в зависимоти от них исполнять определенные запросы, но процедура будет громоздкой, нечитаемой и т.д. Вообще то я, например, к каждой таблице, к каждому действию пишу отдельную процедуру. Оно и понятней и проще и права можно раздать на исполненеие процедур. Я думаю большинство делает так же... И Вам то же советую :)
25 сен 02, 12:14    [57621]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Единственное в чем разница - это в том что при динамичечком sql -план запроса строится при выполнении а при обычной процедуре при компиляции процедуры. Так что оптимизация остается вполне доступной.А если справочники не большие то и разница не должна быть большой. А при частом изменении данных в справочниках вообще может работать даже быстрее.
25 сен 02, 12:21    [57624]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ain
Member

Откуда:
Сообщений: 4
Понятно, спасибо всем.
25 сен 02, 12:26    [57628]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Не забудьте только, что при динамическом запросе вам придетя назначить пользователям права и на сами таблицы, а не только на процедуру.
25 сен 02, 12:30    [57635]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
1-ый выриант
Написать хранимую процедуру, которая генерит другие хранимые процедуры, для каждого справочника и вызывает их.
Алгоритм такой:
1. Запускаем общую для всех справочников процедуру, например edit_dictionary с параметром имя таблицы table_name и например общим для всех справочников идентификатором id.
2. В edit_dictionary проверяем наличие процедуры 'edit_' + table_name.
3. Если процедура не найдена то динамическим SQL формируем процедуру 'edit_' + table_name в которой осуществляется вызов на редактирование указ. таблицы.
4. Динамическим SQL вызываем 'edit_' + table_name c параметром id.
Правда при этом пользователь должен иметь право на создание хранимых процедур и на таблицы, т.к. процедуры создаются в контексте пользователя.

2-ой выриант (предпочтительный)
Написать хранимую процедуру, или скрипт, которые генерят хранимые процедуры, для каждого справочника и каждой операции. И вызывать их через общую процедуру.
Алгоритм такой:
1. Вызываем от имени dba один раз после изменений в справочниках хранимую процедуру или скрипт generate_procedures в которой для всех справочников и набора действий с ними создаём набор хранимых процедур с названиями типа <действие>_<имя таблицы>
2. запускаем общую для всех справочников процедуру, например edit_dictionary с параметром имя таблицы table_name и например общим для всех справочников идентификатором id
3. Динамическим SQL вызываем 'edit_' + table_name c параметром id.
При этом пользователь должен иметь право лишь на запуск хранимой процедуры 'edit_' + table_name. Права на доступ к таблицам не нужны.

В обоих вариантах план выполнения и оптимизация ведуться нормальным системным путём и создаются один раз, при создании процедур.
25 сен 02, 12:37    [57639]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
fima
Member

Откуда: Москва
Сообщений: 583
У меня ВОПРОС :)
Зачем всё так сложно, даже если таблицы похожи и действия похожи... и хочется убыстрить процесс написания, то можно пользоваться "Ctrl + C" и "Ctrl + V".
Так в чем прелесть таких динамических запросов?
25 сен 02, 12:47    [57641]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ain
Member

Откуда:
Сообщений: 4
2akuz
не совсем понял что такое идентификатор id?
id получаемый по object_id() ?
получается при каждом изменении справочников должен изменяться скрипт генерирующий sp
25 сен 02, 12:53    [57645]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Тоже мысль!
proc EditTable(<действие>,<таблица>,<id строки>)
str='exec ' + <действие>_<таблица> + '(' + <id строки> +')'
run str
end proc
где <действие>_<таблица> + '(' + <id строки> +')' -вызом хранимой процедуры
2akuz -правильно понял?
25 сен 02, 13:02    [57649]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
akuz
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 6749
2 dao
В общем правильно
2 ain
id - значение ключа в справочнике
25 сен 02, 16:08    [57716]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Чтоб не плодить тем пишу тут. Пока похожих тем ненашел.
Процедура должна переносить данные из таблицы FIXALARMS_NS1 в FIXALARMS_NS11.
Вопрос нужно чтоб процедура срабатывала при изменении данных в таблице FIXALARMS_NS1.
Выглядит так

ALTER PROCEDURE [dbo].[ins_ALM_NS11] (@ALM_NATIVETIMEIN datetime, ... @ALM_USERFLD2 char(80))
As
INSERT INTO FIXALARMS_NS11 ( ALM_NATIVETIMEIN, ... ALM_USERFLD2)
SELECT @ALM_NATIVETIMEIN, ... @ALM_USERFLD2
FROM dbo.FIXALARMS_NS1
return

Не работает. подскажите, что не так или где это обсуждалось.
Спасибо.
19 фев 15, 15:26    [17287981]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ncux199rus,

Процедура такого типа как вы хотитет называеться триггер на апдейт (если я правильно понял что вам надо)
Иили вашу надо вызывать из процедуры которая изменяет таблицу FIXALARMS_NS1
19 фев 15, 15:32    [17288016]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Maxx,
Тут не совсем апдейт. В таблицу НС1 данные заносятся их Скады. При попадании данных в таблицу НС1 должна сработать процедура и скопировать вновь появившиеся данные в таблицу НС11.
В теории процедуру проще отследить чем раоту тригера? Если это так то, да мне нужна процедура.
19 фев 15, 15:52    [17288174]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ncux199rus,

кто ее будет запускать то ????
Триггер ето такая же процедура на срабатывает на событие - в вашем случае инсерт (по вашим же словам)
19 фев 15, 15:54    [17288194]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Maxx,
ага. То еесть чтоб эта процедура отрабатывала мне нужно написать тригер в таблице ... начальной? (НС1)

CREATE TRIGGER trg.ins_ALM_NS1 on dbo.FIXALARMS_NS1
FOR UPDATE
AS
UPDATE dbo.FIXALARMS_NS1
EXECUTE [dbo].[ins_ALM_NS11]

END;
19 фев 15, 16:46    [17288661]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
То еесть чтоб эта процедура отрабатывала мне нужно написать тригер в таблице ..

Триггер - это есть процедура. Которая сработает _после_ операции над таблицей.
Не надо в триггере писать еще вызов процедуры.
19 фев 15, 16:49    [17288683]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мдя....
а почему на апдейт ..если вам надо на инсерт то ?
Да и всю логику вашу можно тупо в тригере прописать если так надо.. просида ваша скорее всего и не нужна по факту
19 фев 15, 16:50    [17288698]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Похоже на аленькой цветочек?

CREATE TRIGGER trg.ins_ALM_NS1 on dbo.FIXALARMS_NS1
FOR INSERT
AS
INSERT dbo.FIXALARMS_NS1
SET INSERT INTO [dbo].[ins_ALM_NS11]
SELECT *

END;


Если мне нужно перенести все столбцы и таблицы одинаковы можно не указывать переменные и имена столбцов?
19 фев 15, 17:02    [17288793]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
INSERT dbo.FIXALARMS_NS1
SET INSERT INTO [dbo].[ins_ALM_NS11]
SELECT *

Это что за синтаксис ?
19 фев 15, 17:07    [17288822]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory,
-Балбес;
-Согласен.


ALTER TRIGGER [dbo].[trg_ins_ALM_NS11] on [dbo].[FIXALARMS_NS1]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO [dbo].[FIXALARMS_NS11]
SELECT *
FROM [dbo].[FIXALARMS_NS1]
END;
19 фев 15, 17:17    [17288888]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
ALTER TRIGGER [dbo].[trg_ins_ALM_NS11] on [dbo].[FIXALARMS_NS1]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO [dbo].[FIXALARMS_NS11]
SELECT *
FROM [dbo].[FIXALARMS_NS1]
END;

Ваш триггер вместо добавления новых записей в FIXALARMS_NS1 будет переносить имеющиеся записи из FIXALARMS_NS1 в FIXALARMS_NS11
19 фев 15, 17:19    [17288904]     Ответить | Цитировать Сообщить модератору
 Re: Хранимые процедуры  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory,
Именно переносить? Мне нужно, чтобы копировались, при добавлении в НС1 тригером в НС11
19 фев 15, 17:31    [17288978]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить