剛測了個例子給樓主參照,按自己情況更改/* 創建角色 */ USE [Test] GO CREATE ROLE [AppSelectRole] GO use [Test] GO GRANT SELECT TO [AppSelectRole] GO GRANT CREATE TABLE TO [AppSelectRole] GO USE [Test] GO CREATE SCHEMA [UserTest] AUTHORIZATION [AppSelectRole] GO/* 創建登陸用戶 */ USE [master] GO CREATE LOGIN [TestUser] WITH PASSWORD=N'1', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO USE [Test] GO CREATE USER [TestUser] FOR LOGIN [TestUser] GO USE [Test] GO EXEC sp_addrolemember N'AppSelectRole', N'TestUser' GO/* 測試 */ USE Test GO EXECUTE AS LOGIN='TestUser' GO CREATE TABLE userTest.t2(ID int) --OK go DROP TABLE userTest.t2 --OK go SELECT * FROM dbo.t --OK go DROP TABLE dbo.t --Error /* 訊息 3701,層級 14,狀態 20,行 1 無法 卸除 資料表 'T',因為它不存在或您沒有權限。*/ GO REVERT
GO
GRANT SELECT TO [角色]
GO
测试了一下,可以通过。 具体的过程不是很明白,还请roy点拨一下。
創建角色,有select /create table--針對DB的
給用戶或角色指定個結構描述就行了
創建角色
*/
USE [Test]
GO
CREATE ROLE [AppSelectRole]
GO
use [Test]
GO
GRANT SELECT TO [AppSelectRole]
GO
GRANT CREATE TABLE TO [AppSelectRole]
GO
USE [Test]
GO
CREATE SCHEMA [UserTest] AUTHORIZATION [AppSelectRole]
GO/*
創建登陸用戶
*/
USE [master]
GO
CREATE LOGIN [TestUser] WITH PASSWORD=N'1', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [Test]
GO
CREATE USER [TestUser] FOR LOGIN [TestUser]
GO
USE [Test]
GO
EXEC sp_addrolemember N'AppSelectRole', N'TestUser'
GO/*
測試
*/
USE Test
GO
EXECUTE AS LOGIN='TestUser'
GO
CREATE TABLE userTest.t2(ID int) --OK
go
DROP TABLE userTest.t2 --OK
go
SELECT * FROM dbo.t --OK
go
DROP TABLE dbo.t --Error
/*
訊息 3701,層級 14,狀態 20,行 1
無法 卸除 資料表 'T',因為它不存在或您沒有權限。*/
GO
REVERT
感谢roy_88的测试,我这边之前通过的也是异架构的情况。同架构不知道可以实现不?应用环境:
开发人员临时性需要创建表到实际发布的数据库中,测试通过后,需要删除这些对应的表。
但不能删除之前已经存在的表,防止删除错误情况。 (主要对应开发使用)
方法很多,这里建议如果是你这样的情况你可以使用SCHEMA,SCHEMA在这里的优势显而易见,而且是2005,2008上推荐使用的方法,有多少个用户可以有多少个SCHMEA,通过它来对每个用户的表进行管理
确实在使用中之前考虑了schema的方式,可惜前台程序都写得是dbo下的代码引用。
头痛啊....
说时候,如果前台是用DBO写死的话,那如果对每个用户单独来管理表的权限,恕我直言,做梦
SQL SERVER 如果基本是对数据库的权限做处理,对表目前也只有SCHEMA,别无他法,另外LZ,有的时候任务是可以被处理的,有的不可以,无论是DBA 或 DEVELOPER, 我们对不可能的
任务应该有一个该持有的态度,当然也要说明为什么他不可能被做。祝你好运
是啊! 类似这样的话,不知我们这边跟上面的Boss沟通过多少遍,可惜过去到开发,直接被打回。
我也希望我们boss也这么强硬。 可事情压下来,还是得想办法不是。呵呵,说起来真是恼火的很...回来继续说问题。这个问题,其实我也想了,如果不基于schema来做处理的话,直接对现有对象进行逐一限制也是可以的。不知道还有别的好的解决办法没有,另外,不知道在Oracle上有没有对应此问题的解决办法。
容易出错,oracle里面基本上一个用户是一个SCHEMA,这点和SQL SERVER 有点区别,所以ORACLE
是不会出现这样的问题,因为在建立用户的时候就已经强制SCHEMA。
2 写个DDL触发器,自动grant新创建的表
GO
GRANT SELECT TO [角色]
GO测试了一下,可以通过。 具体的过程不是很明白,还请roy点拨一下。
非常感谢roy_88的帮助!
结贴了...
GO
GRANT SELECT TO [角色]
GO