请用SQL的GRANT 和REVOKE语句(加上视图机制)完成以下授权定义或存取控制功能:
发布网友
发布时间:2022-04-13 02:18
我来回答
共2个回答
热心网友
时间:2022-04-13 03:48
如何让数据库的用户,只能 SELECT 到自己 INSERT 的数据。如何让数据库的用户,只能看到自己创建的数据。
--创建测试表
-- 3个字段,1自增主键,1数据,1所有者。
CREATE TABLE B (
ID INT identity(1, 1) PRIMARY KEY,
DATA VARCHAR(10),
OWNER VARCHAR(20)
);
go
-- 视图,隐藏所有者这一列
-- 并强制只能检索 所有者 = 当前登录用户
CREATE VIEW VB AS
SELECT
ID, DATA
FROM
B
WHERE
OWNER = user;
go
-- 首先插入3条数据,模拟用户 A,B,C
INSERT INTO B
SELECT 'A', 'A' UNION ALL
SELECT 'B', 'B' UNION ALL
SELECT 'C', 'C'
go
--然后 创建触发器,确保插入数据的时候,OWNER = 当前登录用户.
CREATE TRIGGER BeforeInsertB
ON B
FOR INSERT
AS
BEGIN
UPDATE
B
SET
Owner = user
FROM
B JOIN INSERTED ON (B.id = INSERTED.ID);
END
go
-- 开始模拟自己的插入
INSERT INTO VB VALUES( 'Me' );
GO
-- 尝试检索
SELECT * FROM VB
GO
ID DATA
----------- ----------
4 Me
(1 行受影响)
只看到自己插入的数据。
-- 下面去 创建 A , B 用户。
CREATE LOGIN A
WITH PASSWORD='A',
DEFAULT_DATABASE=[Test],
DEFAULT_LANGUAGE=[简体中文],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF;
CREATE LOGIN B
WITH PASSWORD='B',
DEFAULT_DATABASE=[Test],
DEFAULT_LANGUAGE=[简体中文],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF;
CREATE USER [A]
FOR LOGIN [A];
CREATE USER [B]
FOR LOGIN [B];
-- 对 A,B 用户进行 VIEW 的授权,
GRANT
INSERT, SELECT, UPDATE
ON [Test].[dbo].[VB]
TO A;
GRANT
INSERT, SELECT, UPDATE
ON [Test].[dbo].[VB]
TO B;
GO
-- 分别以 A 用户 和 B 用户进行登录,并查询。
E:\>sqlcmd -S "localhost\SQLEXPRESS" -U A -P A
1> use test
2> select * from vb
3> go
已将数据库上下文更改为 'test'。
ID DATA
----------- ----------
1 A
(1 行受影响)
1> select * from B
2> go
消息 229,级别 14,状态 5,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
拒绝了对对象 'B' (数据库 'test',架构 'dbo')的 SELECT 权限。
E:\>sqlcmd -S "localhost\SQLEXPRESS" -U B -P B
1> use test
2> go
已将数据库上下文更改为 'test'。
1> select * from vb
2> go
ID DATA
----------- ----------
2 B
(1 行受影响)
1> select * from B
2> go
消息 229,级别 14,状态 5,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
拒绝了对对象 'B' (数据库 'test',架构 'dbo')的 SELECT 权限。
1> INSERT INTO vb VALUES ('B Only');
2> go
(1 行受影响)
1> select * FROM VB;
2> go
ID DATA
----------- ----------
2 B
5 B Only
(2 行受影响)
结果显示,A,B用户登录以后,只能看到 Owner = 自己的数据。
因为只有对 View 有权限,对原始的表没有权限,因此看不到别人的数据。
热心网友
时间:2022-04-13 05:06
user()是获取数据库当前用户,
SQL 将table 赋权给用户就是这么写了,
可以通过在企业管理器的图形界面就简单明了了追问user()=name是指当前用户的名字是和自己的相同???