我在 SQL Server 中有一个table
和一个。SP
我想Permissions
在表格和 SP 上添加任何人都无法更改表格结构和 SP 逻辑的内容。有没有办法指定这种类型的权限。drop
任何避免和命令的触发器alter
,或任何其他方式来执行此操作。提前致谢。
问问题
130 次
3 回答
2
您需要创建和使用一个单独的用户,该用户仅具有您明确允许的权限(例如GRANT SELECT
,来自表或GRANT EXECUTE
存储过程)。
与其将其视为不允许某些操作,不如考虑允许哪些操作(请参阅最小特权原则)。
于 2013-05-02T04:44:51.707 回答
1
是的,这是可能的,但不使用约束。约束是一种业务规则类型的验证,这里是您关于对象权限的问题,所以现在很明显,您需要为特定用户定义对象权限。如果您想保护您的表和存储过程,请按照此步骤操作。
- 创建一个具有特定数据库/对象权限的新用户/登录名。
使用 - 在您的安全表上授予授权 -
GRANT SELECT ON <TableName> TO <Username>
使用 - 授予您的安全存储过程的授权 -
GRANT EXECUTE ON <SP Name> TO <Username>
有关许可的更多信息,请在 Google 上进行一些搜索。
于 2013-05-02T05:02:20.610 回答
1
强烈建议您管理对象的权限。但是,如果您无法控制权限,请考虑设置数据库 DDL 触发器以至少记录事件。
create table AuditTable
(
event_type varchar(max) not null
, tsql_command varchar(max) not null
, modified_by varchar(128) not null default (current_user)
, modified_time datetime not null default (getdate())
)
go
create trigger log_database_level_event
on database
for ddl_database_level_events
as
insert AuditTable
(
event_type
, tsql_command
)
values
(
eventdata().value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(max)')
, eventdata().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)')
)
go
create user tester without login
go
execute as user = 'tester'
go
create proc test_proc
as
select @@version
go
alter proc test_proc
as
select 1
go
revert
go
select * from AuditTable
go
于 2013-05-02T05:41:35.540 回答