Одного предоставления доступа к экземпляру SQL Server будет недостаточно для приложения, которому необходим доступ к данным. Предоставив доступ к экземпляру SQL Server, необходимо предоставить доступ к определенным базам данных. Доступ к базам данных предоставляется посредством добавления пользователей базы данных и сопоставления пользователям базы данных имен входа. Каждое имя входа сопоставляется пользователю базы данных для каждой базы данных, к которой этому имени входа нужен доступ. Каждый пользователь базы данных сопоставляется только одному имени входа, за исключением пользователя базы данных dbo.
sp_addalias. Так можно поступить и в SQL Server 2005. Однако эту функцию использовать не рекомендуется, поскольку она считается устаревшей и, возможно, будет удалена из следующих версий программы.Пользователи базы данных - это участники уровня базы данных. Все имена входа, за исключением серверной роли сопоставлены пользователю dbo во всех базах данных сервера.
Добавить пользователя базы данных можно при помощи инструкции CREATE USER. Следующий пример кода Transact-SQL создает имя входа Peter и сопоставленного с ним пользователя в базе данных Adventure Works:
PeterCREATE LOGIN Peter WITH PASSWORD='Tyu87IOR0';
AdventureWorks.USE AdventureWorks; GO
Peter, который сопоставлен имени входа Peter в БД AdventureWorks.CREATE USER Peter FOR LOGIN Peter;
Проверить, имеет ли текущее имя входа доступ к базе данных, можно при помощи следующей инструкции:
SELECT HAS_DBACCESS('AdventureWorks');
Чтобы получить информацию о пользователях базы данных, можно воспользоваться представлением каталога sys.database_principals.
Если нужно временно отключить доступ пользователя к базе данных, можно отозвать разрешение CONNECT для этого пользователя. Следующий пример отзывает разрешение CONNECT для пользователя Peter:
AdventureWorks.USE AdventureWorks; GO
connect для Peter
в AdventureWorks.REVOKE CONNECT TO Peter;
Удалить пользователя в базы данных можно при помощи инструкции DROP USER.
Пользователями, утратившими связь с именами входа, называются пользователи базы данных, которые не сопоставлены имени входа в текущем экземпляре SQL Server. В SQL Server 2005 пользователь может утратить связь с именем входа, если сопоставленное ему имя входа будет удалено. Чтобы получить информацию о таких пользователях, можно выполнить следующий код:
AdventureWorks.USE AdventureWorks; GO
EXECUTE sp_change_users_login @Action='Report';
В SQL Server 2005 допускается создание пользователя, не сопоставленного имени входа, с помощью фразы WITHOUT LOGIN. Пользователи, созданные с помощью фразы WITHOUT LOGIN, не считаются пользователями, утратившими связь с именем входа. Эта возможность может быть очень полезна в ситуации, когда необходимо изменить контекст выполнения какого-либо модуля. О контексте выполнения рассказывается далее в этой лекции. Следующий пример создает пользователя, не сопоставленного имени входа.
AdventureWorks.USE AdventureWorks; GO
Paul в базе данных AdventureWorksCREATE USER Paul WITHOUT LOGIN;
Когда имя входа, которое не имеет сопоставленного пользователя, пытается соединиться с базой данных, SQL Server предпринимает попытку подключения с использованием пользователя Guest. Пользователь Guest создается по умолчанию без предоставления разрешений. Можно включить пользователя guest, предоставив ему разрешение CONNECT, как показано ниже.
AdventureWorks.USE AdventureWorks; GO
Guest доступ к базе данных AdventureWorks.GRANT CONNECT TO Guest;
Хорошо подумайте над тем, стоит ли включать пользователя guest, ведь это подвергает среду базы данных дополнительному риску.
Создав пользователей базы данных, необходимо управлять разрешениями для этих пользователей. Это можно осуществить, добавляя пользователей в роли базы данных или предоставляя самим пользователям гранулярные разрешения.
Роли базы данных - это участники уровня
| Роль базы данных | "Описание |
|---|---|
| db_accessadmin | Может управлять доступом к базе данных |
| db_backupoperator | Может выполнять резервное копирование базы данных |
| db_datareader | Может читать данные из таблиц всех пользователей |
| db_datawriter | Может добавлять, удалять и обновлять данные в таблицах всех пользователей |
| db_ddladmin | Может выполнять любые команды DDL в базе данных |
| db_denydatareader | Не может читать какие-либо данные в таблицах пользователей |
| db_denydatawriter | Не может добавлять, удалять и обновлять какие-либо данные в таблицах пользователей |
| db_owner | Может выполнять все действия по настройке конфигурации и обслуживанию |
| db_securityadmin | Может изменять членство в ролях базы данных и управлять разрешениями |
| public | Особая роль базы данных. Все пользователи принадлежат к роли public. Пользователей из группы public нельзя удалить. |
Можно добавлять роли базы данных, если нужно сгруппировать пользователей в соответствии с требованиями определенных разрешений. Следующий пример кода создает роль базы данных с именем Auditors и добавляет пользователя Peter в эту новую роль.
AdventureWorks.USE AdventureWorks; GO
Auditors в базе данных AdventureWorks.CREATE ROLE Auditors; GO
Peter к роли AuditorsEXECUTE sp_addrolemember "Auditors", "Peter";
Выполнив запрос системной функции IS_MEMBER, можно проверить, принадлежит ли текущий пользователь к какой-либо роли базы данных. В следующем примере мы проверим, принадлежит ли текущий пользователь к роли базы данных db_owner.
AdventureWorks.USE AdventureWorks; GO
SELECT IS_MEMBER ("db_owner");
IS_MEMBER можно использовать для проверки того, принадлежит ли текущий пользователь также к определенной группе Windows, как показано в следующем примере:AdventureWorks.USE AdventureWorks; GO
Managers в домене ADVWORKSSELECT IS_MEMBER ("[ADVWORKS\Managers]");
Удалить пользователей из роли базы данных можно при помощи системной хранимой процедуры sp_droprolemember. Если нужно удалить роль базы данных, то используется инструкция DROP ROLE. Следующий код удаляет пользователя Peter из роли базы данных Auditors, а затем удаляет роль Auditors.
AdventureWorks.USE AdventureWorks; GO
Peter из роли AuditorsEXECUTE sp_droprolemember "Auditors", "Peter";
Auditors из текущей базы данныхDROP ROLE Auditors;
В качестве альтернативы использованию фиксированных ролей базы данных можно предоставлять гранулярные разрешения пользователям и ролям базы данных. Разрешениями можно управлять при помощи инструкций GRANT, DENY и REVOKE. В следующем примере мы предоставим разрешение BACKUP DATABASE пользователю Peter:
AdventureWorks.USE AdventureWorks; GO
PeterAdventureWorks.GRANT BACKUP DATABASE TO Peter;
Когда вы используете инструкцию DENY для удаления разрешения для пользователя, этот пользователь может унаследовать то же самое разрешение, если является членом имеющей это разрешение роли базы данных. Но если для удаления разрешения вы воспользуетесь инструкцией REVOKE, то пользователь сможет унаследовать то же самое разрешение, если является членом роли базы данных, которой это разрешение уже предоставлено. Используйте инструкцию REVOKE только для удаления разрешений, которые были предоставлены ранее.
Роли приложения - это особые роли базы данных, которые можно использовать для разрешения доступа к определенным данным только тем пользователям, которые устанавливают соединение через определенное приложение. Роли приложений не содержат членов, поэтому перед использованием необходимо активизировать их в текущем соединении. При активизации роли приложения текущее соединение утрачивает разрешения, назначенные пользователям, и получает только разрешения, которые применимы к роли приложения.
Роль приложения можно создать при помощи инструкции CREATE APPLICATION ROLE. Этот код имеется в файле примеров ApplicationRoles.sql.
AdventureWorks.USE AdventureWorks; GO
FinancialRole в текущей базе данныхCREATE APPLICATION ROLE FinancialRole WITH PASSWORD = "Pt86Yu$$R3";
Роли приложений перед использованием необходимо активизировать. Это можно сделать, выполнив системную хранимую процедуру sp_setapprole. После того, как роль приложения активизирована в текущем соединении, она остается активной до тех пор, пока не будет закрыто соединение или выполнена системная хранимая процедура sp_unsetapprole. Хотя роли приложения предназначены для использования из клиентских приложений, их можно также использовать из особых пакетов T-SQL.
Следующая процедура (ее можно найти в файлах примеров под именем ApplicationRolesUse.sql ) описывает, как активизировать роль Financial Role и отменить эту активизацию.
AdventureWorks.USE AdventureWorks; GO
DECLARE @context varbinary (8000);
EXECUTE sp_setapprole "FinancialRole", "Pt86Yu$$R3", @fCreateCookie = true, @cookie = @context OUTPUT;
SELECT CURRENT_USER;
EXECUTE sp_unsetapprole @context; GO
SELECT CURRENT_USER; GO
Если нужно удалить роль приложения, используйте инструкцию DROP APPLICATION ROLE, как показано в следующем примере (этот код имеется в файле примеров ApplicationRoles.sql ):
AdventureWorks.USE AdventureWorks; GO
FinancialRole из текущей базы данныхDROP APPLICATION ROLE FinancialRole;
В SQL Server 2005 реализована концепция ANSI для схем. Схемы - это контейнеры объектов, которые позволяют группировать объекты базы данных. Схемы оказывают большое влияние на то, как пользователи ссылаются на объекты базы данных. В SQL Server 2005 объект базы данных называется именем, состоящим из четырех компонентов следующей структуры:
<Server>.<Database>.<Schema>.<Object>.
Схемы базы данных можно создавать при помощи инструкции CREATE SCHEMA. Создавая схему, можно создать объекты базы данных и назначить разрешения в пределах одной транзакции, которая вызывается инструкцией CREATE SCHEMA. Следующий пример (он есть в файлах примеров под именем ManagingAccessToSchemas01.sql ) создает схему с именем Accounting, назначает пользователя Peter владельцем схемы и создает таблицу с именем Invoices. В этом примере также предоставляется разрешение select роли базы данных public.
AdventureWorks.USE AdventureWorks; GO
Accounting с владельцем Peter.CREATE SCHEMA Accounting AUTHORIZATION Peter; GO
Invoices в схеме Accounting.CREATE TABLE Accounting.Invoices ( InvoiceID int, InvoiceDate smalldatetime, ClientID int); GO
SELECT на новую таблицу роли public.GRANT SELECT ON Accounting.Invoices TO public; GO
INSERT INTO Accounting.Invoices VALUES (101,getdate(),102);
Удалить схему можно при помощи инструкции DROP SCHEMA. В SQL Server 2005 не допускается удаление схемы, если в схеме есть объекты. Информацию о схемах можно получить, выполнив запрос к представлению каталога sys.schemas. Следующий пример выполняет запрос к представлению каталога sys.schemas, чтобы получить информацию о схеме:
SELECT * FROM sys.schemas;
Следующий код (который можно найти в файлах примеров под именем ManagingAccessToSchemas02.sql ) показывает, как удалить существующую схему, выполнив запрос к объектам, которые содержатся в этой схеме, и удалить сначала эти объекты.
AdventureWorks.USE AdventureWorks; GO
Accounting.SELECT s.name AS "Schema", o.name AS "Object" FROM sys.schemas s INNER JOIN sys.objects o ON s.schema_id=o.schema_id WHERE s.name='Accounting'; GO
Invoices из схемы Accounting.DROP TABLE Accounting.Invoices; GO
Accounting.DROP SCHEMA Accounting;
Одним из преимуществ схем является отделение пользователей от объектов. В SQL Server 2005 все объекты принадлежат к схемам, поэтому можно изменять и удалять пользователей базы данных без какого-либо влияния на объекты базы данных или ссылки на эти объекты из приложений базы данных. Эта абстракция позволяет владеть одними и теми же объектами нескольким пользователям, поскольку можно создать схему, владельцем которой будет роль базы данных.
Когда приложение ссылается на объект базы данных, не уточняя схемы, SQL Server осуществляет попытку найти объект в схеме, заданной для текущего пользователя по умолчанию. Если объект не содержится в схеме по умолчанию, SQL Server пытается обнаружить объект в схеме dbo. В следующем примере (который можно найти в файлах примеров под именем ManagingAccessToSchemas03.sql ) демонстрирует, как создать схему и назначить ее в качестве схемы по умолчанию для пользователя.
CREATE LOGIN Sara WITH PASSWORD='TUT87rr$$'; GO
AdventureWorks.USE AdventureWorks; GO
Sara в базе данных AdventureWorks
и сопоставляем этого пользователя имени входа SaraCREATE USER Sara FOR LOGIN Sara; GO
Marketing, владелец - пользователь Peter.CREATE SCHEMA Marketing AUTHORIZATION Peter; GO
Campaigns в только что созданной схеме.CREATE TABLE Marketing.Campaigns ( CampaignID int, CampaignDate smalldatetime, Description varchar (max)); GO
SELECT пользователю Sara на новую таблицу.GRANT SELECT ON Marketing.Campaigns TO Sara; GO
Marketing схемой по умолчанию для пользователя SaraALTER USER Sara WITH DEFAULT_SCHEMA=Marketing;
Таблица и столбцы хранят данные, которые извлекают и создают приложения. Управление доступом к этим данных осуществляется через иерархию разрешений SQL Server 2005. Управлять этой иерархией разрешений можно при помощи инструкций GRANT, DENY и REVOKE.
GRANT. Разрешает роли или пользователю выполнять операции, определенные в момент предоставления разрешения.
DENY. Запрещает пользователю или роли определенные разрешения и предотвращает наследование этих разрешений от других ролей..
REVOKE. Отзывает ранее запрещенные или предоставленные разрешения.
Доступ к таблице управляется действующими разрешениями, которые предоставлены пользователю на эту таблицу. Доступом пользователя к таблицам можно управлять при помощи управления разрешениями на таблицу. Разрешения, которыми можно управлять для таблиц, перечислены в табл. 3.2. Эти разрешения можно назначать пользователям базы данных и ролям.
| Разрешения | Описание |
|---|---|
ALTER |
Разрешает изменять свойства таблицы |
CONTROL |
Предоставляет разрешения, аналогичные владению |
DELETE |
Разрешает удалять строки из таблицы |
INSERT |
Разрешает добавлять столбцы в таблицу |
REFERENCES |
Разрешает ссылаться на таблицу из внешнего ключа |
SELECT |
Разрешает осуществлять выборку строк из таблицы |
TAKE OWNERSHIP |
Разрешает присвоение схемы или таблицы |
UPDATE |
Разрешает изменять строки в таблице |
VIEW DEFINITION |
Разрешает доступ к метаданным таблицы |
Доступ пользователям базы данных и ролям можно предоставить с помощью инструкции GRANT. В следующем примере разрешения SELECT, INSERT и UPDATE на таблицу Sales.Customer предоставляются пользователю Sara (код для управления доступом к таблицам в этом и следующих разделах имеется в файлах примеров под именем ManagingAccessToTables.sql.).
AdventureWorks.USE AdventureWorks; GO
Sara некоторые разрешенияSales.Customer table.GRANT SELECT,INSERT,UPDATE ON Sales.Customer TO Sara;
Если нужно не допустить доступ пользователя к таблице, то можно столкнуться с двумя ситуациями. Если вы до этого предоставили пользователю разрешение на эту таблицу, то для удаления ранее предоставленных разрешений следует воспользоваться инструкцией REVOKE. Например:
AdventureWorks.USE AdventureWorks; GO
SELECT на таблицу Sales.Customer у Sara.REVOKE SELECT ON Sales.Customer TO Sara;
Однако пользователь может сохранить отозванное разрешение вследствие принадлежности к роли, которой предоставлено данное разрешение. В этом случае необходимо использовать инструкцию DENY, чтобы запретить доступ этому пользователю. Например:
AdventureWorks.USE AdventureWorks; GO
Sara разрешение DELETE на таблицу Sales.Customer.
независимо от того, какие разрешения этот пользователь мог
унаследовать от роли.DENY DELETE ON Sales.Customer TO Sara;
В SQL Server 2005 есть возможность предоставить или отклонить доступ к отдельным столбцам, вместо того, чтобы работать со всей таблицей. Эта возможность предоставляет гибкость в отклонении доступа, например, к конфиденциальным данным в некоторых столбцах. Разрешения, которыми можно управлять для столбцов таблицы, перечислены в табл. 3.3.
| Разрешение | Описание |
|---|---|
SELECT |
Разрешает выполнить выборку из столбца |
UPDATE |
Разрешает изменять данные в столбце |
Доступ к отдельным столбцам можно предоставить с помощью инструкции GRANT. В следующем примере разрешения SELECT и UPDATE предоставляются пользователю Sara на столбцы Demographics и Modified Date таблицы Sales.Individual. (Код для управления доступом к столбцам таблицы в этом и следующих разделах имеется в файлах примеров под именем ManagingAccessToColumns. sql.)
AdventureWorks.USE AdventureWorks; GO
SELECT и UPDATE пользователю Sara
на определенные столбцы таблицы Sales.IndividualGRANT SELECT,UPDATE ( Demographics, ModifiedDate) ON Sales.Individual TO Sara;
Аналогично, можно отозвать доступ к отдельным столбцам при помощи инструкции REVOKE. Не забывайте, что если нужно не допустить получения пользователем разрешения, необходимо использовать инструкцию DENY.
AdventureWorks.USE AdventureWorks; GO
Demographics для пользователя Sara.REVOKE UPDATE (Demographics) ON Sales.Individual TO Sara;
Такие программируемые объекты, как хранимые процедуры и определяемые пользователем функции, имеют свой контекст безопасности. Чтобы выполнять хранимые процедуры, функции и сборки, пользователям базы данных необходимы разрешения. После того, как ядро базы данных выполнит проверку на наличие разрешений на выполнение программируемого объекта, оно проверяет наличие разрешений на выполнение операций, в которых используются программируемые объекты. Когда объекты базы данных последовательно обращаются друг к другу, эта последовательность формирует цепочку владения. О цепочках владения рассказывается далее в этой лекции.
Хранимые процедуры - это, вероятно, те объекты базы данных, которые наиболее часто используются разработчиками. Как и другие объекты базы данных, хранимые процедуры являются
| Разрешение | Описание |
|---|---|
ALTER |
Разрешает изменять свойства хранимой процедуры |
CONTROL |
Предоставляет разрешения, аналогичные владению |
EXECUTE |
Разрешает выполнять хранимую процедуру |
TAKE OWNERSHIP |
Разрешает присвоение хранимой процедуры |
VIEW DEFINITION |
Разрешает просматривать метаданные хранимой процедуры |
Когда приложение совершает вызов для EXECUTE для этой хранимой процедуры. В следующем примере разрешение EXECUTE для хранимой процедуры dbo.uspGetBillOfMaterials предоставляется пользователю Sara. (Код в этом и следующих разделах можно найти в файлах примеров под именем ManagingAccessToProgrammableObjects.sql.)
AdventureWorks.USE AdventureWorks; GO
Sara разрешение EXECUTE для хранимой
процедуры.GRANT EXECUTE On dbo.uspGetBillOfMaterials TO Sara;
Аналогично, если вам нужно не допустить выполнение каким-либо пользователем хранимой процедуры, вы можете отозвать ( REVOKE ) или запретить ( DENY ) разрешение EXECUTE для этого пользователя.
Определяемые пользователем функции - это программируемые объекты, как и хранимые процедуры. Существует два основных вида определяемых пользователем функций: функции, возвращающие скалярное значение, которые возвращают одно значение, и функции, которые возвращают табличное значение. В зависимости от типа определяемой пользователем функции, вам придется предоставить одно из двух разрешений - EXECUTE или SELECT (см. табл. 3.5).
| Разрешение | Описание |
|---|---|
ALTER |
Разрешает изменять свойства хранимой процедуры |
CONTROL |
Предоставляет разрешения, аналогичные владению |
TAKE OWNERSHIP |
Разрешает присваивание хранимой процедуры |
VIEW DEFINITION |
Разрешает просматривать метаданные хранимой процедуры |
SELECT |
Разрешает выборку данных, возвращаемых их определяемой пользователем функции (только для функций, возвращающих табличное значение) |
EXECUTE |
Разрешает выполнять определяемые пользователем функции (только для функций, возвращающих скалярное значение). |
Когда пользователь выполняет функцию, возвращающую табличное значение, SQL Server проверяет, имеет ли этот пользователь разрешение SELECT для данной таблицы. Эти разрешения для функции можно предоставить тем же способом, каким предоставляется разрешение SELECT для таблиц. В следующем примере пользователю Sara предоставляется разрешение SELECT на определяемую пользователем функцию dbo.ufnGetContactInformation.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение пользовательской функции.GRANT SELECT ON dbo.ufnGetContactInformation TO Sara;
Для выполнения функции, возвращающей скалярное значение, пользователю необходимо иметь разрешение EXECUTE для этой функции. Разрешение EXECUTE для функции, возвращающей скалярное значение, предоставляется тем же способом, что и разрешение EXECUTE для хранимой процедуры. В следующем примере пользователю Sara предоставляется разрешение EXECUTE для функции dbo.ufnGetStock.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение пользовательской функции.GRANT EXECUTE ON dbo.ufnGetStock TO Sara;
SQL Server 2005 предоставляет возможность включать сборки .NET (объекты, которые ссылаются на файлы .dll ) в механизм базы данных и вызывать эти сборки в хранимых процедурах и функциях. Для сборок можно задать те же разрешения, что и для хранимых процедур. Смотрите список разрешений в табл. 3.4.
Для создания сборки вам необходимо определить набор разрешений. Этот набор разрешений определяет набор разрешений на доступ к коду, который предоставляется сборке в SQL Server. Существует три различных набора разрешений:
SAFE. Код, выполняемый сборкой, не может обращаться к внешним системным ресурсам. SAFE - это самый ограничительный набор разрешений, который установлен по умолчанию..EXTERNAL_ACCESS. Сборка может обращаться к внешним системным ресурсам.UNSAFE. Сборка может выполнять неуправляемый код.SAFE является рекомендуемым набором разрешений для сборок, которые не нуждаются в доступе к внешним ресурсам.
Когда приложение пытается обратиться к объекту внутри сборки, механизм базы данных проверяет, имеет ли текущий пользователь разрешение EXECUTE. Следующий код используется для предоставления разрешения EXECUTE для сборки пользователю Sara.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение сборки.GRANT EXECUTE ON <AssemblyName> TO Sara;
Предоставляя разрешение EXECUTE для сборки, вы предоставляете пользователю разрешение EXECUTE для всех объектов сборки.
Цепочка владения - это последовательность объектов базы данных, которые обращаются друг к другу. Например, когда вы добавляете в таблицу строку из хранимой процедуры, то хранимая процедура является вызывающим объектом, а таблица - вызываемым объектом. Когда SQL Server обходит цепочку, механизм базы данных оценивает разрешения по-другому, не так, как если бы вы обращались к объектам по отдельности.
При обращении к объекту в цепочке, SQL Server сначала сравнивает владельца вызываемого объекта и владельца вызывающего объекта. Если у объектов один владелец, то разрешения вызываемого объекта не оцениваются. Эта функция очень полезна для управления разрешениями объектов. Предположим, например, что Sara создает таблицу с именем Person.SupplierContacts и хранимую процедуру Person.InsertSupplierContacts, c помощью которой Sara добавляет строки в таблицу PersonSupplierContacts. Поскольку у этих объектов один владелец, Sara, то для того, чтобы предоставить другим пользователям разрешение EXECUTE для таблицы PersonSupplierContacts, достаточно предоставить разрешение EXECUTE на хранимую процедуру Person.InsertSupplierContacts. Нет необходимости предоставлять другим пользователям разрешения для таблицы.
Имя входа и пользователь, подключившиеся на время сеанса или выполняющие процедуру, определяют контекст выполнения. Маркеры имени входа и пользователя предоставляют SQL Server информацию, необходимую для оценки разрешений объектов. SQL Server 2005 предоставляет возможность изменить контекст выполнения при помощи инструкции EXECUTE AS. Эта операция называется переключением контекста.
Инструкция EXECUTE AS позволяет явно определить контекст выполнения для текущего соединения. EXECUTE AS можно использовать для того, чтобы изменить имя входа пользователя для текущего соединения. Изменение контекста выполнения действительно до тех пор, пока не будет сделано другое изменение контекста, или пока не будет закрыто подключение или выполнена инструкция . В следующем примере инструкция EXECUTE AS используется для изменения контекста выполнения на пользователя Sara.
AdventureWorks.USE AdventureWorks; GO
Sara.EXECUTE AS USER='Sara';
Sara.TRUNCATE TABLE dbo.ErrorLog;
Только что рассмотренный код завершится с ошибкой, поскольку Sara не имеет разрешения на удаление всех строк в таблице без записи в журнал. Следующий код для удаления всех строк в таблице без записи в журнал будет успешно выполнен.
REVERT ;TRUNCATE TABLE dbo.ErrorLog;
Кроме управления контекстом выполнения для пакетов (групп инструкций T-SQL, отправленных серверу на выполнение, как в примере TRUNCATE TABLE, рассмотренном выше), можно управлять контекстом выполнения для хранимых процедур и пользовательских функций. Переключая контекст в этих модулях, вы можете управлять тем, какая учетная запись пользователя будет использоваться для доступа к объекту, на который ссылается хранимая процедура или функция. Для выполнения этой задачи можно использовать инструкцию EXECUTE AS со следующими изменениями:
CALLER. Инструкции внутри хранимой процедуры или функции, определяемой пользователем, выполняются в контексте вызывающей программы модуля.SELF. Инструкции выполняются в контексте пользователя, создавшего или изменившего хранимую процедуру или функцию.OWNER. Инструкции выполняются в контексте текущего владельца хранимой процедуры или функции..<User>or< Login >. Инструкции выполняются в контексте определенного пользователя или имени входа.В следующем примере создается хранимая процедура, которая переключает контекст на пользователя dbo. Затем она предоставляет разрешение EXECUTE для хранимой процедуры и изменение контекста Sara.
dbo.CREATE PROCEDURE dbo.usp TruncateErrorLog WITH EXECUTE AS "dbo" AS TRUNCATE TABLE dbo.ErrorLog; GO
Sara.GRANT EXECUTE ON dbo.usp_TruncateErrorLog TO Sara
Sara.EXECUTE AS [USER=]'Sara'
EXECUTE dbo.usp_TruncateErrorLog
Как видно из только что рассмотренного примера, переключение контекста может быть хорошим вариантом для разрешения некоторых операций пользователям, которым вы не можете предоставить разрешения полностью.
В этой и предыдущей лекции рассказывалось о том, как обеспечить безопасность доступа к экземпляру SQL Server, его базам данных и объектам, размещенным в базах данных. Очень важно понимать роль каждого из элементов иерархии безопасности в системе SQL Server. Первым шагом будет разрешение SQL Server принимать сетевые соединения, без чего невозможен доступ к системе.
После того, как физический доступ настроен, следует разрешить пользователям устанавливать соединение с экземпляром SQL Server. Эту задачу можно выполнить, создав имена входа для пользователей и групп Windows и имена входа SQL Server. Прежде чем сделать это, выберите метод проверки подлинности, который будет использоваться системой.
Получение доступа к экземпляру SQL Server означает доступ только для выполнения специфичных для сервера операций, для чего можно применить определенные разрешения через использование фиксированных ролей или назначения определенных разрешений именам входа.
Чтобы получить доступ к конкретной базе данных, необходимо добавить пользователя в эту базу данных. Эти пользователи обычно сопоставляются определенным именам входа в SQL Server. Когда пользователь уже существует в базе данных, можно применить специфические разрешения для выполнения операций на уровне базы данных.
Доступ к объектам базы данных контролируется различными способами, в зависимости от типа объекта. Эти разрешения могут применяться к отдельным пользователям или ролям базы данных, которые могут быть фиксированными или создаваться при необходимости для удовлетворения требований бизнеса.
Лучше назначать разрешения не для таблиц и столбцов, а для программируемых объектов, чтобы обеспечить лучшее обслуживание и инкапсуляцию.
Управление контекстом выполнения также предоставляет способ разрешить пользователям выполнять операции, которыми нельзя управлять через разрешения.
| Чтобы | Выполните следующие действия |
|---|---|
| Включить удаленные соединения | В окне SQL Server |
| Настройка режима проверки подлинности | В окне SQL Server Management Studio щелкните правой кнопкой на экземпляре SQL Server и выберите команду Properties (Свойства). В панели Select A Page (Выбор страницы) выделите значок Security (Безопасность). В секции Server Authentication (Проверка подлинности сервера) выберите режим проверки подлинности. |
| Предоставить доступ SQL Server пользователям домена Windows | Выполните инструкцию SQLCREATE LOGIN [<domain>\<user>] FROM WINDOWS; |
| Создать имя входа SQL Server для определенной базы данных | Выполните инструкцию SQLCREATE LOGIN <user>
WITH PASSWORD = "<password>",
DEFAULT_DATABASE =<database>;
|
| Получить список имен SQL Server | Выполните инструкцию SQL входа SELECT * FROM sys.sql_logins; |
| Включить строгую политику паролей | Выполните инструкцию SQLCREATE LOGIN <user> WITH PASSWORD = "<password>" MUST_CHANGE, CHECK_EXPIRATION = ON, CHECK_POLICY = ON; |
| Предоставить индивидуальные разрешения пользователю | Выполните инструкцию SQLGRANT ALTER <permission> TO <user>; |
| Удалить пользователя SQL Server | Выполните инструкцию SQLDROP LOGIN <user>; |
| Вывести отчет обо всех пользователях базы данных, утративших связь с именем входа | Выполните инструкцию SQLEXECUTE sp_change_users_login @Action='Report'; |
| Включить пользователя guest | Выполните инструкцию SQLGRANT CONNECT TO Guest; |
Одного предоставления доступа к экземпляру SQL Server будет недостаточно для приложения, которому необходим доступ к данным. Предоставив доступ к экземпляру SQL Server, необходимо предоставить доступ к определенным базам данных. Доступ к базам данных предоставляется посредством добавления пользователей базы данных и сопоставления пользователям базы данных имен входа. Каждое имя входа сопоставляется пользователю базы данных для каждой базы данных, к которой этому имени входа нужен доступ. Каждый пользователь базы данных сопоставляется только одному имени входа, за исключением пользователя базы данных dbo.
sp_addalias. Так можно поступить и в SQL Server 2005. Однако эту функцию использовать не рекомендуется, поскольку она считается устаревшей и, возможно, будет удалена из следующих версий программы.Пользователи базы данных - это участники уровня базы данных. Все имена входа, за исключением серверной роли сопоставлены пользователю dbo во всех базах данных сервера.
Добавить пользователя базы данных можно при помощи инструкции CREATE USER. Следующий пример кода Transact-SQL создает имя входа Peter и сопоставленного с ним пользователя в базе данных Adventure Works:
PeterCREATE LOGIN Peter WITH PASSWORD='Tyu87IOR0';
AdventureWorks.USE AdventureWorks; GO
Peter, который сопоставлен имени входа Peter в БД AdventureWorks.CREATE USER Peter FOR LOGIN Peter;
Проверить, имеет ли текущее имя входа доступ к базе данных, можно при помощи следующей инструкции:
SELECT HAS_DBACCESS('AdventureWorks');
Чтобы получить информацию о пользователях базы данных, можно воспользоваться представлением каталога sys.database_principals.
Если нужно временно отключить доступ пользователя к базе данных, можно отозвать разрешение CONNECT для этого пользователя. Следующий пример отзывает разрешение CONNECT для пользователя Peter:
AdventureWorks.USE AdventureWorks; GO
connect для Peter
в AdventureWorks.REVOKE CONNECT TO Peter;
Удалить пользователя в базы данных можно при помощи инструкции DROP USER.
Пользователями, утратившими связь с именами входа, называются пользователи базы данных, которые не сопоставлены имени входа в текущем экземпляре SQL Server. В SQL Server 2005 пользователь может утратить связь с именем входа, если сопоставленное ему имя входа будет удалено. Чтобы получить информацию о таких пользователях, можно выполнить следующий код:
AdventureWorks.USE AdventureWorks; GO
EXECUTE sp_change_users_login @Action='Report';
В SQL Server 2005 допускается создание пользователя, не сопоставленного имени входа, с помощью фразы WITHOUT LOGIN. Пользователи, созданные с помощью фразы WITHOUT LOGIN, не считаются пользователями, утратившими связь с именем входа. Эта возможность может быть очень полезна в ситуации, когда необходимо изменить контекст выполнения какого-либо модуля. О контексте выполнения рассказывается далее в этой лекции. Следующий пример создает пользователя, не сопоставленного имени входа.
AdventureWorks.USE AdventureWorks; GO
Paul в базе данных AdventureWorksCREATE USER Paul WITHOUT LOGIN;
Когда имя входа, которое не имеет сопоставленного пользователя, пытается соединиться с базой данных, SQL Server предпринимает попытку подключения с использованием пользователя Guest. Пользователь Guest создается по умолчанию без предоставления разрешений. Можно включить пользователя guest, предоставив ему разрешение CONNECT, как показано ниже.
AdventureWorks.USE AdventureWorks; GO
Guest доступ к базе данных AdventureWorks.GRANT CONNECT TO Guest;
Хорошо подумайте над тем, стоит ли включать пользователя guest, ведь это подвергает среду базы данных дополнительному риску.
Создав пользователей базы данных, необходимо управлять разрешениями для этих пользователей. Это можно осуществить, добавляя пользователей в роли базы данных или предоставляя самим пользователям гранулярные разрешения.
Роли базы данных - это участники уровня
| Роль базы данных | "Описание |
|---|---|
| db_accessadmin | Может управлять доступом к базе данных |
| db_backupoperator | Может выполнять резервное копирование базы данных |
| db_datareader | Может читать данные из таблиц всех пользователей |
| db_datawriter | Может добавлять, удалять и обновлять данные в таблицах всех пользователей |
| db_ddladmin | Может выполнять любые команды DDL в базе данных |
| db_denydatareader | Не может читать какие-либо данные в таблицах пользователей |
| db_denydatawriter | Не может добавлять, удалять и обновлять какие-либо данные в таблицах пользователей |
| db_owner | Может выполнять все действия по настройке конфигурации и обслуживанию |
| db_securityadmin | Может изменять членство в ролях базы данных и управлять разрешениями |
| public | Особая роль базы данных. Все пользователи принадлежат к роли public. Пользователей из группы public нельзя удалить. |
Можно добавлять роли базы данных, если нужно сгруппировать пользователей в соответствии с требованиями определенных разрешений. Следующий пример кода создает роль базы данных с именем Auditors и добавляет пользователя Peter в эту новую роль.
AdventureWorks.USE AdventureWorks; GO
Auditors в базе данных AdventureWorks.CREATE ROLE Auditors; GO
Peter к роли AuditorsEXECUTE sp_addrolemember "Auditors", "Peter";
Выполнив запрос системной функции IS_MEMBER, можно проверить, принадлежит ли текущий пользователь к какой-либо роли базы данных. В следующем примере мы проверим, принадлежит ли текущий пользователь к роли базы данных db_owner.
AdventureWorks.USE AdventureWorks; GO
SELECT IS_MEMBER ("db_owner");
IS_MEMBER можно использовать для проверки того, принадлежит ли текущий пользователь также к определенной группе Windows, как показано в следующем примере:AdventureWorks.USE AdventureWorks; GO
Managers в домене ADVWORKSSELECT IS_MEMBER ("[ADVWORKS\Managers]");
Удалить пользователей из роли базы данных можно при помощи системной хранимой процедуры sp_droprolemember. Если нужно удалить роль базы данных, то используется инструкция DROP ROLE. Следующий код удаляет пользователя Peter из роли базы данных Auditors, а затем удаляет роль Auditors.
AdventureWorks.USE AdventureWorks; GO
Peter из роли AuditorsEXECUTE sp_droprolemember "Auditors", "Peter";
Auditors из текущей базы данныхDROP ROLE Auditors;
В качестве альтернативы использованию фиксированных ролей базы данных можно предоставлять гранулярные разрешения пользователям и ролям базы данных. Разрешениями можно управлять при помощи инструкций GRANT, DENY и REVOKE. В следующем примере мы предоставим разрешение BACKUP DATABASE пользователю Peter:
AdventureWorks.USE AdventureWorks; GO
PeterAdventureWorks.GRANT BACKUP DATABASE TO Peter;
Когда вы используете инструкцию DENY для удаления разрешения для пользователя, этот пользователь может унаследовать то же самое разрешение, если является членом имеющей это разрешение роли базы данных. Но если для удаления разрешения вы воспользуетесь инструкцией REVOKE, то пользователь сможет унаследовать то же самое разрешение, если является членом роли базы данных, которой это разрешение уже предоставлено. Используйте инструкцию REVOKE только для удаления разрешений, которые были предоставлены ранее.
Роли приложения - это особые роли базы данных, которые можно использовать для разрешения доступа к определенным данным только тем пользователям, которые устанавливают соединение через определенное приложение. Роли приложений не содержат членов, поэтому перед использованием необходимо активизировать их в текущем соединении. При активизации роли приложения текущее соединение утрачивает разрешения, назначенные пользователям, и получает только разрешения, которые применимы к роли приложения.
Роль приложения можно создать при помощи инструкции CREATE APPLICATION ROLE. Этот код имеется в файле примеров ApplicationRoles.sql.
AdventureWorks.USE AdventureWorks; GO
FinancialRole в текущей базе данныхCREATE APPLICATION ROLE FinancialRole WITH PASSWORD = "Pt86Yu$$R3";
Роли приложений перед использованием необходимо активизировать. Это можно сделать, выполнив системную хранимую процедуру sp_setapprole. После того, как роль приложения активизирована в текущем соединении, она остается активной до тех пор, пока не будет закрыто соединение или выполнена системная хранимая процедура sp_unsetapprole. Хотя роли приложения предназначены для использования из клиентских приложений, их можно также использовать из особых пакетов T-SQL.
Следующая процедура (ее можно найти в файлах примеров под именем ApplicationRolesUse.sql ) описывает, как активизировать роль Financial Role и отменить эту активизацию.
AdventureWorks.USE AdventureWorks; GO
DECLARE @context varbinary (8000);
EXECUTE sp_setapprole "FinancialRole", "Pt86Yu$$R3", @fCreateCookie = true, @cookie = @context OUTPUT;
SELECT CURRENT_USER;
EXECUTE sp_unsetapprole @context; GO
SELECT CURRENT_USER; GO
Если нужно удалить роль приложения, используйте инструкцию DROP APPLICATION ROLE, как показано в следующем примере (этот код имеется в файле примеров ApplicationRoles.sql ):
AdventureWorks.USE AdventureWorks; GO
FinancialRole из текущей базы данныхDROP APPLICATION ROLE FinancialRole;
В SQL Server 2005 реализована концепция ANSI для схем. Схемы - это контейнеры объектов, которые позволяют группировать объекты базы данных. Схемы оказывают большое влияние на то, как пользователи ссылаются на объекты базы данных. В SQL Server 2005 объект базы данных называется именем, состоящим из четырех компонентов следующей структуры:
<Server>.<Database>.<Schema>.<Object>.
Схемы базы данных можно создавать при помощи инструкции CREATE SCHEMA. Создавая схему, можно создать объекты базы данных и назначить разрешения в пределах одной транзакции, которая вызывается инструкцией CREATE SCHEMA. Следующий пример (он есть в файлах примеров под именем ManagingAccessToSchemas01.sql ) создает схему с именем Accounting, назначает пользователя Peter владельцем схемы и создает таблицу с именем Invoices. В этом примере также предоставляется разрешение select роли базы данных public.
AdventureWorks.USE AdventureWorks; GO
Accounting с владельцем Peter.CREATE SCHEMA Accounting AUTHORIZATION Peter; GO
Invoices в схеме Accounting.CREATE TABLE Accounting.Invoices ( InvoiceID int, InvoiceDate smalldatetime, ClientID int); GO
SELECT на новую таблицу роли public.GRANT SELECT ON Accounting.Invoices TO public; GO
INSERT INTO Accounting.Invoices VALUES (101,getdate(),102);
Удалить схему можно при помощи инструкции DROP SCHEMA. В SQL Server 2005 не допускается удаление схемы, если в схеме есть объекты. Информацию о схемах можно получить, выполнив запрос к представлению каталога sys.schemas. Следующий пример выполняет запрос к представлению каталога sys.schemas, чтобы получить информацию о схеме:
SELECT * FROM sys.schemas;
Следующий код (который можно найти в файлах примеров под именем ManagingAccessToSchemas02.sql ) показывает, как удалить существующую схему, выполнив запрос к объектам, которые содержатся в этой схеме, и удалить сначала эти объекты.
AdventureWorks.USE AdventureWorks; GO
Accounting.SELECT s.name AS "Schema", o.name AS "Object" FROM sys.schemas s INNER JOIN sys.objects o ON s.schema_id=o.schema_id WHERE s.name='Accounting'; GO
Invoices из схемы Accounting.DROP TABLE Accounting.Invoices; GO
Accounting.DROP SCHEMA Accounting;
Одним из преимуществ схем является отделение пользователей от объектов. В SQL Server 2005 все объекты принадлежат к схемам, поэтому можно изменять и удалять пользователей базы данных без какого-либо влияния на объекты базы данных или ссылки на эти объекты из приложений базы данных. Эта абстракция позволяет владеть одними и теми же объектами нескольким пользователям, поскольку можно создать схему, владельцем которой будет роль базы данных.
Когда приложение ссылается на объект базы данных, не уточняя схемы, SQL Server осуществляет попытку найти объект в схеме, заданной для текущего пользователя по умолчанию. Если объект не содержится в схеме по умолчанию, SQL Server пытается обнаружить объект в схеме dbo. В следующем примере (который можно найти в файлах примеров под именем ManagingAccessToSchemas03.sql ) демонстрирует, как создать схему и назначить ее в качестве схемы по умолчанию для пользователя.
CREATE LOGIN Sara WITH PASSWORD='TUT87rr$$'; GO
AdventureWorks.USE AdventureWorks; GO
Sara в базе данных AdventureWorks
и сопоставляем этого пользователя имени входа SaraCREATE USER Sara FOR LOGIN Sara; GO
Marketing, владелец - пользователь Peter.CREATE SCHEMA Marketing AUTHORIZATION Peter; GO
Campaigns в только что созданной схеме.CREATE TABLE Marketing.Campaigns ( CampaignID int, CampaignDate smalldatetime, Description varchar (max)); GO
SELECT пользователю Sara на новую таблицу.GRANT SELECT ON Marketing.Campaigns TO Sara; GO
Marketing схемой по умолчанию для пользователя SaraALTER USER Sara WITH DEFAULT_SCHEMA=Marketing;
Таблица и столбцы хранят данные, которые извлекают и создают приложения. Управление доступом к этим данных осуществляется через иерархию разрешений SQL Server 2005. Управлять этой иерархией разрешений можно при помощи инструкций GRANT, DENY и REVOKE.
GRANT. Разрешает роли или пользователю выполнять операции, определенные в момент предоставления разрешения.
DENY. Запрещает пользователю или роли определенные разрешения и предотвращает наследование этих разрешений от других ролей..
REVOKE. Отзывает ранее запрещенные или предоставленные разрешения.
Доступ к таблице управляется действующими разрешениями, которые предоставлены пользователю на эту таблицу. Доступом пользователя к таблицам можно управлять при помощи управления разрешениями на таблицу. Разрешения, которыми можно управлять для таблиц, перечислены в табл. 3.2. Эти разрешения можно назначать пользователям базы данных и ролям.
| Разрешения | Описание |
|---|---|
ALTER |
Разрешает изменять свойства таблицы |
CONTROL |
Предоставляет разрешения, аналогичные владению |
DELETE |
Разрешает удалять строки из таблицы |
INSERT |
Разрешает добавлять столбцы в таблицу |
REFERENCES |
Разрешает ссылаться на таблицу из внешнего ключа |
SELECT |
Разрешает осуществлять выборку строк из таблицы |
TAKE OWNERSHIP |
Разрешает присвоение схемы или таблицы |
UPDATE |
Разрешает изменять строки в таблице |
VIEW DEFINITION |
Разрешает доступ к метаданным таблицы |
Доступ пользователям базы данных и ролям можно предоставить с помощью инструкции GRANT. В следующем примере разрешения SELECT, INSERT и UPDATE на таблицу Sales.Customer предоставляются пользователю Sara (код для управления доступом к таблицам в этом и следующих разделах имеется в файлах примеров под именем ManagingAccessToTables.sql.).
AdventureWorks.USE AdventureWorks; GO
Sara некоторые разрешенияSales.Customer table.GRANT SELECT,INSERT,UPDATE ON Sales.Customer TO Sara;
Если нужно не допустить доступ пользователя к таблице, то можно столкнуться с двумя ситуациями. Если вы до этого предоставили пользователю разрешение на эту таблицу, то для удаления ранее предоставленных разрешений следует воспользоваться инструкцией REVOKE. Например:
AdventureWorks.USE AdventureWorks; GO
SELECT на таблицу Sales.Customer у Sara.REVOKE SELECT ON Sales.Customer TO Sara;
Однако пользователь может сохранить отозванное разрешение вследствие принадлежности к роли, которой предоставлено данное разрешение. В этом случае необходимо использовать инструкцию DENY, чтобы запретить доступ этому пользователю. Например:
AdventureWorks.USE AdventureWorks; GO
Sara разрешение DELETE на таблицу Sales.Customer.
независимо от того, какие разрешения этот пользователь мог
унаследовать от роли.DENY DELETE ON Sales.Customer TO Sara;
В SQL Server 2005 есть возможность предоставить или отклонить доступ к отдельным столбцам, вместо того, чтобы работать со всей таблицей. Эта возможность предоставляет гибкость в отклонении доступа, например, к конфиденциальным данным в некоторых столбцах. Разрешения, которыми можно управлять для столбцов таблицы, перечислены в табл. 3.3.
| Разрешение | Описание |
|---|---|
SELECT |
Разрешает выполнить выборку из столбца |
UPDATE |
Разрешает изменять данные в столбце |
Доступ к отдельным столбцам можно предоставить с помощью инструкции GRANT. В следующем примере разрешения SELECT и UPDATE предоставляются пользователю Sara на столбцы Demographics и Modified Date таблицы Sales.Individual. (Код для управления доступом к столбцам таблицы в этом и следующих разделах имеется в файлах примеров под именем ManagingAccessToColumns. sql.)
AdventureWorks.USE AdventureWorks; GO
SELECT и UPDATE пользователю Sara
на определенные столбцы таблицы Sales.IndividualGRANT SELECT,UPDATE ( Demographics, ModifiedDate) ON Sales.Individual TO Sara;
Аналогично, можно отозвать доступ к отдельным столбцам при помощи инструкции REVOKE. Не забывайте, что если нужно не допустить получения пользователем разрешения, необходимо использовать инструкцию DENY.
AdventureWorks.USE AdventureWorks; GO
Demographics для пользователя Sara.REVOKE UPDATE (Demographics) ON Sales.Individual TO Sara;
Такие программируемые объекты, как хранимые процедуры и определяемые пользователем функции, имеют свой контекст безопасности. Чтобы выполнять хранимые процедуры, функции и сборки, пользователям базы данных необходимы разрешения. После того, как ядро базы данных выполнит проверку на наличие разрешений на выполнение программируемого объекта, оно проверяет наличие разрешений на выполнение операций, в которых используются программируемые объекты. Когда объекты базы данных последовательно обращаются друг к другу, эта последовательность формирует цепочку владения. О цепочках владения рассказывается далее в этой лекции.
Хранимые процедуры - это, вероятно, те объекты базы данных, которые наиболее часто используются разработчиками. Как и другие объекты базы данных, хранимые процедуры являются
| Разрешение | Описание |
|---|---|
ALTER |
Разрешает изменять свойства хранимой процедуры |
CONTROL |
Предоставляет разрешения, аналогичные владению |
EXECUTE |
Разрешает выполнять хранимую процедуру |
TAKE OWNERSHIP |
Разрешает присвоение хранимой процедуры |
VIEW DEFINITION |
Разрешает просматривать метаданные хранимой процедуры |
Когда приложение совершает вызов для EXECUTE для этой хранимой процедуры. В следующем примере разрешение EXECUTE для хранимой процедуры dbo.uspGetBillOfMaterials предоставляется пользователю Sara. (Код в этом и следующих разделах можно найти в файлах примеров под именем ManagingAccessToProgrammableObjects.sql.)
AdventureWorks.USE AdventureWorks; GO
Sara разрешение EXECUTE для хранимой
процедуры.GRANT EXECUTE On dbo.uspGetBillOfMaterials TO Sara;
Аналогично, если вам нужно не допустить выполнение каким-либо пользователем хранимой процедуры, вы можете отозвать ( REVOKE ) или запретить ( DENY ) разрешение EXECUTE для этого пользователя.
Определяемые пользователем функции - это программируемые объекты, как и хранимые процедуры. Существует два основных вида определяемых пользователем функций: функции, возвращающие скалярное значение, которые возвращают одно значение, и функции, которые возвращают табличное значение. В зависимости от типа определяемой пользователем функции, вам придется предоставить одно из двух разрешений - EXECUTE или SELECT (см. табл. 3.5).
| Разрешение | Описание |
|---|---|
ALTER |
Разрешает изменять свойства хранимой процедуры |
CONTROL |
Предоставляет разрешения, аналогичные владению |
TAKE OWNERSHIP |
Разрешает присваивание хранимой процедуры |
VIEW DEFINITION |
Разрешает просматривать метаданные хранимой процедуры |
SELECT |
Разрешает выборку данных, возвращаемых их определяемой пользователем функции (только для функций, возвращающих табличное значение) |
EXECUTE |
Разрешает выполнять определяемые пользователем функции (только для функций, возвращающих скалярное значение). |
Когда пользователь выполняет функцию, возвращающую табличное значение, SQL Server проверяет, имеет ли этот пользователь разрешение SELECT для данной таблицы. Эти разрешения для функции можно предоставить тем же способом, каким предоставляется разрешение SELECT для таблиц. В следующем примере пользователю Sara предоставляется разрешение SELECT на определяемую пользователем функцию dbo.ufnGetContactInformation.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение пользовательской функции.GRANT SELECT ON dbo.ufnGetContactInformation TO Sara;
Для выполнения функции, возвращающей скалярное значение, пользователю необходимо иметь разрешение EXECUTE для этой функции. Разрешение EXECUTE для функции, возвращающей скалярное значение, предоставляется тем же способом, что и разрешение EXECUTE для хранимой процедуры. В следующем примере пользователю Sara предоставляется разрешение EXECUTE для функции dbo.ufnGetStock.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение пользовательской функции.GRANT EXECUTE ON dbo.ufnGetStock TO Sara;
SQL Server 2005 предоставляет возможность включать сборки .NET (объекты, которые ссылаются на файлы .dll ) в механизм базы данных и вызывать эти сборки в хранимых процедурах и функциях. Для сборок можно задать те же разрешения, что и для хранимых процедур. Смотрите список разрешений в табл. 3.4.
Для создания сборки вам необходимо определить набор разрешений. Этот набор разрешений определяет набор разрешений на доступ к коду, который предоставляется сборке в SQL Server. Существует три различных набора разрешений:
SAFE. Код, выполняемый сборкой, не может обращаться к внешним системным ресурсам. SAFE - это самый ограничительный набор разрешений, который установлен по умолчанию..EXTERNAL_ACCESS. Сборка может обращаться к внешним системным ресурсам.UNSAFE. Сборка может выполнять неуправляемый код.SAFE является рекомендуемым набором разрешений для сборок, которые не нуждаются в доступе к внешним ресурсам.
Когда приложение пытается обратиться к объекту внутри сборки, механизм базы данных проверяет, имеет ли текущий пользователь разрешение EXECUTE. Следующий код используется для предоставления разрешения EXECUTE для сборки пользователю Sara.
AdventureWorks.USE AdventureWorks; GO
Sara разрешение на выполнение сборки.GRANT EXECUTE ON <AssemblyName> TO Sara;
Предоставляя разрешение EXECUTE для сборки, вы предоставляете пользователю разрешение EXECUTE для всех объектов сборки.
Цепочка владения - это последовательность объектов базы данных, которые обращаются друг к другу. Например, когда вы добавляете в таблицу строку из хранимой процедуры, то хранимая процедура является вызывающим объектом, а таблица - вызываемым объектом. Когда SQL Server обходит цепочку, механизм базы данных оценивает разрешения по-другому, не так, как если бы вы обращались к объектам по отдельности.
При обращении к объекту в цепочке, SQL Server сначала сравнивает владельца вызываемого объекта и владельца вызывающего объекта. Если у объектов один владелец, то разрешения вызываемого объекта не оцениваются. Эта функция очень полезна для управления разрешениями объектов. Предположим, например, что Sara создает таблицу с именем Person.SupplierContacts и хранимую процедуру Person.InsertSupplierContacts, c помощью которой Sara добавляет строки в таблицу PersonSupplierContacts. Поскольку у этих объектов один владелец, Sara, то для того, чтобы предоставить другим пользователям разрешение EXECUTE для таблицы PersonSupplierContacts, достаточно предоставить разрешение EXECUTE на хранимую процедуру Person.InsertSupplierContacts. Нет необходимости предоставлять другим пользователям разрешения для таблицы.
Имя входа и пользователь, подключившиеся на время сеанса или выполняющие процедуру, определяют контекст выполнения. Маркеры имени входа и пользователя предоставляют SQL Server информацию, необходимую для оценки разрешений объектов. SQL Server 2005 предоставляет возможность изменить контекст выполнения при помощи инструкции EXECUTE AS. Эта операция называется переключением контекста.
Инструкция EXECUTE AS позволяет явно определить контекст выполнения для текущего соединения. EXECUTE AS можно использовать для того, чтобы изменить имя входа пользователя для текущего соединения. Изменение контекста выполнения действительно до тех пор, пока не будет сделано другое изменение контекста, или пока не будет закрыто подключение или выполнена инструкция . В следующем примере инструкция EXECUTE AS используется для изменения контекста выполнения на пользователя Sara.
AdventureWorks.USE AdventureWorks; GO
Sara.EXECUTE AS USER='Sara';
Sara.TRUNCATE TABLE dbo.ErrorLog;
Только что рассмотренный код завершится с ошибкой, поскольку Sara не имеет разрешения на удаление всех строк в таблице без записи в журнал. Следующий код для удаления всех строк в таблице без записи в журнал будет успешно выполнен.
REVERT ;TRUNCATE TABLE dbo.ErrorLog;
Кроме управления контекстом выполнения для пакетов (групп инструкций T-SQL, отправленных серверу на выполнение, как в примере TRUNCATE TABLE, рассмотренном выше), можно управлять контекстом выполнения для хранимых процедур и пользовательских функций. Переключая контекст в этих модулях, вы можете управлять тем, какая учетная запись пользователя будет использоваться для доступа к объекту, на который ссылается хранимая процедура или функция. Для выполнения этой задачи можно использовать инструкцию EXECUTE AS со следующими изменениями:
CALLER. Инструкции внутри хранимой процедуры или функции, определяемой пользователем, выполняются в контексте вызывающей программы модуля.SELF. Инструкции выполняются в контексте пользователя, создавшего или изменившего хранимую процедуру или функцию.OWNER. Инструкции выполняются в контексте текущего владельца хранимой процедуры или функции..<User>or< Login >. Инструкции выполняются в контексте определенного пользователя или имени входа.В следующем примере создается хранимая процедура, которая переключает контекст на пользователя dbo. Затем она предоставляет разрешение EXECUTE для хранимой процедуры и изменение контекста Sara.
dbo.CREATE PROCEDURE dbo.usp TruncateErrorLog WITH EXECUTE AS "dbo" AS TRUNCATE TABLE dbo.ErrorLog; GO
Sara.GRANT EXECUTE ON dbo.usp_TruncateErrorLog TO Sara
Sara.EXECUTE AS [USER=]'Sara'
EXECUTE dbo.usp_TruncateErrorLog
Как видно из только что рассмотренного примера, переключение контекста может быть хорошим вариантом для разрешения некоторых операций пользователям, которым вы не можете предоставить разрешения полностью.
В этой и предыдущей лекции рассказывалось о том, как обеспечить безопасность доступа к экземпляру SQL Server, его базам данных и объектам, размещенным в базах данных. Очень важно понимать роль каждого из элементов иерархии безопасности в системе SQL Server. Первым шагом будет разрешение SQL Server принимать сетевые соединения, без чего невозможен доступ к системе.
После того, как физический доступ настроен, следует разрешить пользователям устанавливать соединение с экземпляром SQL Server. Эту задачу можно выполнить, создав имена входа для пользователей и групп Windows и имена входа SQL Server. Прежде чем сделать это, выберите метод проверки подлинности, который будет использоваться системой.
Получение доступа к экземпляру SQL Server означает доступ только для выполнения специфичных для сервера операций, для чего можно применить определенные разрешения через использование фиксированных ролей или назначения определенных разрешений именам входа.
Чтобы получить доступ к конкретной базе данных, необходимо добавить пользователя в эту базу данных. Эти пользователи обычно сопоставляются определенным именам входа в SQL Server. Когда пользователь уже существует в базе данных, можно применить специфические разрешения для выполнения операций на уровне базы данных.
Доступ к объектам базы данных контролируется различными способами, в зависимости от типа объекта. Эти разрешения могут применяться к отдельным пользователям или ролям базы данных, которые могут быть фиксированными или создаваться при необходимости для удовлетворения требований бизнеса.
Лучше назначать разрешения не для таблиц и столбцов, а для программируемых объектов, чтобы обеспечить лучшее обслуживание и инкапсуляцию.
Управление контекстом выполнения также предоставляет способ разрешить пользователям выполнять операции, которыми нельзя управлять через разрешения.
| Чтобы | Выполните следующие действия |
|---|---|
| Включить удаленные соединения | В окне SQL Server |
| Настройка режима проверки подлинности | В окне SQL Server Management Studio щелкните правой кнопкой на экземпляре SQL Server и выберите команду Properties (Свойства). В панели Select A Page (Выбор страницы) выделите значок Security (Безопасность). В секции Server Authentication (Проверка подлинности сервера) выберите режим проверки подлинности. |
| Предоставить доступ SQL Server пользователям домена Windows | Выполните инструкцию SQLCREATE LOGIN [<domain>\<user>] FROM WINDOWS; |
| Создать имя входа SQL Server для определенной базы данных | Выполните инструкцию SQLCREATE LOGIN <user>
WITH PASSWORD = "<password>",
DEFAULT_DATABASE =<database>;
|
| Получить список имен SQL Server | Выполните инструкцию SQL входа SELECT * FROM sys.sql_logins; |
| Включить строгую политику паролей | Выполните инструкцию SQLCREATE LOGIN <user> WITH PASSWORD = "<password>" MUST_CHANGE, CHECK_EXPIRATION = ON, CHECK_POLICY = ON; |
| Предоставить индивидуальные разрешения пользователю | Выполните инструкцию SQLGRANT ALTER <permission> TO <user>; |
| Удалить пользователя SQL Server | Выполните инструкцию SQLDROP LOGIN <user>; |
| Вывести отчет обо всех пользователях базы данных, утративших связь с именем входа | Выполните инструкцию SQLEXECUTE sp_change_users_login @Action='Report'; |
| Включить пользователя guest | Выполните инструкцию SQLGRANT CONNECT TO Guest; |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.