d9e5a92d

Глава 6 Использование SQL-DMO

Понятие SQL-DMO

SQL-DMO (SQL Distributed Management Objects) — это предоставляемая Microsoft SQL Server объектная модель, которая основана на СОМ-технологии.

SQL-DMO скрывает детали структуры языка Transact-SQL и используется при написании административных приложений и сценариев для Microsoft SQL Server. Поставляемые с Microsoft SQL Server графические средства администрирования написаны с применением именно SQL-DMO, которая не является моделью интерфейса данных и не применяется для написания стандартных приложений баз данных.

SQL-DMO позволяет клиентскому приложению манипулировать такими объектами базы данных, как таблицы, процедуры и свойства сервера через интерфейс СОМ. Модель предоставляет приложению следующие возможности:

П управление таблицами (просмотр, создание, удаление, модификация);

П управление списком доступных серверов;

? управление правами доступа к серверам;

G управление списком баз данных на каждом сервере;

? управление сценариями таблиц базы данных;

? создание SQL-скриптов (таблиц, представлений, хранимых процедур, пользователей и их ролей);

? выполнение SQL-запросов.

Для того чтобы объекты SQL-DMO можно было использовать на конкретном компьютере, необходимо установить на нем клиентскую часть Microsoft SQL Server, который устанавливает библиотеку Microsoft SQL OLE Object Library. Данная библиотека представляет собой ActiveX-интерфейс к объектам SQL-DMO. Посредством SQL-DMO можно получать данные из таблиц SQL Server.

Особенно эффективно данную модель могут применять разработчики, использующие Microsoft SQL Server Desktop Engine (MSDE), который поставляется вместе с Access 2000. Этот сервер баз данных представляет собой промежуточный вариант SQL Server и был создан специально для сопряжения с более ранними версиями SQL Server. Хотя MSDE обладает меньшими возможностями, чем SQL Server, он поставляется бесплатно в составе Microsoft Office 2000. Однако версия MSDE, которая поставляется вместе с Microsoft Office 2000, не включает Enterprise Manager. В результате пользователи MSDE не могут оценить все преимущества графического интерфейса при управлении объектами базы данных.

В этой главе будут рассмотрены некоторые подходы к организации работы с объектами SQL Server (далее — SQL-сервер) при помощи SQL-DMO.

Получение списка доступных серверов

Для получения атрибутов SQL-сервера предназначен объект SQLDMO. SQLServer^ В листинге 6.1 приведен пример вывода списка доступных серверов.

Г--Т---------------------------------- -----------------------------------.---:--------------- --------------

Листинг 6,1. Получение списка доступных серверов.....

ПЯНК................г.................._________________________________________o.x.jxl

Попытка

// Создаем объект SQLServer^

// SQLServer2 - предназначен для получения атрибутов MS SQL Server

oSQLServer2 = СоздатьОбъект("SQLDMO.SQLServer2");

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-

КонецПопыт ки;

oSQLServer2.LoginTimeout = 10; oSQLServer2.ODBCPrefix = 0;

// Вывод имен общих SQL-серверов

ServerNameList = oSQLServer2 .Application. ListAvailableSQLServers () Для Ном = 1 По ServerNameList. Count Цикл Сообщить(ServerNameList.Item(Ном));

КонецЦикла;

// Вывод локальных общих SQL-серверов

InstanceNameList = oSQLServer2.Listlnstalledlnstances();

229_

Для Ном = 1 По InstanceNameList.Count Цикл Сообщить(InstanceNameList.Item(Ном));

КонецЦикла;

В приведенном примере свойство oSQLServer2 . LoginTimeout предназначено для определения числа секунд, во время которого будут происходить попытки подключиться. Свойство oSQLServer2.0DBCPrefix управляет выводом ошибок.

Перечисление спецификаций баз данных

Для того чтобы работать с объектами SQL-DMO, необходимо подключиться к выбранному серверу (листинг 6.2).

; Листинг 6.2. Подключение к объекту sqldmo. SQLServer

_ _______________¦ .........¦ . . I. . . .... ' •' : " ¦ ¦¦ ¦ •

// Создаем экземпляр объекта сервера и подсоединиться к нему SQLServer = СоздатьОбъект("SQLDMO.SQLServer");

SQLServer.LoginTimeout = -1;

Попытка

Если ИспользоватьЫТАвторизацию = 1 Тогда // Использовать авторизацию WinMT SQLServer.LoginSecure = 1;

// При разрыве соединения - автоматически повторно не соединяться

SQLServer.AutoReConnect = 0;

// Подключение к серверу

SQLServer.Connect(ИмяСервера); ¦

Иначе

// Использовать SQL Server авторизацию

SQLServer.LoginSecure = 0;

// При разрыве соединения - автоматически повторно не соединяться

SQLServer.AutoReConnect = 0;

// Подключиться с использованием SQL Security

SQLServer.Connect(ИмяСервера, СокрЛП(Пользователь), СокрЛП(Пароль)); КонецЕсли;

Исключение

Сообщить(ОписаниеОшибки());

Возврат,-

КонецПопытки;

В приведенном примере после объявления объекта SQLServer, из библиотеки SQL-DMO, программа генерирует экземпляр этого объекта и подсоединяет его к серверу КмяСеовера. В листинге 6.2 приведена программа, реализующая два варианта подключения к SQL-серверу — с помощью NT авторизации, и без нее. Для соединения с SQL-сервером используется метод connect, в который передается имя сервера, а в случае подключения с помощью SQL Security, еще имя и пароль пользователя. Как правило, при разработке с применением SQL-DMO необходимо пользоваться именем пользователя и паролем, которые предоставляют широкие полномочия, поскольку SQL-DMO используется для программирования административных функций.

При определении времени подключения к серверу в свойстве SQLServer.LoginTimeout установлено значение -1, которое обозначает стандартное время завершения по истечении 60 секунд.

После того как произошло соединение, можно вывести спецификации всех существующих на сервере баз данных (листинг 6.3).

шшммшиц——нпнпншитп№випшнвннв|

Листинг 6.3. ' Перечисление спецификаций баз данных

. ......./МяВИЯшШШЯЯШві’^——— — --^ЯНВЯВЩЯНшНЯННЯннВнННЯННІ

Для iCount = 1 По SQLServer.Databases.Count Цикл // Выводим только НЕ системные БД

Если SQLServer.Databases.Item(iCount).SvstemObject = 0 Тогда БазаДанных = SQLServer.Databases.Item(iCount);

Сообщить ("База данных: " + БазаДанных.Name);

Сообщить("Дата создания:" + БазаДанных.CreateDate);

Сообщить("Количество таблиц:" + БазаДанных.Tables.Count);

Сообщить("Количество представлений:" + БазаДанных.Views.Count); Сообщить("Количество процедур:" + БазаДанных.StoredProcedures.Count); КонецЕсли;

КонецЦикла;

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

Получение списка таблиц и спецификаций полей

Чтобы получить доступ к спецификации каждой таблицы базы данных, необходимо создать объект sqldmo.Table, который позволяет манипулиро-

вать со структурой конкретной таблицы. Элементы типа Table содержатся в коллекции Database.Tables. Для того чтобы перебрать все элементы коллекции, существует два способа. Первый — в цикле, с помощью метода item, получать элементы коллекции, указывая в параметре порядковый номер таблицы (листинг 6.4). Свойство Database.Tables.Count возвращает количество таблиц в базе данных. Второй — с помощью конструкции для каждого...из...Цикл...конецЦикла, которую можно использовать только в версии 8.0 системы "1С:Предприятие".

Листинг 6.4. Получение списка таблиц

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database"); Database = SQLServer.Databases(ИмяБазыДаных);

Для Ном = 1 По Database,Tables.Count Цикл // Выводим только НЕ системные таблицы

Если Database.Tables.Item(Ном),SystemObject = 0 Тогда Сообщить(Database.Tables.Item(Ном).Name);

КонецЕсли;

КонецЦикла;

В программном коде, показанном в листинге 6.4, выводятся имена всех таблиц базы данных. С помощью свойства Systemobject объекта Table отсекаются системные таблицы.

Зная имена таблиц, можно получить спецификацию каждого ее поля — имя, тип, длина поля, признак первичного ключа, признак возможности содержать пустые значения. Для этих целей у объекта Table существует коллекция columns, которая содержит сведения о каждом поле таблицы.

Рассмотрим пример, в котором, помимо имен таблиц, выводятся названия полей и их спецификация (листинг 6.5).

Листинг 6.5. Получение спецификации полей таблиц .....

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазыДаных);

// Объект таблица

Table = СоздатьОбъект("SQLDMO.Table")

Для Ном = 1 По Database.Tables.Count Цикл // Выводим только НЕ системные таблицы Если Database.Tables.Item(Ном).SystemObject = 0 Тогда // Выводим имя таблицы

ИмяТаблицы = Database.Tables.Item (Ном).Name; Сообщить("Имя таблицы:" + ИмяТаблицы)

Table = Database.Tables(ИмяТаблицы);

/ / Цикл по полям

Для НомерПоля = 1 По Table,Columns.Count Цикл Column = Table.Columns.Item(НомерПоля);

Сообщить("Имя поля: + Column.Name);

Сообщить("Тип данных: " + Column.DataType);

Сообщить ("Длина данных: " + Column. Length) ;

Сообщить ("Это первичный ключ: " + ? (Column.InPrimaryKey = -1, "Да", "Нет"));

Сообщить("Может принимать пустые значения: " + ?

(Column.AllowNulls = -1, "Да", "Нет"));

КонецЦикла;

КонецЕсли;

КонецЦикла;

Листинг 6.5 демонстрирует, как производится выборка элементов коллекции таблиц Tables внутри базы данных. Объекты Table, в свою очередь, обладают иерархически организованными коллекциями объектов и отдельными объектами. Каждая таблица обязательно имеет коллекцию столбцов Columns, но у любой таблицы может иметься единственный объект PrimaryKey, соответствующий первичному ключу. Коллекция Keys ключей таблицы содержит ссылки на все ограничения первичного ключа таблицы и внешних ее ключей.

Объект Column имеет следующие основные свойства:

О Name - ИМЯ ПОЛЯ;

О DataType — строковое представление типа значений для поля (например, varchar, int И Т. П.);

О Length — максимально допустимая длина значения;

InPrimaryKey — признак первичного ключа — обозначает, что данное поле является первичным ключом, о — нет);

П AllowNulls — признак возможности содержать пустые значения (-1 — поле может принимать пустые значения, о — не может).

Получение списка представлений

С помощью коллекции views объекта Database можно получить доступ к представлениям, которые определены в базе данных. Для обхода элементов коллекции views можно воспользоваться все тем же свойством count, которое возвращает общее количество представлений, и методом item, который получает объект view (представление) по его номеру (листинг 6.6). Так же допустим просмотр элементов коллекции с помощью конструкции Для каждого...из...Цикл...КонецЦикла.

........................................................................т .......-1”".......

Листинг 6.6. Получение, списка представлений

ТМіі_________________....___.......

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database"); Database = SQLServer.Databases(ИмяБазьЩаных);

Для Ном = 1 По Database,Views.Count Цикл

// Выводим только НЕ системные представления Если Database.Views.Item(Ном).SystemObject = 0 Тогда Сообщить(Database.Views.Item(HoM).Name);

КонецЕсли;

КонецЦикла,-

Данный пример выводит список имен всех представлений базы данных.

Получение списка хранимых процедур

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

Листинг 6.7. Получение списка хранимых процедур

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазьЩаных);

Для Ном = 1 По Database.StoredProcedures.Count Цикл // Выводим только НЕ системные процедуры

Если Database.StoredProcedures.Item!Ном) .SystemObject = О Тогда

// Выводим имя хранимой процедуры

Сообщить(Database.StoredProcedures.Item(Ном).Name);
КонецЕсли;

КонецЦикла;

Изменение структуры баз данных

Создание и удаление баз данных

Для добавления новой базы данных на SQL-сервер предназначен все тот же объект sqldmo. Database. При этом затрагиваются еще два дополнительных объекта:

? sqldmo. DBFile — объект физического файла базы данных;

? sqldmo.LogFile — объект физического файла транзакций.

Для регистрации новой базы данных на сервере необходимо сначала создать физический файл базы данных и файл транзакции.

Рассмотрим пример создания новой базы данных с именем NewDB (листинг 6.8).

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект файла базы данных

DBFileData = СоздатьОбъект("SQLDMO.DBFile");

// Объект файла транзакций

LogFile = СоздатьОбъект("SQLDMO.LogFile");
// Имя новой БД

ИмяНовойБазыДанных = "NewDB";

// Установить имя новой БД Database.Name = ИмяНовойБазыДанных;

// Определяем свойства файла БД DBFileData.Name = ИмяНовойБазыДанных;

DBFileData.PhysicalName = SQLServer.Registry.SQLDataRoot + "\DATA\" +

ИмяНовойБазыДанных + ".тсНУ5;

DBFileData.PrimaryFile = 1;

DBFileData.Size = 2;

DBFileData.FileGrowth = 1;

// Добавим файл базы данных

Database.FileGroups("PRIMARY").DBFiles.Add(DBFileData);

// Определяем свойства файла транзакций

LogFile.Name = ИмяНовойБазыДанньк + "Log";

LogFile.PhysicalName = SQLServer.Registry.SQLDataRoot + "\DATA\" +

LogFile.Name+ ".ldf";

LogFile.Size = 2;

// Добавим файл транзакций базы данных

Database.TransactionLog.LogFiles.Add(LogFile);

// Создадим БД Попытка

SQLServer.Databases.Add(Database);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Из приведенного выше кода видно, что сначала создаются объекты базы данных Database, физического файла DBFileData и файла транзакций LogFile. Затем, С ПОМОЩЬЮ СВОЙСТВ Database. FileGroups ( "PRIMARY" ) . DBFiles И Database . TransactionLog , LogFiles, добавляются соответственно объекты файла базы данных и файла транзакций. Только после этого база данных регистрируется на сервере.

Рассмотрим основные свойства объекта DBFile.

О Name — имя файла.

О PhysicalName — физическое местонахождение файла.

П PrimaryFile — признак основного файла базы данных.

? Size — начальный размер файла в мегабайтах (необязательное свойство).

? FileGrowth — признак, определяющий, что необходимо хранить в базе данных (таблицу, индекс, или регистрационные данные).

Рассмотрим основные свойства объекта LogFile.

G Name — ИМЯ файла.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

Для определения типа данных и максимальной длины значения каждого столбца используются соответственно свойства Datatype и Length. В коде, представленном в листинге 6.9, например, столбец Prod ID относится к типу целочисленных данных int; столбец ProdName — к символьному типу данных переменной длины varchar.

Доступные типы данных представлены в табл. 6.1.

Таблица 6.1. Типы данных полей, доступные в SQL-DMO

Идентификатор Описание

bigint

int

smallint

tinyint

bit

decimal

numeric

money

smallmoney

float

real

datetime

smalldatetime

char

Table.FileGroup = "PRIMARY”;

// Создаем колонки

// Добавить целочисленный тип данных

Columnl = СоздатьОбъект("SQLDMO.Column"); Column! . Name = "ProcilD";

Columnl.Datatype = "int";

Table.Columns.Add(Columnl);

// Добавить тип данных символьной строки

Column2 = СоздатьОбъект("SQLDMO.Column"); Column2.Name = "ProdName";

Column2.DataType = "varchar";

Column2.Length = 25;

Table.Columns.Add(Column2);

// Добавить еще один целочисленный тип данных

СоІитпЗ = СоздатьОбъект("SQLDMO.Column"); Column3.Name = "Price";

СоІитпЗ. DataType = "money";

Table.Columns.Add(СоІитпЗ);

// Добавить десятичный тип данных

Column4 = СоздатьОбъект("SQLDMO.Column"); Column!.Name = "ProdWeight";

Column4 . DataType = "decimal”;

Column4.NumericPrecision = 9;

Column4.NumericScale = 5;

Table.Columns.Add(Column4);

// Очистить объекты Columnl =

Column2 = "" ; СоІитпЗ =

Column4 =

// Перед добавлением новой таблицы в назначенную базу данных // удалить предыдущую версию таблицы, если она существует

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

Для определения типа данных и максимальной длины значения каждого столбца используются соответственно свойства Datatype и Length. В коде, представленном в листинге 6.9, например, столбец Prod ID относится к типу целочисленных данных int; столбец ProdName — к символьному типу данных переменной длины varchar.

Доступные типы данных представлены в табл. 6.1.

Таблица 6.1, Типы данных полей, доступные в SQL-DMO

Идентификатор Описание

Целочисленный тип, от -263(-9 223372 036854 775808) до 263 (9 223372 036854 775807)

Целочисленный тип, от -231 (-2147483 648)до23’ (2147483 647)

Целочисленный тип, от 215 (-32 768) до 215 (32 767)

Целочисленный тип, от 0 до 255

Целочисленный тип, 0 или 1

Тип с фиксированной точностью, от до 1038

Эквивалентно типу decimal

Денежный тип, от -263 (-922 337 203 685 477.5808) до 263 (+922 337 203 685 477.5807)

Монетный тип, от -214 748.3648 до +214 748.3647

Числовой тип с плавающей запятой, до по 1.79Е+308

Числовой тип с плавающей запятой, от -3.40Е+38 до 3.40Е+38

Дата и время, начиная с 1 января 1753 по 31 декабря 9999 с точностью до 3.33 миллисекунд

Дата и время, начиная с 1 января 1900 по 6 июля 2079 с точностью до одной минуты

Строка фиксированной длины (не Unicode), максимально допустимая длина — 8000 символов

bigint

int

smallint

tinyint

bit

decimal

numeric

money
real

float
datetime
char
Таблица 6.1 (окончание)
Идентификатор Описание
varchar

Строка переменной длины (не Unicode), максимально допустимая длина — 8000 символов
Строка переменной длины (не Unicode), максимально допустимая длина — 231 (2 147483 647) символов

text

nchar

nvarchar

ntext

binary

varbinary

image

cursor

sql_variant

table

timestamp

uniqueidentifier

Строка фиксированной длины (Unicode), максимально допустимая длина — 4000 символов

Строка переменной длины (Unicode), максимально допустимая длина — 4000 символов

Строка переменной длины (Unicode), максимально допустимая длина — 230 (1 073 741 823) символов

Двоичные данные фиксированной длины до 8000 байт

Двоичные данные переменной длины до 8000 байт

Двоичные данные переменной длины до 231 (2 1 47 483 647) байт

Ссылка на курсор

Любой тип данных, поддерживаемый SQL Server

Специальный тип данных, используемый в качестве хранилища результата обработки данных

Уникальный номер в пределах базы данных

Глобальный уникальный идентификатор (GUID)

Как видно из приведенного примера, определение столбцов таблицы реализуется в три этапа.

На первом этапе необходимо создать экземпляр столбца.

На втором — код должен настроить этот столбец, присвоив значения таким его свойствам, как название Name и тип данных DataType. Определяемые свойства могут меняться в зависимости от типа данных столбца. К примеру, для столбца, принадлежащего целочисленному типу данных int, достаточно настроить всего два свойства — имя и тип данных. В то же время столбец, относящийся к типу данных varchar, требует определения значений как минимум трех свойств — названия (Name), типа данных (DataType) и длины (Length).

Третий этап создания столбца предусматривает инициирование метода добавления Add, который и добавит созданный столбец в коллекцию столбцов Columns рассматриваемой таблицы.

С помощью метода Database. Tables. Add происходит добавление таблицы к подключенной базе данных. До начала добавления таблицы метод Remove

удаляет из базы данных все ранние версии этой таблицы. После этого код вычищает все дочерние объекты.

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

Теперь рассмотрим пример создания таблицы заказов Orders (листинг 6.10). У этой таблицы имеется первичный ключ, построенный по столбцу с активизированным свойством идентичности identity. Приведенный пример кода во многом напоминает код из листинга 6.9, за исключением перевода свойства AllowNulis третьего столбца в состояние -1.

Листинг 6.10. Создание таблицы заказов Orders

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект новой таблицы

Table = СоздатьОбъект("SQLDMO.Table");

// Имя базы данных

ИмяБазыДанных = "TestDB"

// Имя новой таблицы

ИмяТаблицы = "Orders";

Database = SQLServer.Databases(ИмяБазыДанных); Table.Каше = ИмяТаблицы;

Table.FileGroup = "PRIMARY",-

// Создаем колонки

// Добавить целочисленный тип данных Columnl = СоздатьОбъект("SQLDMO.Column"); Columnl.Name = "OrderlD";

Columnl.Datatype = "int";

Coluinnl.AllowNulls = 0;

Columnl.Identity = -1;

Columnl.IdentitySeed = 1000;

Columnl.IdentityIncrement = 10;

Table.Columns.Add(Columnl);

// Добавить столбец со свойством Identity, который будет служить перппчкым ключом таблицы

Кеуі = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "OrdersPK"; ¦

Keyl.Type = 1 ;

Keyl.Clustered = -1;

Keyl.KeyColumns.Add(Columnl.Name);

Table.Keys.Add(Keyl);

// Добавить временной тип данных datetime Column2 = СоздатьОбъект("SQLDMO.Column");

Column2.Name = "OrderDate";

Column2 . DataType = "datetime";

Table.Columns.Add(Column2);

// Добавить тип данных datetime, допускающий неопределенные значения

СоІитпЗ = СоздатьОбъект("SQLDMO.Column");

СоІитпЗ.Name = "ShippedDate";

СоІитпЗ . DataType = "datetime" ;

СоІитпЗ.AllowNulls = -1;

Table.Columns.Add(СоІитпЗ);

// Перед добавлением новой таблицы в назначенную // базу данных удалить предыдущую версию таблицы,

// если она существует.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу •

Database.Tables.Add(Table);

// Очистить объекты Columnl =

Column2 =

СоІитпЗ =

Код, приведенный в листинге 6.10, создает таблицу заказов с именем Orders. Таблица orders содержит столбец идентификатора заказа OrderiD; столбец orderDate, в который заносится дата ввода заказа, а также столбец shippeciDate, в который записывается дата отправки заказа. Столбец Order id служит первичным ключом таблицы, а столбец ShippedDate может содержать неопределенные значения NULL. Чтобы заставить SQL Server автоматически формировать значения первичного ключа для новых строк, процедура активизирует свойство identity, присваивая ему значение -1 (истина или True). При этом исходное значение равно 1000, а приращение составляет После добавления в проект таблицы столбца со свойством identity создается экземпляр кеуі ключевого объекта Key. Затем присваиваются значения свойствам Name и туре объекта Кеуі, которые содержат соответственно название и тип данных. Все возможные значения свойства туре объекта Key приведены в табл. 6.2.

Таблица 6.2. Типы ключей SQL-DMO
Константа SQL-DMO Значение Описание
SQLDMOKey Foreign 3 Внешний ключ
syr. оно Key Primary 1 Первичный ключ
SQLDMOKey Unique 2 Уникальное поле, не допускающее значение

NULL
SQLDMOKey Unknown. О Ошибочное значение
Свойству Clustered объекта Key 1 присваивается значение -1 (истина или True). В результате уникальный индекс первичного ключа строится в виде кластеризованного индекса для всей таблицы Orders. Прежде чем добавить ключ Кеуі в коллекцию ключей Keys таблицы Orders, необходимо указать хотя бы один объект из класса столбцов, который будет поставлен в соответствие первичному ключу. В приведенном примере в этой роли выступает столбец OrderiD, у которого активизировано свойство identity.

Во все столбцы (листинг 6.9) и в два первых столбца (листинг 6.10) необходимо вводить определенные значения. Иное дело третий столбец — ShippedDate (листинге 6.10). В нем могут находиться неопределенные значения NULL, поскольку дата фактической отправки заказа неизвестна на момент ввода сведений о заказе. Она вводится в столбец shippedDate позднее, когда заказ уже отправлен. Поэтому в третьем столбце присваивается значение -1 свойству AllowNuiis, после чего можно помещать в него неопределенные значения. По умолчанию значение этого свойства равно о (ложь или False),

Таблица товаров Products (листинг 6.9) и таблица заказов orders (листинг 6.10) связаны между собой отношением "миогие-ко-мшогим". Такое

отношение имеет место потому, что один и тот же товар может войти в один или несколько заказов, а каждый заказ может включать многие товары. Чтобы отразить такое отношение в разрабатываемом проекте базы данных, необходимо внести в него два изменения. Во-первых, нужно переделать проект таблицы товаров Products таким образом, чтобы у нее тоже появился первичный ключ. Во-вторых, необходимо добавить в базу данных новую таблицу, которая свяжет таблицы Products и orders. В этой таблице будут храниться общие данные доменов обеих таблиц. К примеру, в ней можно хранить количество определенного товара, которое указывается в отдельной строке заказа. Новую таблицу, которая связывает таблицы Products И Orders, назовем OrderDetails.

В листинге 6.11 приведен пример создания таблицы связей OrderDetails. У этой таблицы имеются внешние ключи, которые ссылаются на таблицы

Orders И Products.

[ Листинг 6.11. Создание таблицы с подробными сведениями о заказах : OrderDetails S

UrU.i :_________________________._______________!____________________'______..........----... . ¦ ............. ..-------1 ,.. ... . .:. L_

// Объект базы данных

Database = СоздатьОбъект("SQLDMO.Database");

// Объект новой таблицы

Table = СоздатьОбъект("SQLDMO.Table");

// Имя базы данных

ИмяБазыДанных = "TestDB";

// Имя новой таблицы

ИмяТаблицы = "OrderDetails";

Database = SQLServer.Databases(ИмяБазыДанных); Table.Name = ИмяТаблицы;

Table.FHeGroup = "PRIMARY" ;

//Создаем колонки

// Добавить целочисленный тип данных

Columnl = СоздатьОбъект("SQLDMO.Column"); Column!.Name = "OrderID";

Columnl.Datatype = "int";

Table.Columns.Add(Columnl);

// Добавить целочисленный тип данных

Со1итп2 = СоздатьОбъект("SQLDMO.Column");

Column2 . Name = "ProdlD";

Column2. DataType = "int",

Table.Columns.Add(Column2);

// Добавить внешний ключ, указывающий на таблицу Orders

Keyl = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "OrderTDFK";

Keyl.Type = 3 ;

Keyl.KeyColumns.Add(Columnl.Name);

Keyl.ReferencedTable = "Orders",-Keyl.ReferencedColumns.Add("OrderlD");

Table.Keys.Add(Keyl);

// Добавить внешний ключ, указывающий на таблицу Products Кеу2 = СоздатьОбъект("SQLDMO.Key");

Keyl.Name = "ProdIDt’K";

Key!.Type = 3 -

Key2.KeyColumns.Add(Column2.Name);

Key2 . ReferencedTable = " Products" -

Key2.ReferencedColumns.Add("ProdID");

Table.Keys.Add(Key2);

// Добавить первичный ключ, состоящий из двух столбцов КеуЗ = СоздатьОбъект("SQLDMO.Key");

Key3.Name = "OrderlDAndProdlDPK";

КеуЗ.Type =

КеуЗ.Clustered = -1,

КеуЗ.KeyColumns.Add(Columnl.Name);

КеуЗ.KeyColumns.Add(Column2.Name);

Table.Keys.Add(КеуЗ) ;

// Добавить целочисленный тип данных

СоІитпЗ = СоздатьОбъект("SQLDMO.Column");

Column3.Name = "Quantity";

СоІитпЗ.DataType = "int";

Table.Columns.Add(СоІитпЗ);

// Перед добавлением новой таблицы в назначенную // базу данных удалить предыдущую версию таблицы,

// если она существует.

Попытка

Database.Tables(ИмяТаблицы).Remove();

Исключение

КонецПопытки;

// Добавляем новую таблицу

Database.Tables.Add(Table);

// Очистить объекты

Columnl =

Column2 =

СоІитпЗ =

Код, приведенный в листинге 6.1 I, показывает также синтаксис, применяемый при построении первичного ключа на основе нескольких столбцов. Код, создающий внешний ключ, начинается с генерации экземпляра объекта ключа Key. После присвоения имени этому объекту, его свойству туре присваивается признак внешнего ключа (значение з). Вслед за этим добавляется свойство Name объекта Key, содержащее название этого столбца, в принадлежащую ключу коллекцию названий ключевых столбцов KeyColumns. В соответствии со спецификацией столбец OrderiD таблицы orderDetails назначается локальным столбцом внешнего ключа. Затем происходит назначение таблицы orders и ее столбца Order id соответственно таблицей и столбцом, на которые будут формироваться ссылки. После настройки всех этих свойств программный код, формирующий первый внешний ключ, завершает свою работу добавлением созданного ключа в коллекцию ключей Keys таблицы orderDetails. После этого создается внешний ключ, который будет указывать на столбец идентификатора товара Р rod id в таблице товаров Products ИЗ столбца ProdID таблицы OrderDetails.

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

Для того чтобы удалить поле таблицы, необходимо воспользоваться методом Column. Remove где идентификатор Column является объектом удаляемого поля.

Создание SQL-скриптов

В листинге 6.4 был приведен пример получения списка таблиц, имеющихся в базе данных. Аналогичным образом, через объект Database. Tables, можно сгенерировать SQL-скрипт, который можно использовать для создания таблиц в другой базе или на другом сервере.

В листинге 6.12 приведен пример генерации SQL-скрипта для создания таблицы customers, находящейся в базе данных Northwind, входящий в поставку продукта Microsoft SQL Server 7.0/2000.

L-скрипта создания таблицы Customers

Листинг 6.12. Генерация SQ базы данных Northwind

-------• .. --------і----

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases("Northwind");

// Выводим скрипт

Сообщить(Database.Tables.Item("Customers").Script())

SQL-скрипт, созданный в результате выполнения приведенного выше кода, представлен в листинге 6.!3.

! Листинг 6.13. SQL-скрипт создания таблицы customers

CREATE TABLE [Customers] (

[CustomerlD] [nchar] (5) COLLATE Cyrillic_General_CI_AS NOT NULL , [CompanyNamej [nvarchar] (40) COLLATE Cyrillic_General_CI AS NOT NULL [ContactName] [nvarchar] (30) COLLATE Cyrillic_General_CI_AS NULL , [ContactTitle] [nvarchar] (3 0) COLLATE Cyrillic_General_CI_AS NULL , [Address] [nvarchar] (60) COLLATE Cyrillic_General_CI_AS NULL ,

[City] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,

[Region] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL , [PostalCode] [nvarchar] (10) COLLATE Cyrillic_General_CI_AS NULL , [Country] [nvarchar] (15) COLLATE Cyrillic_General_CI_AS NULL ,

[Phone] [nvarchar] (24) COLLATE Cyrillic^General_CI_AS NULL ,

[Fax] [nvarchar] (24) COLLATE NULL ,

CONSTRAINT [ PK_ Customers] PRIMARY KEY CLUSTERED

(

[CustomerlD]

) ON [PRIMARY]

) ON [PRIMARY]

GO

В листинге 6.12 показано, что получить ссылку на объект таблицы можно не только по его номеру, как это было показано в листинге 6.4, но и по имени.

Метод script возвращает строковое выражение скрипта соответствующего объекта. В листинге 6.14 приведен пример генерации полного SQL-скрипта создания базы данных, включающий:

? сценарий создания таблиц;

П сценарий создания представлений;

О сценарий создания хранимых процедур;

О сценарии создания пользователей;

О сценарии создания ролей.

Листинг 6.14, Генерация полного SQL-скрипта создания базы данных

Database = СоздатьОбъект("SQLDMO.Database");

Database = SQLServer.Databases(ИмяБазыДанных);

СтрокаСценария =

Попытка

// Сценарий создания таблиц

Для Ном = 1 По Database.Tables.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Tables.Item(Ном).Script();

КонецЦикла;

// Сценарий создания представлений

Для Ном = 1 По Database.Views.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Views.Item(Ном).Script(); КонецЦикла;

// Сценарий создания хранимых процедур

Для Ном = 1 По Database.Stc-redProcedures.Count Цикл

СтрокаСценария = СтрокаСценария + Database .StoredProcedures.Item(Ном).Script();

КонецЦикла;

// Сценарии создания пользователей

Для Ном По Database.Users.Count Цикл

СтрокаСценария = СтрокаСценария + Database.Users.Item(Ном).Script();

КонецЦикла;

// Сценарии создания ролей

Для Ном = 1 По Database.DatabaseRoles.Count Цикл

СтрокаСценария = СтрокаСценария +

Database.DatabaseRoles.Item(Ном).Script();

КонецЦикла;

Текст = СоздатьОбъект("Текст");

Текст.ДобавитьСтроку(СтрокаСценария);

Текст.Показать("Полный скрипт создания базы данных",);

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Выполнение SQL-запросов

В SQL-DMO, помимо административных задач, можно получать выборки данных с помощью SQL-запросов. Для данных целей предназначен метод ExecuteWithResults объекта Database. Метод ExecuteWithResults имеет единственный параметр — строку SQL-запроса и возвращает объект типа

QueryResults.

Рассмотрим основные свойства объекта QueryResults.

П ROWS — возвращает количество записей в результирующей таблице запроса;

О Columns — возвращает количество полей в результирующей таблице запроса;

? Column Туре (номерКолонки) — возвращает тип соответствующего поля (все возможные типы перечислены в табл. 6.3);

О ColumnName (НомерКолонки) — возвращает имя соответствующего поля.

Таблица 6.3. Типы полей объекта QueryResults
Константа SQL-DMO Значение Описание
SQLDMO DTypeBigint -5 Целочисленный тип bigint
SQLDMO DTypeBinary -2 Двоичный тип фиксированной длины
SQLDMO_DTypeBit -7 Положительный целочисленный тип
SQLDMO DTypeChar 1 Строковый тип фиксированной длины
Таблица 6.3 (окончание)

























SQLDMO DtypeSQLVariant -150













Специальный тип ODBC —

SQL TIMESTAMP STRUCT

Специальный тип ODBC —

SQL TIMESTAMP STRUCT

Числовой тип с плавающей запятой (4 байта)

Числовой тип с плавающей запятой (8 байт)

Глобальный уникальный идентификатор (GUID)

Двоичный тип переменной длины

Положительный числовой тип (1 байт)

Числовой тип со знаком (2 байта)

Числовой тип со знаком (4 байта)

Денежный тип

Расширенный денежный тип

Расширенный строковый тип (Unicode)

Любой тип данных, поддерживаемый SQL Server

Расширенный строковый тип

Строковый тип фиксированной длины (Unicode)

Ошибочный тип

Строковый тип переменной длины (Unicode)

Двоичный тип переменной длины Строковый тип переменной длины

Основной метод GetColumnString объекта QueryRe.su.lts позволяет получить значение результата запроса, находящееся в определенной строке и поле. Метод GetColumnString имеет два параметра — номер строки и номер колонки (поля).

В листинге 6.15 приведен пример выполнения SQL-запроса и вывода результата на экран в виде таблицы значений.

Листинг 6.15. Общий алгоритм выполнения SQL-запросов

Попытка

ИмяБазыДанных = "Northwind";

СтрокаЗапрсса = "SELECT FROM Customers Т3_3апроса = СоздатьОбъект("ТаблицаЗначений"); .

Состояние("Выполнение запроса

QueryResults = SQLServer.Databases(ИмяБазыДанных).ExecuteWithResults (СтрокаЗапроса);

Состояние("Преобразование данных...;

// Заполняем таблицу, перебирая результаты запроса по строкам

Для НомерСтроки = 1 по QueryResults.Rows Цикл Если НомерСтроки = 1 Тогда

// Формируем колонки в таблице с именами,

// взятыми из результатов запроса и соответствующего типа

Для НомерКолонки = 1 по QueryResults,Columns Цикл // Вставляем колонку

ТЗ_Запроса.ВставитьКолонку(QueryResults.ColumnName (НомерКолонки), НомерКолонки, "Строка",,,

QueryResults.ColumnName (НомерКолонки),15,);

КонецЦикла;

Коне дЕ ели;

// Добавляем строчку

ТЗ_Запроса.НоваяСтрока();

// Поколоночно пишем в таблицу данные

Для НомерКолонки = 1 по QueryResults.Columns Цикл

ТЗ_Запроса.УстановитьЗначение(НомерСтроки, НомерКолонки, QueryResults.GetColumnString(НомерСтроки,НомерКолонки));

КонецЦикла;

КонецЦикла;

// Показать таблицу

ТЗ_Запроса.ВыбратьСтроку();

Исключение

Сообщить(ОписаниеОшибки());

Возврат;

КонецПопытки;

Данный пример является универсальным, т. е. в переменную Строказапроса можно поместить произвольный текст запроса, и при этом по-прежнему будет корректно выводиться результат выполнения запроса. Это достигается благодаря наличию свойств ROWS, columns и CoiumnName у объекта Query Re suit .5. В результате обработки объекта QueryRe suits получаем таблицу значений, содержащую результаты выполнения запроса.

Таким образом, как следует из данного примера, общий алгоритм выполнения произвольного запроса следующий:

1. С ПОМОЩЬЮ метода ExecuteWithResults объекта Database Получаем объект QueryResults, содержащий результат выполнения запроса.

2. Для инициализации колонок результирующей таблицы значений обходим все поля объекта QueryResuits, с помощью свойства CoiumnName получаем имена полей, после чего создаем одноименные колонки в таблице значений. Количество полей определяется свойством columns.

3. Построчно обходим все записи объекта QueryResuits. Количество записей определяется свойством ROWS.

4. Для каждой записи обходим все поля объекта QueryResuits, с помощью метода GetCoiu-nnstrine получаем значения соответствующих ячеек и помещаем их в результирующую таблицу значений.

Резервирование и восстановление базы данных

Для создания резервной копии базы данных предназначен объект Backup. Рассмотрим основные свойства этого объекта.

? Action — свойство, определяющее, по отношению к чему выполнять действия резервирования данных (возможные значения свойства перечислены в табл. 6.4);

П Database — имя резервируемой базы данных;

П Files — имя файла резервных данных;

О MediaName — дополнительное описание, помогающее в идентификации резервной копии;

? BackupSetDescription — основное описание резервной копии;

П BackupSetName — идентификатор резервной копии.

Метод 3QL3sckup объекта Backup предназначен для создания резервной копии и, имеет один параметр — ссылку на объект SQLServer.

Таблица 6.4. Возможные значения свойства Action объекта Backup

SQLDMOBackup_Database

SQLDMOBackup_Files

SQLDMOBackup Incremental

SQLDMOBackup Log

Резервирование всей базы данных

Резервирование только определенных файлов

Дифференциальное резервирование, т. е. копируются файлы, созданные или измененные с момента последнего резервирования

Резервирование только файла транзакций

В листинге 6.16 приведен пример полного резервирования базы данных Northwind в файл C:\BACKUP\Northwind.bak.

F................... ..............—----------------------------------- ------------------------ Л........ .....................Р

і Листинг 6.16. Создание резервной копии базы данных Northwind

Backup = СоздатьОбъект("SQLDMO.Backup");

Backup.Act ion = 0;

Backup.Database = "Northwind";

Backup.Files = "C:\BACKUP\Northwind.bak";

Backup.MediaName = "Northwind.bak " + РабочаяДата() + " " +

ТекущееВремя ();

Backup.BackupSetName = "Northwind";

Backup. BackupSetDescr-iption = "Резервная копия";

Backup.SQLBackup(SQLServer);

Для восстановления созданной ранее резервной копии предназначен объект Restore.

Рассмотрим основные свойства этого объекта.

О Action — описывает по отношению к чему выполнять восстановление данных (возможные значения свойства перечислены в табл. 6.5);

? Database — имя базы данных, для которой восстанавливаются данные;

П Files — имя файла резервной копии;

? FiieNumber — порядковый номер записи резервной копии;

П RepiaceDatabase — признак замены резервного образа базы данных (свойство может принимать значение -1 — истина и о — ложь);

? LastRestore — признак восстановления последних записей файла транзакций (свойство может принимать значение -1 — истина и о — ложь).

Использование SQL-DMO,

Таблица 6.5. Возможные значения свойства Action объекта Restore
Константа SQL-DMO Значение Описание
SQLDMORestore Database 0 Восстановление всей базы данных
SQLDMORestore Files 1 Восстановление только определенных файлов
SQLDMORestore_Log 2 Восстановление только файла транзакций
.253

В листинге 6.17 приведен пример восстановления базы данных North wind из ранее созданного резервного файла C:\BACKUP\Northwind.bak.

| Листинг Восстановление базы данных Northwind из резервной копии

ВННпНИЯВ?ВІв8

Restore = СоздатьОбъект("SQLDMO.Restore"); Restore.Action = 0;

Restore.Database = "Northwind";

Restore.Files = "C:\BACKUP\Northwind.bak"; Restore.FileNumber = 1;

Restore.ReplaceDatabase = -1;

Restore.LastRestore = -1;

Restore.SQLRestore(SQLServer);

Настройка ограничений доступа к данным

Для настройки офаничений доступа к базе данных в SQL-DMO существует три объекта:

? Login — предназначен для управления параметрами аутентификации для контроля доступа к SQL-серверу;

? DatabaseRole — предназначен для управления списком ролей базы данных;

? user — предназначен для управления списком пользователей базы данных.

Объект Login используется для создания или модификации регистрационных имен пользователей SQL Server и их атрибутов. Объект Login имеет следующие свойства.

CD Name — ИМЯ пользователя В формате "Имя домена?Имя пользователя";

? туре — тип пользователя (возможные значения свойства перечислены в табл. 6.6);

П DenyNTLogin — признак запрета Windows NT авторизации пользователя.

Примечание

Если свойство DenyNTLogin установлено в -1 (Истина), то любая попытка Windows NT авторизации при подключении к SQL-серверу отвергается им. Если свойство установлено в 0 (Ложь) — Windows NT авторизация разрешена.

Таблица 6.6. Возможные значения свойства туре объекта Login

Константа SQL-DMO Значение Описание

SQLDMOLogin_NTGroup 1 Имя пользователя SQL Server ссылается

на группу пользователей, определенную в Windows

SQLDMOLogin_NTUser О Имя пользователя SQL Server ссылается

на пользователя, созданного в Windows

SQLDMOLogin_Standard 2 Стандартный пользователь с SQL Server

авторизацией

В листинге 6.18 приведен пример создания нового пользователя SQL Server с именем "MAVCOMP\mav" и Windows NT авторизацией.

Листйиг6.18. Создание регистрационного имени пользователя

ННІІ^^ИІ^ННННЯНИнНІНЦІ^ВН^^Н^?ИН^ННННПИН^НІННННННПНІИННВІН^?НННІНННН—ИИ___ННІ—НННІ—I—

Login = Co3flaTb06beKT("SQLDM0.Login");

Login.Name = "MAVCOMPVnav";

Login.Type =

SQLServer.Logins.Add(Login) ;

Как следует из приведенного примера, добавление нового пользователя ПРОИЗВОДИТСЯ С ПОМОЩЬЮ Метода Add КОЛЛеКЦИИ Logins Объекта SQLServer.

Если свойство туре имеет значение 2 (SQLDMOLogin_Standard), то для пользователя можно установить пароль с помощью метода setPassword. Общий синтаксис данного метода следующий:

Login. SetPassword( "старый пароль ", "новый пароль").

_Примечание

Если ранее пароль не вводился, то в первом параметре указывается пустая строка.

Для удаления пользователя SQL-сервера в SQL-DMO предназначен метод Remove объекта User. Для удаления ранее созданного пользователя достаточно выполнить команду:

SQLServer.Logins("MAVCOMP\mav"),Remove().

Второй рассматриваемый объект DatabaseRole. Он предназначен для управления списком ролей базы данных. Microsoft SQL Server имеет ряд стандартных ролей, описанных в табл. 6.7.

Таблица 6.7. Список стандартных ролей Microsoft SQL Server

Имя роли

Db_owner

Db_accessadmin

Db_datareader

Db_datawriter

Db_ddladmin

Db_securityadmin

Db_ba ckupoperator Backs up the database

Db_denydatareader

Db_denydatawriter

Описание

Разрешены любые действия над базой данных

Разрешено добавление и удаление пользователей базы данных

Разрешено чтение любых таблиц

Разрешено вносить изменения в записи таблиц

Разрешен запуск DDL (Data Definition Language — язык определения данных) команд

Разрешена модификация прав и изменение ролей

Разрешено выполнение резервного копирования базы данных

Запрещено любое чтение данных из таблиц

Запрещено любое добавление, изменение или удаление записей в таблицах или представлениях

Помимо стандартных ролей SQL-сервер может иметь и роли приложений (Application Roles), которые в SQL-DMO можно создавать с помощью объекта DatabaseRoie.

Рассмотрим основные свойства объекта DatabaseRoie.

? Name — ИМЯ роли.

? AppRole — признак роли приложения. Свойство может принимать значение -1 (Истина) и о (Ложь).

Примечание_

Если свойство установлено в -1 (Истина), то для роли необходимо заполнить свойство Password.

? Password — пароль.

В листинге 6.19 приведен пример создания новой роли базы данных.

Листинг 6.19. Создание новой роли базы' данных Northwind

DbRole = СоздатьОбъект("SQLDMO.DatabaseRole”);

DbRole.Name = "AppRole";

DbRole.AppRole = -1;

DbRole.Password = "erpg_ru";

SQLServer.Databases("Northwind").DatabaseRoles.Add(DbRole);

Добавление новой роли производится с помощью метода Add коллекции DatabaseRoles объекта Database. Удаление роли происходит при помощи метода Remove объекта DatabaseRcie. Для удаления ранее созданной роли достаточно выполнить команду:

SQLServer.Databases("Northwind") .DatabaseRoles("AppRole”).Remove().

Для создания нового пользователя базы данных в SQL-DMO предназначен объект user. Объект user имеет следующие свойства:

П Name — имя пользователя;

? Login — регистрационное имя пользователя SQL Server;

П Role — имя роли пользователя.

В листинге 6.20 приведен пример создания нового пользователя с именем "МА?" базы Данных Northwind.

Листинг 6.20. Создание нового пользователя базы данных Northwind

-W-. ..ш . . ¦ ..LL’H’HH-- :________’.-..L 1 ... 1. : . | .' J

DbUser = СоздатьОбъект("SQLDMO.User");

DbUser.Name = "MAV" ;

DbUser.Login = "MAVCOMPVnav";

SQLServer.Databases("Northwind").Users.Add(DbUser);

Для удаления пользователя базы данных предназначен метод Remove объекта user. Для удаления ранее созданного пользователя достаточно выполнить команду:

SQLServer. Databases("Northwind") . Users("MAV") . Remove() .

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

В листинге 6.21 приведен пример установки прав для пользователя "ма?".

Листинг 6.21. Определение прав пользователя мма?" для базы данных Northwind

Database = SQLServer.Databases("Northwind");

// Установить права к базе данных Northwind

Database.Grant(128, "MAV");

// Установить права к таблице Customers

Database.Tables("Customers").Grant(63, "MAV");

// Установить права к представлению Invoices

Database.Views("Invoices").Grant(63, "MAV");

// Установить права к хранимой процедуре CustOrdersOrders

Database.StoredProcedures("CustOrdersOrders").Grant(16, "MAV");

В приведенном примере устанавливаются права доступа к таблице Customers, к представлению invoices, к хранимой процедуре CustOrdersOrders и к базе данных Northwind. Результат установки полного доступа к таблице customers для пользователя "ма?" приведен на рис. 6.1.

Рис. Установка полного доступа к таблице Customers

9 Зак. 722

Как видно из примера, приведенного в листинге 6.21, метод Grant имеет два параметра:

? номер разрешенных действий;

О имя пользователя базы данных.

Для разных объектов набор разрешенных действий различен.

В табл. 6.8 перечислены значения первого параметра метода Grant объекта Database.

Таблица 6.8. Возможные значения разрешенныхдействий

ДЛЯ объекта Da tabase

Константа SQL-DMO Значение Описание

SQLDKOPriv AllDatabasePrivs 130944

SQLDMOPrivCreateDatabase 256

SQLDMOPriv CreateDefault 4096

Разрешены любые действия пользователя над базой данных

Пользователю разрешено создание баз данных

Пользователю разрешено создание объекта default и выполнение команды CREATE DEFAULT

Разрешено создание пользовательских функций

Разрешено создание хранимых процедур

Разрешено создание ролей

Разрешено создание таблиц

Разрешено создание представлений

Разрешено создание резервных копий базы данных

Оставлено для совместимости с ранними версиями SQL-DMO

Разрешено создание резервных копий файла транзакций

65366

1024

16384

128

512

2048

32768

8192

SQLDMOPriv CreateFunction

SQLDMOPriv CreateProcedure

SQLDMOPriv_CreateRule

SQLDMOPriv_CreateTable SQLDMOPriv CreateView

SQLDMOPriv_DumpDatabase

SQLDMOPriv_DumpTable

SQLDMOPriv^DumpTransaction

В табл. 6.9 перечислены возможные значения разрешенных действий для объектов Table И View.

Таблица 6.9. Возможные значения разрешенных действий

для объектов Table И View

Константа SQL-DMO Значение Описание

SQLDM0Priv_A110bjectPrivs 63

SQLDMOPriv_Delete 3

SQLDMOPriv_Insert SQLDMOPriv References 32

SQLDMOPriv Select

SQLDMOPriv Update

Разрешены любые действия пользователя над таблицей или представлением

Разрешено удаление записей и использование оператора DELETE

Разрешена вставка записей и использование оператора INSERT

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

Разрешена выборка данных с помощью оператора SELECT

Разрешено использование оператора UPDATE

В табл. 6.10 перечислены возможные значения разрешенных действий для объекта StoredProcedure.

Таблица 6.10. Возможные значения разрешенных действий

ДЛЯ объекта StoredProcedure
Константа SQL-DMO Значение Описание
SQLDMOPriv_A110bjectPrivs 63 Разрешены любые действия пользователя над хранимой процедурой
SQLDMOPriv Execute 16 Разрешен запуск хранимой процедуры
Для того чтобы отключить соответствующее право в SQL-DMO, предназначен метод Revoke, который по синтаксису аналогичен методу Grant.

В листинге 6.22 приведен программный код, отменяющий все установленные ранее (листинг 6.21) права.

f : pi, у: •. . •. X_ v . • ... . - gy . ' _ • -

I Листинг 6.22. Отмена установленных прав пользователя
:, ;р
і для базы данных Northwind
Database = SQLServer.Databases("Northwind") ;

// Отмена прав к базе данных Northwind

Database.Revoke(128, "MAV");

// Отмена прав к таблице Customers

Database.Tables("Customers").Revoke(63, "MAV");

// Отмена прав к представлению Invoices

Database.Views("Invoices").Revoke(63, "MAV");

// Отмена прав к хранимой процедуре CustOrdersOrders

Database.StoredProcedures("CustOrdersOrders").Revoke(16, "MAV");



Содержание раздела