Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Выполнение хранимой процедуры (последовательно или параллельно?)

Добрый день. Есть хранимая процедура, в которой содержатся запросы на выборку, вставка и update записей.

Скажите пожалуйста, как выполнится хранимая процедура при одновременном вызове с двух клиентов (логин и пароль для подключения один)

Предполагаю, что выполнится параллельно. В этом случае вопрос. Как проверить что процедура выполняется и запретить второму клиенту ее вызов ?
Ответ: При выполнении операции модификации (update) 1-м клиентом запись в таблице автоматически блокируется. И 2-ой клиент (2-я процедура) либо не выполнится вообще, о чем должно быть сообщение, либо будет ждать, пока снимется блокировка. Как только снимается блокировка - 2-я процедура выполняется.
Вопрос: Автоматическое выполнение хранимой процедуры

Есть необходимость выполнения хранимой процедуры, которая будет вызываться автоматически, например, раз в месяц 30 числа в 15:00, или раз в неделю. Подскажите пожалуйста, как это правильно можно настроить. Каким механизмом воспользоваться.
Сервер: Версия 10.50.4000.0, Редакция Express Edition with Advanced Services (64-bit)
Ответ: ОКЕЕЕЙ. убедили=)
Вопрос: Долгое выполнение хранимых процедур

Есть база на MS SQL Server 2008R2. Используется практически только для чтения. Редко что в нее пишется. Работа с ней ведется через хранимые процедуры. Нагрузка на сам сервер в боевом режиме 3000 транзакций в секунду. Когда начались тормоза - запустил профайлер, поставил условие duration > 2000 ms. Получил результаты - скриншот прикрепил. Даже простая выборка по индексному полю типа lt_GetOrganizationByUID занимает почти 4 секунды. Внутри процедуры SELECT uid_org, uid_user, name FROM lt_Organizations WHERE @OrganizationUID = uid_obj. База находится в режиме 'read committed snapshot'. Файл данных на одном диске, лог транзакций на другом. В чем может быть причина тормозов? Что еще нужно посмотреть?

К сообщению приложен файл. Размер - 38Kb
Ответ: Если сервер виртуализирован, то проверьте, нет ли высоконагруженно-дисковых задач на "смежных" с ним серверах.

У нас такое было: сервер БД иногда "укладывал" почту на "смежном" сервере.

Но проще сначала убедицца, что все индексы на месте. И обновить статистики.
Это даст больше пользы, чем копание в разного рода "полезных" утилитах.

Потом убедиться, что нет бесконечно висящих транзакций. Иногда такое допускают разработчики.
Из-за этого могут начинать накапливаться неясного рода блокировки и ожидания. :)

А еще время от времени ребутайте сервер, если есть возможность.
Вопрос: Залить результаты выполнения хранимой процедуры во врем.таблицу без предв.создания

Всем привет!
Подскажите, пожалуйста, решается ли на серверном уровне следующая задача:

я хочу вызвать хранимую процедуру и поместить ее результаты во временную табличку.
Собственно, хранимых процедур может быть много разных, а мне важно получить количество записей, которые возвращает ХП.

Т.е. не так:
CREATE TABLE #Output (ID INT, Name NVARCHAR(100))
INSERT INTO #Output
    EXECUTE dbo.ProcMyProcedure
SELECT COUNT(*) FROM #Output

а попроще, т.к. хранимых процедур много, и возвращают рекордсеты разной структуры.
Может быть, через XML как-нибудь притянуть и т.п.?
Ответ: Glass,

ну так плин напишите все скрипты единообразно..чтоб возращали 1 поле количество запписей и заполняйте себе 1 таблицу свомим вызоовами... не городите огород непонятно чего,ей богу
Вопрос: Ошибка в хранимой процедуре

Здравствуйте! У меня при выполнении хранимой процедуры возникает следующая ошибка ""Ошибка преобразования даты или времени из символьной строки". Помогите пожалуйста!
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
USE [library]
GO
/****** Object:  StoredProcedure [dbo].[delete_dublicate]    Script Date: 10/23/2015 20:25:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[delete_dublicate]
    -- Add the parameters for the stored procedure here
    @i int=0,@kol int=0,@l int=1,@k int=2,@f int=1, @id int=0,@del int=0,@d_s date='1900-01-01',@d_f date='1900-01-01'
    AS
BEGIN   
    
    SET NOCOUNT ON;
while(@i<(select COUNT(id_book) from Book))
begin
    if((select COUNT(id_form_reader) from Form_reader where id_book=@i)>1)
    begin
        if(select top 1 form_reader.date_finish from Form_reader where id_book=@i order by date_start)='Null'
        begin
            while(@f<(select COUNT(id_form_reader) from Form_reader where id_book=@i))
            begin
                delete from Form_reader where id_form_reader=(select form_reader.id_form_reader from(select top(@f+1) *  from Form_reader where id_book=@i order by date_start EXCEPT 
                 select top(@f) *  from Form_reader where id_book=@i  order by date_start)as a)
                select @f=@f+1
                select @kol=@kol+1;
            end
        end
        else
        begin
            while(@l<(select COUNT(id_form_reader) from Form_reader where id_book=@i))          
            begin
                if(@l=1)
                select @d_f =(select top 1 date_finish from Form_reader where id_book=@i order by date_start)
                else
                select @d_f =(select date_finish from(select top(@l) *  from Form_reader where id_book=@i order by date_start EXCEPT 
                select top(@l-1) *  from Form_reader where id_book=@i  order by date_start)as a)
                while(@k<=(select COUNT(id_form_reader) from Form_reader where id_book=@i))
                    begin
                    select @d_s =(select date_start from(select top(@k) *  from Form_reader where id_book=@i order by date_start EXCEPT 
                    select top(@k-1) *  from Form_reader where id_book=@i  order by date_start)as a)
                    select @id=(select id_form_reader from(select top(@k) *  from Form_reader where id_book=@i order by date_start EXCEPT 
                    select top(@k-1) *  from Form_reader where id_book=@i  order by date_start)as a)
                    if(@d_f>@d_s)
                        begin
                        delete from Form_reader where id_form_reader=@id
                        select @del=@k
                        if(@del=(select COUNT(id_form_reader) from Form_reader where id_book=@i))
                        select @l=(select COUNT(id_form_reader) from Form_reader where id_book=@i)
                        select @k=@k+1
                        select @kol=@kol+1;
                        end
                    else
                    begin
                    select @l=@l+1
                    select @k=@k+1;
                    end
                end
            end
        end
    end
select @k=2
select @l=1
select @i=@i+1;
end
print @kol
    -- Insert statements for procedure here
 
END
Ответ: Без явного указания формата даты, вполне закономерная ситуация.
Добавьте set dateformat dmy в начале процедуры.
Вопрос: Отличие выполнение хранимой процедуры из кода (.net) и managment studio

Всем привет.

Используются:
mssql 2008 r2
.net 4.0
entity framework 6.0

При вызове хранимки из .net (C#) кода (пробовал разными средствами, в том числе EF 6.0) генерируется что-то вроде:

exec sp_executesql N"my_sp @Id, @Id=N'571631DA-7B55-4150-85F2-55822BCE157E'" {куча других параметров, в т.ч. datetime}
go


В хранимой процедуре открывается транзакция и идет update таблицы (T1)
на таблицу (T1) повешен триггер на update.

Так вот, если выполнить предыдущий скрипт из C# кода, то триггер не срабатывает, а если из managment studio, то срабатывает.

Ошибок никаких нет, т.е., процедура my_sp отрабатывает нормально и обновляет таблицу (T1), разница лишь в работе триггера..

Есть идеи?
Ответ: Владислав Колосов,

Да, виноват, не срабатывало условие в триггере.
Спасибо.

А то уже пенял на магию ..
Вопрос: Хранимая процедура и транзакция.

Здравствуйте!

Всегда предполагал что содержимое хранимой процедуры выполняется внутри неявной транзакции. Но простой тест показал что это не так. Создал хранимую процедуру с двумя DELETE первый выполняется успешно, второй падает. После запуска процедуры вижу что первый DELETE таки удалил данные из базы. Т.е. транзакция не откатилась. Значит нужно явно писать BEGIN TRAN и END TRAN?
Ответ:
Новичек sql
Glory
Что для вас означает "автоматически" ?
Где должен быть этот автомат, который будет решать, когда начинать транзакцию, что в нее включать и когда и как завершать ?

Автоматически для меня означает что содержимое хранимой процедуры либо выполнится целиком, либо не выполнится вообще (если там есть запросы на модификацию содержимого, они откатятся). Начинать транзакцию с началом хранимой процедуры, завершать в конце. Если ошибок не происходило, то commit-ом, если что-то пошло не так, то rollback-ом.

вот это и напишите в своей хранимке.

вы сейчас напрограммировали "два с половиной дерева" и думаете что это "весь лес" и есть.
организация транзакции выполняется тривиально, кроме демагогии сделать это не мешает ничто.

транзакций в хранимке может быть больше одной, транзакции могут быть вложенными, могут быть чекпойнты. еще у транзакций есть уровни изоляции. в рамках транзакций разных уровней изоляции по-разному организовываются блокировки.

ХП - не вьюха - ее программировать надо.

есть такая опция IMPLICIT_TRANSACTIONS - в целом, включайте себе, потом расскажете, к чему пришли. и насколько это круто "неявные транзакции".
Вопрос: Хранимая процедура из под другой учетки

Добрый день!
Возник вот такой вопрос:
Можно ли внутри хранимой процедуры указать логин и пароль для того, чтобы пользователь у которого нет прав на использование определенной базы мог выполнить SELECT?
Т.е. у меня есть разрешение на использование базы, в которой есть хранимая процедура. Внутри неё Select к базе, к которой нет доступа. Я знаю пароль и логин системной базы. Но дописывать себя к этой базе мне нельзя.

Добавлено через 3 часа 11 минут
получилось при обращении дать пользователю строку подключения с логином и паролем от sa. В мониторинге он из под нее всё и выполнил. Но, если пользователя не добавить на выполнение хранимой процедуры он не может её запустить.
Хранимка в моей базе создает таблицу. затем подключается к другой базе через select. Пользователю разрешен только запуск хранимки.

Добавлено через 3 минуты
запрос имеет вид:
SQL
1
2
3
4
SET @SQL = ' insert into [Mybase].[dbo].[table1] (o1,o2)
 
select t1.o1,t1.o2
from [Serv1].[Base1].t1
Добавлено через 17 часов 53 минуты
Может быть можно сделать select за конкретную учетную запись? У меня основная беда с этим
Ответ: EXECUTE AS
Вопрос: Хранимые процедуры после ресторе требуют перекомпиляции

Всем привет. Кто-нибудь может объяснить интересную бяку в базе данных?


Firebird 2.5.3 - Superserver. OS WinXP, Win7 и Win8.1.
Базы данных подвергаются апдейту:
- метаданные базы сравнивается с эталонной базой
- полученный в результате скрипт потом проигрывается в базе.
- затем для базы делается backup/restore.

Производится все это с помощью IBEScript.exe.


В общем последние полгода встречаются ошибки во время выполнения хранимых процедур. При попытке найти в чем именно ошибка (с подозрением на некорректные данные) выясняется, что ошибка пропадает после компиляции одной или нескольких процедур в цепочке вызова. Боюсь предположить, что это может и с триггерами происходить.

Интересно еще то, что ошибка остается в файла бэкапа. То есть клиенты мне предают fbk для исследования и ошибка существует до перекомпиляции.
Потом чтоб ее повторить нужно восстановить из бэкапа базу.

Сравнение системных таблиц ничего не дало:

До компиляции
(RDB$PROCEDURE_NAME, RDB$PROCEDURE_ID, RDB$PROCEDURE_INPUTS, RDB$PROCEDURE_OUTPUTS, RDB$SECURITY_CLASS, RDB$OWNER_NAME, RDB$SYSTEM_FLAG, RDB$PROCEDURE_TYPE, RDB$VALID_BLR)

('SP_INSERT_AC_IN_ARTIKEL_FROM_LP', 62, NULL, 0, 'SQL$204', 'SYSDBA', 0, 2, 1)
('SP_SBOX_BESTANDS_KORREKTUR', 160, 7, 0, 'SQL$302', 'SYSDBA', 0, 1, 1)


После компиляции
('SP_INSERT_AC_IN_ARTIKEL_FROM_LP', 62, NULL, NULL, 'SQL$204', 'SYSDBA', 0, 2, 1)
('SP_SBOX_BESTANDS_KORREKTUR', 160, 7, NULL, 'SQL$302', 'SYSDBA', 0, 1, 1)


Разница не великая. И даже RDB$VALID_BLR у всех стоит в единице.

Вопрос 1: как можно определить подобную процедуру или триггер чтоб знать, что в базе не все в порядке есть?
Вопрос 2: есть ли способ перекомпилоировать все процедуры и триггеры через консольное соединение?
Ответ: DBConstructor,

Я не собираюсь отвечать на дебильные вопросы, не имеющие отношения к теме обсуждения.
Хешей, меньших по размеру самих данных, не имеющих коллизий, не бывает, а потому рассуждать, что у вот того алгоритма меньше или больше коллизий может только демагог вроде тебя.
Вопрос: Выполнение DTSX хранимой процедурой, проблема с правами

Запускаю DTSX пакет с помощью хранимки на TSQL. В пакете есть два подключения ADO к SQL server 2017, одно подключение к серверу где развернут пакет , другое к удаленному серверу. В подключениях используется аутентификация WINDOWS. Проблема проявляется при попутке подключения к удаленному серверу, пишет что нет прав. Если выполнять пакет в режиме отладки, то все работает, а вот когда через хранимую процедуру, возникает указанная ошибка с правами. Если использовать SQL аутентификацию все работает. Кто подскажет как настроить корректную работу?
Ответ: alexeyvg,
Спасибо, стало понятнее.

У меня в пакете запускается хранимая процедура на удаленном сервере, может предложите вариант, как сделать чтобы она запускалась с правами доменного пользователя, а не с SQL авторизацией?