Глава 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
Идентификатор Описание
Целочисленный тип, от -2
63(-9 223372 036854 775808) до 2
63 (9 223372 036854 775807)
Целочисленный тип, от -2
31 (-2147483 648)до2
3’ (2147483 647)
Целочисленный тип, от 2
15 (-32 768) до 2
15 (32 767)
Целочисленный тип, от 0 до 255
Целочисленный тип, 0 или 1
Тип с фиксированной точностью, от до 10
38
Эквивалентно типу decimal
Денежный тип, от -2
63 (-922 337 203 685 477.5808) до 2
63 (+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), максимально допустимая длина — 2
31 (2 147483 647) символов
text
nchar
nvarchar
ntext
binary
varbinary
image
cursor
sql_variant
table
timestamp
uniqueidentifier
Строка фиксированной длины (Unicode), максимально допустимая длина — 4000 символов
Строка переменной длины (Unicode), максимально допустимая длина — 4000 символов
Строка переменной длины (Unicode), максимально допустимая длина — 2
30 (1 073 741 823) символов
Двоичные данные фиксированной длины до 8000 байт
Двоичные данные переменной длины до 8000 байт
Двоичные данные переменной длины до 2
31 (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");
Содержание раздела