我试图找到答案,但这种情况似乎是独特的或不寻常的。 运行SQL 2008和2012.我们想要设置一个只能读取数据,执行存储过程并查看存储过程定义的用户(最后一位是可选的)。我们称这个用户为“servicedesk”。我还创建了一个名为“Exec_sps”的角色
存储过程应该能够插入,更新,删除,删除表。但是用户“servicedesk”根本不应该这样做。只能通过存储过程。当然,用户不应该改变程序本身。
我设法通过向角色添加执行并将用户“servicedesk”添加到此角色来创建概念验证。但是当我这样做时,用户“帮助台”总是获得更高的权限来改变存储过程,这是我们想要避免的。
所以基本上,给予用户低访问权限,用户可以执行存储过程,并且对该过程有很多权限,而无需用户继承存储过程的访问权。
可行吗?
此致
答案 0 :(得分:1)
这些要求对我来说似乎很奇怪,但这似乎在SQL 2012中有用。
以[sa]或具有固定服务器角色[sysadmin]
成员身份的登录名运行此脚本from collections import Counter
with open(mypath + '/' + i, 'r') as fileref:
wordDict = Counter( word for line in fileref for word in line.split() )
现在以登录[ServiceDesk](上面创建)连接并一次运行一个脚本命令:
CREATE LOGIN ServiceDesk
WITH PASSWORD = '123ABCdef'
USE YourDatabase
GO
CREATE USER SDUser
FOR LOGIN ServiceDesk
GO
CREATE TABLE dbo.Stooge(
ID INT IDENTITY PRIMARY KEY,
Name VARCHAR(32)
)
CREATE PROC dbo.AddStooge
@StoogeName VARCHAR(32)
AS
INSERT INTO dbo.Stooge(Name) VALUES(@StoogeName);
GO
CREATE PROC dbo.UpdateStooge
@StoogeId INT,
@NewName VARCHAR(32)
AS
UPDATE dbo.Stooge
SET Name = @NewName
WHERE ID = @StoogeId
GO
CREATE PROC dbo.DeleteStooge
@StoogeId INT
AS
DELETE FROM dbo.Stooge
WHERE ID = @StoogeId
GO
CREATE PROC dbo.DropStoogeTable
WITH EXECUTE AS OWNER
AS
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES t WHERE t.TABLE_SCHEMA = 'dbo' AND t.TABLE_NAME = 'Stooge')
DROP TABLE dbo.Stooge;
GO
ALTER ROLE db_datareader ADD MEMBER SDUser
GRANT EXECUTE ON dbo.AddStooge TO SDUser
GRANT EXECUTE ON dbo.UpdateStooge TO SDUser
GRANT EXECUTE ON dbo.DeleteStooge TO SDUser
GRANT EXECUTE ON dbo.DropStoogeTable TO SDUser