Câu lệnh EXECUTE AS trong SQL Server 2005
Trong SQL Server 2005, bn hoàn tn có thxác đnh được rõ ng ngữ cảnh
thực thi của một người dùng cụ thể. Như đã biết, một session (phiên làm việc)
bắt đầu khi người dùng đăng nhập vào SQLServer hoặc kết nối ti SQLServer.
Tất cả hoạt động trong sesstion đó dùng các y nhiệm đăng nhập đư
c sử dụng
để kết nối tới SQL Server. Khiu lnh EXECUTE AS chạy, ngữ cảnh thực
thi của session sẽ chuyển tới login hay tên người dùng.
Đây là một tin ích rất lợi cho những người quản trị cơ sở d liệu SQL
Server 2005 khi họ cần kiểm tra sự cho phép của tng người dùng c thể. Nó
còn rất hu ích khi người dùng muốn thc thi một hàm được lưu trữ trong ng
cảnh của người dùng kc. Bàiy s giải thích tính hu ích củau lnh
EXECUTE AS đối với người quản trị cơ sở dữ liệu.
Gi dquản trị cơ sở d liệu Mr.Smith muốn tạo một tài khon đăng nhập
SQL Server cho Shiraishi và cp phát truy cập tới các cửa sđăng nhập
“SQL2005/Shiraishi” một cách dễ dàng. Thêm o đó, anh y trao quyn chỉ
đọc tới bảng products trong giản đồ CompanyProducts. Tuy nhiên, người quản
không mun Ms.Shiraishi có thể truy cập vào bảng productprice trong cùng
giản đđó.
Với tình hung đó chúng ta phải cơ s dữ liệu dưới, CompanyProducts:
USE [master]
GO
/****** Object: Database [CompanyProducts]
Script Date: 03/26/2006 19:32:40 ******/
IF EXISTS (SELECT name FROM sys.databases
WHERE name = N'CompanyProducts')
DROP DATABASE [CompanyProducts]
go
create database CompanyProducts
go
USE [CompanyProducts]
GO
/****** Object: Schema [CompanyCustomers]
Script Date: 03/26/2006 19:33:45 ******/
IF EXISTS (SELECT * FROM sys.schemas
WHERE name = N'CompanyCustomers')
DROP SCHEMA [CompanyCustomers]
go
create Schema CompanyProducts
go
USE [CompanyProducts]
GO
/****** Object: Table
[CompanyProducts].[Products]
Script Date: 03/26/2006 19:34:32 ******/
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id =
OBJECT_ID(N'[CompanyProducts].[Products]')
AND type in (N'U'))
DROP TABLE [CompanyProducts].[Products]
go
Create table CompanyProducts.Products
(id int, Name varchar(100))
go
insert into CompanyProducts.Products
select 1,'Refrigerator'
go
insert into CompanyProducts.Products
select 2,'Washing Machine'
go
insert into CompanyProducts.Products
select 3,'Dryer'
go
insert into CompanyProducts.Products
select 4,'Lawn Mower'
go
USE [CompanyProducts]
GO
/****** Object: Table [CompanyProducts].[ProductPrice]
Script Date: 03/26/2006 19:34:12 ******/
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[CompanyProducts].[ProductPrice]')
AND type in (N'U'))
DROP TABLE [CompanyProducts].[ProductPrice]
go
Create table CompanyProducts.ProductPrice
(id int, Price money)
go
insert into CompanyProducts.ProductPrice
select 1,7000
go
insert into CompanyProducts.ProductPrice
select 2,1000
go
insert into CompanyProducts.ProductPrice
select 3,1000
go
insert into CompanyProducts.ProductPrice
select 4,2500
go
Khi Mr.Smith là một người quản trị cơ sở dữ liu, anh ấy log on tới
Management Studio sử dụng SA để đăng nhập. Mr.Smith thực thi các câu lệnh
dưới để tạo mt tài khoản đăng nhập người dùng cho Ms.Shiraishi
use master
go
create login Shiraishi with password ='Sh!r@!sh!'
go
create login [SQL2005\Shiraishi] from windows
go
use CompanyProducts
go
Create user SQL_Shiraishi for LOGIN Shiraishi
go
Create user WIN_Shiraishi for LOGIN [SQL2005\Shiraishi]
go
GRANT SELECT on CompanyProducts.Products to
SQL_Shiraishi,WIN_Shiraishi
go
DENY SELECT on CompanyProducts.ProductPrice to
SQL_Shiraishi,WIN_Shiraishi
Go
Mr.Smith muốn kiểm tra quyền cấp phép cho c đăng nhập SQL và Windows
của Ms.Shiraishi. Khi đăng nhập SQL đã được tạo bởi Smith, anh ấy sẽ biết
password đăng nhập Shiraishi và có th kiểm tra quyền cấp phép trong Login
bằng cách sdụng tiện ích SQLCMD hoặc Management Studio.
Thật kng hay là SQL2005\Shiraishi một đăng nhập Windows v
à Mr.Smith
(hay bất kỳ một người quản tr hệ thống nào) cũng không có password. Chỉ
Ms.Shiraishi có và tất nhiên không thể tự dưng hỏi một người nào đó
password ca họ được.
Mr.Smith có th kiểm trac cấp pp trong cả đăng nhp SQL và Windows
bằng cách sdụng câu lệnh EXECUTE AS mi trong SQL Server 2005, vậy l
à
vấn đề trên đã được giải quyết.
use CompanyProducts
go
Execute as user = 'SQL_Shiraishi'
select * from CompanyProducts.Products
--RESULT
1 Refrigerator
2 Washing Machine
3 Dryer
4 Lawn Mower
select * from CompanyProducts.ProductPrice
--RESULT
Msg 229, Level 14, State 5, Line 1
SELECT permission denied on object 'ProductPrice', database
'CompanyProducts', schema 'CompanyProducts'.
Mr.Smith mở cửa sổ truy vấn mới và thc thi các câu lệnh dưới đây
Execute as user = 'WIN_Shiraishi'
select * from CompanyProducts.Products
--RESULT
1 Refrigerator
2 Washing Machine
3 Dryer
4 Lawn Mower
select * from CompanyProducts.ProductPrice
--RESULT
Msg 229, Level 14, State 5, Line 1
SELECT permission denied on object 'ProductPrice', database
'CompanyProducts', schema 'CompanyProducts'.
Kết luận
Trong bài y, cng tôi đã gii thích tác dụng của u lệnh EXECUTE AS
mới trong SQL Server 2005. sẽ rất ích cho các qun trị viên cơ sd
liệu khi cần kiểm tra các cấp pp của một người dùng cụ thể.
TH - HT