Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные лаботы ОИС.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.38 Mб
Скачать

2.3.5 Закрытие курсора

CLOSE {имя_курсора | @имя_переменной_курсора}

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

2.3.6 Освобождение курсора

Закрытие курсора необязательно освобождает ассоциированную с ним память. В некоторых реализациях нужно явным образом освободить ее с помощью оператора DEALLOCATE. После освобождения курсора освобождается и память, при этом становится возможным повторное использование имени курсора.

DEALLOCATE { имя_курсора |

@имя_переменной_курсора }

Для контроля достижения конца курсора рекомендуется применять функцию: @@FETCH_STATUS

Функция @@FETCH_STATUS возвращает:

0, если выборка завершилась успешно;

-1, если выборка завершилась неудачно вследствие попытки выборки строки, находящейся за пределами курсора;

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

DECLARE abc CURSOR SCROLL FOR

SELECT * FROM Клиент

Пример 1. Объявление курсора.

DECLARE @MyCursor CURSOR

SET @MyCursor=CURSOR LOCAL SCROLL FOR

SELECT * FROM Клиент

Пример 2. Использование переменной для объявления курсора.

DECLARE abc CURSOR GLOBAL SCROLL FOR

SELECT * FROM Клиент

OPEN abc

Пример 3. Объявление и открытие курсора.

DECLARE @MyCursor CURSOR

SET @MyCursor=abc

Пример 4. Разработать курсор для вывода списка фирм и клиентов из Москвы.

DECLARE @firm VARCHAR(50),

@fam VARCHAR(50),

@message VARCHAR(80)

PRINT ' Список клиентов'

DECLARE klient_cursor CURSOR LOCAL FOR

SELECT Фирма, Фамилия

FROM Клиент

WHERE Город='Москва'

ORDER BY Фирма, Фамилия

OPEN klient_cursor

FETCH NEXT FROM klient_cursor INTO @firm, @fam

WHILE @@FETCH_STATUS=0

BEGIN

SELECT @message='Клиент '+@fam+

' Фирма '+ @firm

PRINT @message

-- переход к следующему клиенту--

FETCH NEXT FROM klient_cursor

INTO @firm, @fam

END

CLOSE klient_cursor

DEALLOCATE klient_cursor

Пример 5. Разработать курсор для вывода списка приобретенных клиентами из Москвы товаров и их общей стоимости. В один курсор заносятся все московские клиенты, затем для каждой строки курсора, т.е. для каждого клиента, определяется и распечатывается другой курсор – его покупки. Подсчитывается общая стоимость покупок клиента.

DECLARE @id_kl INT,

@firm VARCHAR(50),

@fam VARCHAR(50),

@message VARCHAR(80),

@nam VARCHAR(50),

@d DATETIME,

@p INT,

@s INT

SET @s=0

PRINT ' Список покупок'

DECLARE klient_cursor CURSOR LOCAL FOR

SELECT КодКлиента, Фирма, Фамилия

FROM Клиент

WHERE Город='Москва'

ORDER BY Фирма, Фамилия

OPEN klient_cursor

FETCH NEXT FROM klient_cursor

INTO @id_kl, @firm, @fam

WHILE @@FETCH_STATUS=0

BEGIN

SELECT @message='Клиент '+@fam+

' Фирма '+ @firm

PRINT @message

SELECT @message='Наименование товара Дата

покупки Стоимость'

PRINT @message

DECLARE tovar_cursor CURSOR FOR

SELECT Товар.Название, Сделка.Дата,

Товар.Цена*Сделка.Количество AS

Стоимость

FROM Товар INNER JOIN Сделка ON Товар.

КодТовара=Сделка.КодТовара

WHERE Сделка.КодКлиента=@id_kl

OPEN tovar_cursor

FETCH NEXT FROM tovar_cursor

INTO @nam, @d, @p

IF @@FETCH_STATUS<>0

PRINT ' Нет покупок'

WHILE @@FETCH_STATUS=0

BEGIN

SELECT @message=' '+@nam+' '+

CAST(@d AS CHAR(12))+' '+

CAST(@p AS CHAR(6))

PRINT @message

SET @s=@s+@p

FETCH NEXT FROM tovar_cursor

INTO @nam, @d, @p

END

CLOSE tovar_cursor

DEALLOCATE tovar_cursor

SELECT @message='Общая стоимость '+

CAST(@s AS CHAR(6))

PRINT @message

-- переход к следующему клиенту--

FETCH NEXT FROM klient_cursor

INTO @id_kl, @firm, @fam

END

CLOSE klient_cursor

DEALLOCATE klient_cursor

Пример 6. Разработать прокручиваемый курсор для клиентов из Москвы. Если номер телефона начинается на 1, удалить клиента с таким номером и в первой записи курсора заменить первую цифру в номере телефона на 4.

DECLARE @firm VARCHAR(50),

@fam VARCHAR(50),

@tel VARCHAR(8),

@message VARCHAR(80)

PRINT ' Список клиентов'

DECLARE klient_cursor CURSOR GLOBAL SCROLL

KEYSET FOR

SELECT Фирма, Фамилия, Телефон

FROM Клиент

WHERE Город='Москва'

ORDER BY Фирма, Фамилия

FOR UPDATE

OPEN klient_cursor

FETCH NEXT FROM klient_cursor

INTO @firm, @fam, @tel

WHILE @@FETCH_STATUS=0

BEGIN

SELECT @message='Клиент '+@fam+

' Фирма '+@firm ' Телефон '+ @tel

PRINT @message

-- если номер телефона начинается на 1,

-- удалить клиента с таким номером

IF @tel LIKE ‘1%’

DELETE Клиент

WHERE CURRENT OF klient_cursor

ELSE

-- переход к следующему клиенту

FETCH NEXT FROM klient_cursor

INTO @firm, @fam, @tel

END

FETCH ABSOLUTE 1 FROM klient_cursor

INTO @firm, @fam, @tel

-- в первой записи заменить первую цифру в

-- номере телефона на 4

UPDATE Клиент SET Телефон=’4’ +

RIGHT(@tel,LEN(@tel)-1))

WHERE CURRENT OF klient_cursor

SELECT @message='Клиент '+@fam+' Фирма '+

@firm ' Телефон '+ @tel

PRINT @message

CLOSE klient_cursor

DEALLOCATE klient_cursor

Пример 7. Использование курсора как выходного параметра процедуры. Процедура возвращает набор данных – список товаров.

CREATE PROC my_proc

@cur CURSOR VARYING OUTPUT

AS

SET @cur=CURSOR FORWARD_ONLY STATIC FOR

SELECT Название FROM Товар

OPEN @cur

Пример 13.8. Использование курсора как выходного параметра процедуры.

Вызов процедуры и вывод на печать данных из выходного курсора осуществляется следующим образом:

DECLARE @my_cur CURSOR

DECLARE @n VARCHAR(20)

EXEC my_proc @cur=@my_cur OUTPUT

FETCH NEXT FROM @my_cur INTO @n

SELECT @n

WHILE (@@FETCH_STATUS=0)

BEGIN

FETCH NEXT FROM @my_cur INTO @n

SELECT @n

END

CLOSE @my_cur

DEALLOCATE @my_cur

Лабораторная работа 2.5 Система безопасности MS SQL Server 2008 R2

1 Описание работы и задания

Цель работы:

Задания:

Вопросы для самоконтроля:

2 Выполнение работы

2.1. Управление доступом. Общие сведения

Авторизация и аутентификация. Аутентификация — это процесс проверки права пользователя на доступ к тому или иному ресурсу. Чаще всего аутентификация осуществляется с помощью ввода имени и пароля.

MS SQL Server 2008 R2 поддерживает два режима аутентификации: с помощью Windows и с помощью SQL Server. Первый режим позволяет реализовать решение, основанное на однократной регистрации пользователя и едином пароле при доступе к различным приложениям (Single SignOn solution, SSO). Подобное решение упрощает работу пользователей, избавляя их от необходимости запоминания множества паролей и тем самым снижая риск их небезопасного хранения (вспомним стикеры с паролями, наклеенные на мониторы). Кроме того, данный режим позволяет использовать средства безопасности, предоставляемые операционной системой, такие как применение групповых и доменных политик безопасности, правил формирования и смены паролей, блокировка учетных записей, применение защищенных протоколов аутентификации с помощью шифрования паролей (Kerberos или NTLM).

Аутентификация с помощью SQL Server предназначена главным образом для клиентских приложений, функционирующих на платформах, отличных от Windows. Этот способ считается менее безопасным, но в MS SQL Server 2008 R2 он поддерживает шифрование всех сообщений, которыми обмениваются клиент и сервер, в том числе с помощью сертификатов, сгенерированных сервером. Шифрование также повышает надежность этого способа аутентификации. Для учетной записи SQL Server можно указать такой параметр, как необходимость сменить пароль при первом соединении с сервером (рис. 1).

Отметим такую мелочь, как обязательное требование непустого пароля пользователя sa – как ни странно, пустой пароль данной учетной записи является весьма распространенным проявлением беспечности администраторов баз данных (и самой любимой лазейкой для похитителей корпоративных данных).

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

В MS SQL Server 2008 R2 концепция ролей расширена: эта СУБД позволяет полностью отделить пользователя от схем и объектов базы данных. Теперь объекты базы данных принадлежат не пользователю, а схеме, не имеющей никакого отношения ни к каким учетным записям и тем более к административным привилегиям. Таким образом, схема становится механизмом группировки объектов, упрощающим предоставление пользователям прав на доступ к объектам (рис. 2).

Рис. 2. Установка прав для схем данных

Роли. Для упрощения управления правами доступа в большинстве серверных СУБД применяется механизм ролей – наборов прав доступа к объектам базы данных, присваиваемых некоторой совокупности пользователей. При использовании ролей управление распределением прав доступа к объектам между пользователями, выполняющими одинаковые функции и применяющими одни и те же приложения, существенно упрощается: создание роли и однократное назначение ей соответствующих прав осуществляется намного быстрее, нежели определение прав доступа каждого пользователя к каждому объекту. MS SQL Server 2008 R2 позволяет создавать так называемые вложенные роли, то есть присваивать одной роли другую со всеми ее правами. Это упрощает управление не только правами пользователей, но и самими ролями, создавая, к примеру, сходные между собой группы ролей.

MS SQL Server 2008 R2 также поддерживает так называемые роли для приложений (application roles), которые могут использоваться для ограничения доступа к объектам базы данных в тех случаях, когда пользователи обращаются к данным с помощью конкретных приложений. В отличие от обычных ролей, роли для приложений, как правило, неактивны и не могут быть присвоены пользователям. Их применение оказывается удобным в том случае, когда требования безопасности едины для всех пользователей, при этом не требуется аудит или иная регистрация деятельности конкретных пользователей в базе данных.

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

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

Нужно также проанализировать требования к правам доступа, предъявляемые клиентскими приложениями, и учесть эти требования при проектировании ролей и создании схем. Не стоит при этом забывать и о том, что списки пользователей и ролей следует не только единожды создать, но и постоянно актуализировать. Помимо вопросов управления доступом в клиентских приложениях, рекомендуется уделить внимание и управлению доступом в различных службах SQL Server.

Более подробно о политике безопасности в Microsoft SQL Server 2008 R2 можно ознакомиться по ссылке http://msdn.microsoft.com/ru-ru/library/bb283235.aspx.