Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru

#209<<  #210

СОДЕРЖАНИЕ

1.СОВЕТЫ
1.1.Цепочки владения в Yukon
2.ССЫЛКИ НА СТАТЬИ
2.1.Англоязычные статьи
3.ФОРУМ SQL.RU
3.1.Самые популярные темы недели
3.2.Вопросы остались без ответа

СОВЕТЫ

Цепочки владения в Yukon

По материалам статьи Amol Kulkarni: Ownership Chains in Yukon
Перевод Виталия Степаненко

Когда объекты базы данных последовательно обращаются друг к другу, такая последовательность называется "цепочкой". Хотя эти цепочки не существуют независимо, когда SQL Server рассматривает ссылки в цепочке, то он оценивает права пользователя на доступ к объектам иначе, чем если бы пользователь обращался к ним по отдельности. Эти различия имеют большое влияние на управление безопасностью.

В этой статье мы рассмотрим, как работают цепочки владения в Yukon. Для демонстрации, мы используем троих пользователей (Mary, John и Scott) и рассмотрим три сценария.

Четыре сценария

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

sp_addlogin 'Mary','mary123','AdventureWorks'

GO

USE AdventureWorks

GO

sp_grantdbaccess 'Mary'

GO

sp_addrolemember 'db_ddladmin','Mary'

Повторите вышеуказанный код для двух других пользователей: John и Scott. (замените в коде Mary на John, а потом на Scott).

Сценарий I

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

Она дает права на выполнение хранимой процедуры другому пользователю, John. Когда John выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры. Т.к. John имеет права на работу с хранимой процедурой, и т.к. хранимая процедура и таблица, на которую ссылается эта процедура, имеют общего владельца, то дополнительная проверка доступа не производится и команда выполняется. Другими словами, когда Mary дала John права на работу с хранимой процедурой, она косвенно дала ему права на работу с таблицей, на которую ссылается хранимая процедура (и которая также принадлежит Mary).

1. Подсоединитесь к серверу как Mary и создайте таблицу и хранимую процедуру.

CREATE TABLE students -- Создание таблицы students
(rollno INT
,name VARCHAR(30)
,address VARCHAR(100))

GO

INSERT INTO students -- Вставка записей в таблицу students
SELECT '101','ABC','LA' UNION
SELECT '102','XYZ','LA' UNION
SELECT '103','PQR','LA'

GO

CREATE PROCEDURE stud_sp -- Создание хранимой процедуры stud_sp
AS
SELECT * FROM students

2. Дайте John права на выполнение хранимой процедуры 'stud_sp'.

GRANT EXECUTE ON stud_sp TO john

3. Теперь подсоединитесь к серверу как John и выполните хранимую процедуру 'stud_sp'.

EXECUTE Mary.stud_sp

Сценарий II

John создает хранимую процедуру, которая ссылается на таблицу, которая ему не принадлежит, но он имеет права на выполнение SELECT из этой таблицы (владелец таблицы - Mary, и она дала John права на таблицу).

John дает Scott права на выполнение хранимой процедуры. Когда Scott выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры. Scott имеет такие права, но т.к. John не является владельцем таблицы, на которую ссылается процедура, то SQL Server проверяет, имеет ли Scott права на эту таблицу. Если нет, то выполнение хранимой процедуры прерывается.

1. Подсоединитесь к серверу как Mary и дайте John права доступа к таблице students.

GRANT SELECT ON students TO john

2. Подсоединитесь к серверу как John и создайте хранимую процедуру 'stud_sp_john'.

CREATE PROCEDURE stud_sp_john
AS
SELECT * FROM Mary.students

3. Дайте Scott права на выполнение хранимой процедуры 'stud_sp_john'.

GRANT EXECUTE ON stud_sp_john TO Scott

4. Теперь подсоединитесь к серверу как Scott и выполните хранимую процедуру.

EXECUTE John.stud_sp_john

На заметку: это не сработает из-за разорванной цепочки владения

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

CREATE PROCEDURE stud_sp_john
WITH EXECUTE AS CALLER
AS SELECT * FROM Mary.students

EXECUTE AS CALLER является значением по умолчанию (для обратной совместимости).

Сценарий III

Mary создает хранимую процедуру, которая ссылается на таблицу, владельцем которой Mary не является (владельцем таблицы является John, который дал Mary права на выборку данных из таблицы), но имеет права на выборку данных. Она указывает EXECUTE AS USER = Mary в команде CREATE PROCEDURE.

Mary дает права на выполнение хранимой процедуры другому пользователю, Scott. Когда Scott выполняет хранимую процедуру, SQL Server проверяет, что он имеет права на выполнение хранимой процедуры; но при этом права на доступ к таблице, на которую ссылается процедура, проверяются у Mary. В этом сценарии, даже если Scott не имеет прямых прав на выборку данных из таблицы, он может получить доступ к данным через процедуру, т.к. Mary, в чьем контексте выполняется процедура, имеет доступ к таблице.

1. Подсоединитесь к серверу как Mary и создайте хранимую процедуру 'stud_sp_mary' с опцией "WITH EXECUTE AS USER = Mary".

CREATE PROCEDURE stud_sp_mary
WITH EXECUTE AS USER = Mary
AS
SELECT * FROM students

2. Теперь дайте Scott права на выполнение 'stud_sp_mary'.

GRANT EXECUTE ON stud_sp_mary TO Scott

3. Подсоединитесь к серверу как Scott и выполните хранимую процедуру 'stud_sp_mary'

EXECUTE Mary.stud_sp_mary

Сценарий IV

EXECUTE AS SELF является сокращенным вариантом опции для текущего пользователя (того, который создает или изменяет процедуру), чтобы определить контекст, в котором этот пользователь хочет выполнять команды процедуры. EXECUTE AS SELF является эквивалентом AS USER = user_name (описано в предыдущем сценарии), где указанный в опции пользователь есть одновременно лицо, создающее или изменяющее процедуру. В каталоге на самом деле хранится ID пользователя, а не значение SELF.

1. Подсоединитесь к серверу как Mary и создайте хранимую процедуру 'stud_sp_mary' с опцией "WITH EXECUTE AS SELF".

CREATE PROCEDURE stud_sp_mary
WITH EXECUTE AS SELF
AS
SELECT * FROM John.items

2. Теперь дайте Scott права на выполнение 'stud_sp_mary'.

GRANT EXECUTE ON stud_sp_mary TO Scott

3. Подсоединитесь к серверу как Scott и выполните хранимую процедуру 'stud_sp_mary'

EXECUTE Mary.stud_sp_mary

Заключение

Используйте EXECUTE AS CALLER в следующих случаях:

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

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

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

Используйте EXECUTE AS USER = user_name в следующих случаях:

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

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

o Вы хотите создать индивидуальный набор прав доступа. Например, чтобы дать права доступа к операциям DDL, для которых специфические права доступа обычно не могут быть выданы.

Используйте EXECUTE AS SELF в следующих случаях:

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

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

Amol Kulkarni - сотрудник Tata Consultancy Services (TCS), Hyderabad, India.

[В начало]

ССЫЛКИ НА СТАТЬИ

Англоязычные статьи

Using Different Techniques for SQL Server Automation
Haidong Ji
In my previous articles (Using xp_cmdshell, Using WMI, Using VBScript, Automate DTS Logging, among others), I talked about various technologies you can use to automate SQL Server management. Different situations call for different techniques. Many times, you may find yourself using a combination of those techniques to achieve your objective
ADO.NET - A Data Access Layer
Patryk Nowakowski
With the release of ADO .NET Microsoft has fundamentally changed the way of database applications development. The new version of ADO introduced with .NET Framework is extremely flexible and gives developers a wide variety of tools for handling common database programming tasks. This comes with special regard to so called disconnected data structures, i.e. objects residing in memory that hold copy of data in the database. These structures allow developers to easily manipulate data in client applications (often referred to as “presentation layer”). This approach may be called a thick client as a vast part of data manipulation is performed on client side. Thanks to ADO .NET users can slice and dice data and make changes to it with as little effort put in application preparation as possible. Off-line objects need to be filled with data from database and commit changes made by user. It appears as though this task is not so easy, especially if we consider the vast number of techniques for retrieving and especially updating data in the database
How To Get Output Into SQL Server Table
Gregory A. Larsen
Have you every needed to get the information returned from a stored procedure (SP) into a SQL Server table? Or have you wondered how you might get the contents of an operating system (OS) file into a SQL Server table? How about placing the output of some Windows executable into a SQL Server table so you can manipulate it with T-SQL in some way? So, what methods can you use to accomplish these different, but similar tasks? This article will show you how to insert rows into a SQL Server table from various sources
MSSQL Server 2000 Reporting Services: Mastering OLAP Reporting: Cascading Prompts
William Pearson
A common requirement of enterprise reporting is the capability for information consumers to filter reports at run time for specific information they need. This is typically managed via parameterization, also known as "prompting," where the filter criteria is requested (and hence the consumer is "prompted") when the report is run. Depending upon the parameter type (the most common are type-in and picklist), the filters are typically enacted when the consumer types or selects a value, or a series of values
DB Change Management - An Automated Approach - Part 2
Darren Fuller
If you participate in a project that involves database development, a crucial element of a project’s success, is the accurate propagation and deployment of the database code and schema changes. Often, an unnecessarily large proportion of highly-skilled resource is required for this aspect of the project. Once the analysis and design has been completed, the deployment of the changes, while critical, is quite laborious and repetitive. Therefore, it is highly recommended to systematise or automate these tasks
T-SQL Enhancements in SQL Server 2005
Bob Beauchemin, Niels Berglund, Dan Sullivan
SQL Server 2005 includes a plethora of new features and tools that can help developers more efficiently and effectively manage data. This article provides a preview of the new features and their use
Reuse SQL Code Easily With UDFs
Roman Rehak
One of the more useful newer features SQL Server 2000 offers is the ability to create user-defined functions (UDFs). A SQL Server UDF encapsulates a piece of SQL code and makes it easy to reuse in other database objects. I'll provide you with guidelines and recommendations for using each type of UDF and discuss scenarios where UDFs provide a better alternative to views and stored procedures. I'll also show you how to implement and manage your own system user-defined functions
SQL Server Auditing - Part 1
Brian Kelley
SQL Server has several methods of auditing logins and the simplest among these is to change the audit level within SQL Server. Using traces through Profiler or the set of trace stored procedures is another method, but most folks gets started by configuring auditing in Enterprise Manager. Depending on the auditing requirement, I may find myself using one or both methods. However, I'll save tracing for another article
An introduction to using the ADO.NET - SqlCommand Object
Jon Winer
Are you familiar with using the Command object in ADO? If so, migrating to ADO.NET shouldn't be as much of a headache as you might think. Here I discuss a couple of the methods available using ADO.NET's SqlDataReader and SqlCommand objects that map well to coding practices commonly utilized in ADO
The current anniversary year
Rudy Limeback
My database is SQL Server 2000. I am writing a SQL statement to find the number of Sick days taken for this year. My issue is that the Anniversary date is the Hiredate. I just need to know the number of the days taken for this year
The End User Component of Database Administration
James F. Koopmann
If you continually gauge database performance from a strictly database-internal point of view, you are missing the boat. Begin watching your database end users and performance will begin to take on a whole new meaning
First Impressions of SQL Server 2005: Installation and Tools
Brian Knight
This is the first part of a series of articles where I take you through my exploration of SQL Server 2005 Beta 2. In this part of the series, I’m going to cover what is SQL Server 2000’s strongest asset, its tools. The tools like Enterprise Manager and Profiler give you the quickest way to get to the market with your product. The tools in SQL Server 2005 have begun an evolution to where you will not recognize it as SQL Server. This article provides a high-level overview of my first impressions of the tool suite and the installation. Keep in mind that I’m only touching the surface and that this can cover several articles

[В начало]

ФОРУМ SQL.RU

Самые популярные темы недели

Ваше мнение об упражнениях SELECT на http://sql.ipps.ru
Tool Вы знаете что твориться на ваших 10-30+ серверах ?
Крик души типа
Timestamp вдруг перестал означ. при update, insert
Приведение таблицы строк к единому виду, помогите плиз
Какая винда лучше подходит?
Проблема с падением скорости при Insert'ах
При четком сравнении 2-х строк получается что 'CopyProblemFromArhive'='CopyPaketToArhive'
Значения null - хуже не придумать
Обновление данных на клиенте в реальном времени
SQL сошел с ума
Как задать Collation на самом сервере?
Перезапись имени
Кстати еще одна странная вещь с индексами
Есть ли запись пакороче????
permissions в базе
хелп про хелп
Возможно ли определить имя транзакции...
Доступ одним запросом к нескольким базам
ПОЧЕМУ Я ДЕЛАЮ ШРИНК БАЗЫ А ОНА НЕ УМЕНЬШАЕТСЯ

[В начало]

Вопросы остались без ответа

перенос Subscriber Database
DTS сообщения
DBArtisan 7.3.1 Trial
Не получается сделать упражнение на sql.ipps.ru
3146 ODBC--call failed.
XLS->SQL Можно ли указать диапазон ячеек?
Отчёты из Reporting Servises в Excel хорошо экспортируются?

[В начало]

#209<<  #210

Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Виталию Степаненко на адрес: stvitaly@sql.ru

sql.ru Описание рассылки

СЕМИНАРЫ
КОНФЕРЕНЦИИ

МИНИФОРМА
ПОДПИСКИ



ПУБЛИКАЦИИ
АРХИВ


http://subscribe.ru/
http://subscribe.ru/feedback/
Адрес подписки
Отписаться

В избранное