Все же для полноты картины приведем структуру системных таблиц, в которых хранится описание физической структуры базы данных.
Список файлов базы данных хранится в системной таблице sysfiles. Каждая строка этой таблицы соответствует одному файлу базы данных. Таблица sysfiles является виртуальной и не может быть изменена непосредственно с помощью команд DELETE, UPDATE или INSERT. Тем не менее, пользователи могут считывать данные из этой таблицы, используя команду SELECT. Структура таблицы sysf i I es приведена в табл. 14.3.
Таблица. Структура системной таблицы sysfiles
Имя столбца | Тип данных | Назначение |
Field | Smallint | Идентификационный номер (ID) файла в базе данных |
GroupID | Smallint | ID группы файлов, к которой принадлежит файл |
Size | Int | Текущее количество страниц в файле |
Maxsize | Int | Максимальный размер файла. Значение -1 означает, |
что размер файла не ограничен | ||
Growth | Int | Шаг приращения |
Status | Int | Текущий статус файла |
Perf | Int | Зарезервировано |
Name | Nchar(128) | Логическое имя файла |
Filename | Nchar(260) | Физическое имя файла |
Таблица sysf lies описывает подробную структуру файлов. Более компактное описание файлов хранится в таблице sysfilesl, которая содержит столбцы status, field, name и filename, назначение которых аналогично. Для просмотра информации о файлах базы данных с помощью таблицы sysfilesl можно выполнить следующую команду: SELECT * FROM sysfilesl
В итоге будет возвращен следующий результат:
status fileid name filename
3 1 pubs ...\data\pubs.mdf
49218 2 pubsjog ...\data\pubs_log.ldf
(2 row(s) affected)
Описание групп файлов, созданных в базе данных, хранится в системной таблице sysfilegroups. Каждая строка этой таблицы соответствует одной группе. Структура этой таблицы приведена в табл.
Таблица. Структура таблицы sysfilegroups
Имя столбца | Тип данных | Назначение | |
GroupID Allocpolicy Status Groupname | Smallint Smallint Ins Sysname | Идентификационный номер группы файлов Зарезервировано Текущий статус группы: 0x8— READONLY, 0x10 — Имя группы файлов | DEFAULT |
Например, для получения информации о группах файлов, определенных в базе данных pubs, можно использовать следующий запрос:
SELECT * FROM sysfilegroups
Будет возвращен примерно следующий результат:
groupld allocpolicy status groupname
1 0 16 PRIMARY
(1 row(s) affected)
Для удаления базы данных используется следующая команда: DROP DATABASE databasejiame [,...n]
Аргумент database_name указывает имя базы данных, которую необходимо удалить. Одной командой можно удалить несколько баз данных, перечислив их имена через запятую.
Например, для удаления баз данных Pubs и Northwind нужно выполнить следующую команду: DROP DATABASE Pubs. Northwind
В главе 5 в разделе «Типы данных» были рассмотрены встроенные в SQL Server 2000 типы данных. Эти типы данных всегда имеются в распоряжении пользователей и могут быть использованы для столбцов таблиц, представлений, переменных и т. д. Однако помимо встроенных типов данных пользователи могут на их основе создавать свои собственные типы данных — так называемые пользовательские типы данных.
Пользовательские типы данных (user-defined data type) — это типы данных, создаваемые пользователями. Они создаются на основе системных типов данных. Пользовательские типы данных часто используются, когда в нескольких таблицах необходимо хранить однотипные значения, причем гарантировать, что столбцы в таблице будут иметь одинаковый размер, тип данных и чувствительность к данным NULL. Например, с помощью пользовательского типа данных можно хранить номера и серии паспорта.
Для создания пользовательского типа данных используется системная хранимая процедура sp_addtype:
sp_addtype [ @typename = ] type. [ @phystype = ] system_data_type [ . [ @nulltype = ] "null_type" ] [ , [ @owner = ] "owner name" ]
Если необходимо сделать пользовательский тип данных доступным во всех создаваемых базах данных, добавьте этот тип в базу данных model.
Здесь используются следующие аргументы.
О type — имя создаваемого типа данных. При выборе имени создаваемого типа данных необходимо следовать установленным правилам именования объектов. Имя должно быть уникальным в пределах владельца, то есть не совпадать с именами других объектов. Разные пользователи могут употреблять одинаковые имена для создаваемых объектов.
О system_data_type — системный тип данных, на основе которого создается пользовательский тип данных. Можно выбрать один из следующих типов данных:
"binary(n)" Image smalldatetime
Bit Int smallint
"char(n)" "nchar(n)" ' text
Datetime Ntext tinyint
Decimal Numeric uniqueidentifier
"decimal[(p[,s])]" "numeric[(p[,s])]" "varbinary(n)"
Float "nvarchar(n)" "varchar(n)"
"float(n)" Real
Кавычки необходимы, когда помимо самого типа данных требуется указание дополнительных параметров. Аргумент п идентифицирует длину системного типа данных в пользовательском типе данных, аргумент р — максимальное суммарное (до и после десятичной точки) количество цифр для числовых типов данных в пользовательском типе данных, аргумент s — максимальное количество десятичных цифр после запятой в пользовательском типе данных.
Нельзя создать пользовательский тип данных на основе системного типа timestamp.
О "null _type". Значение этого аргумента определяет, будет ли пользовательский тип данных хранить значения NULL Аргумент null_type имеет тип varchar(S) и может принимать одно из трех следующих значений: NULL (разрешается хранение NULL), NOT NULL (хранение NULL запрещается) или NONULL (используется значение по умолчанию). Если аргумент null_type не указывается, то при создании пользовательского типа используется значение по умолчанию, установленное для базы данных с помощью системной хранимой процедуры sp_dboption. Текущее значение, установленное в базе данных, можно получить с помощью функции GETANSINULL
Значение аргумента null_type требуется для пользовательского типа данных только как значение по умолчанию при создании столбца таблицы. Если при создании столбца явно определено свойство NULL или NOT NULL, то значение аргумента null_type игнорируется.
О "owner_name". Определяет владельца или создателя нового типа данных. По умолчанию владельцем нового типа данных считается текущий пользователь. Параметр owner_name имеет тип данных sysname.
Например, при создании пользовательских типов данных для описания номеров факса и телефона можно использовать следующий код: ЕХЕС sp_addtype telephone, "varchar(24)", "NOT NULL" EXEC sp_addtype fax, "varchar(24)", "NULL"
Хранимая процедура sp_addtype добавляет описание типа в системную таблицу systypes текущей базы данных. В принципе, если посмотреть на эту таблицу, то можно заметить, что в ней также перечислены встроенные типы данных. То есть и типы данных, выглядящие встроенными, на уровне конкретной базы данных являются пользовательскими, но имеющими те же свойства и имена, что и встроенные. Например, выберем из таблицы systypes базы данных pubs список доступных типов данных:
SELECT name FROM systypes
Будет возвращен следующий результат:
name
image
text
uniqueidentifier
tinyint
smallint
int
smalldatetime
real
money
datetime
float
sql_variant
ntext
bit
decimal
numeric
small money
bigint
varbinary
varchar
binary
char
timestamp
nvarchar
nchar
sysname
id
tid
empid
(29 row(s) affected)
Как видно, в одной таблице перечислены и встроенные, и пользовательские типы данных (i d, ti d и emi d).
Правила (rules) являются одним из средств обеспечения целостности данных, хранящихся в базе. Правила оставлены для обеспечения обратной совместимости с предыдущими версиями SQL Server. В новой версии они заменены ограничениями целостности CHECK, которые являются более мощным средством и определяются при создании таблицы. Правила же создаются как отдельные объекты, которые впоследствии связываются с конкретными полями таблиц. В этом разделе будут рассмотрены правила как самостоятельные объекты базы данных.
Для столбца таблицы можно определить только одно правило, но несколько ограничений целостности CHECK. Если для одного столбца определены ограничения целостности и правило, то будут учитываться как ограничения целостности, так и правило.
Создание правила не может выполняться в одном пакете с другими командами Transact-SQL.
Для создания правила используется следующая команда Transact-SQL: CREATE RULE rule AS condition_expression
Рассмотрим аргументы команды. О rule— имя правила. При выборе имени необходимо придерживаться общих
правил именования объектов. При необходимости можно указать имя владельца.
О condition_expression — логическое выражение, определяющее условие, накладываемое на значения. В качестве условия можно использовать любые логические команды, арифметические операторы, встроенные функции и предикаты (например IN, BETWEEN, LIKE). В выражении condition_expression нельзя ссылаться на столбцы таблиц или на любые другие объекты базы данных. Встроенные функции также не должны ссылаться на объекты базы данных. В выражении допустима одна локальная переменная, начинающаяся с символа @. В качестве имени переменной можно использовать произвольную строку. При выполнении правила переменная будет содержать значение, которое пользователь пытается ввести в столбец с помощью команды INSERT или UPDATE. Переменная может использоваться в любых логических операциях. Приведем пример создания правила: CREATE RULE rule_one AS @val>=100 AND (ava1<170 CREATE RULE rule_two AS