0

我在 SQL Server 中有一个table和一个。SP我想Permissions在表格和 SP 上添加任何人都无法更改表格结构和 SP 逻辑的内容。有没有办法指定这种类型的权限。drop任何避免和命令的触发器alter,或任何其他方式来执行此操作。提前致谢。

4

3 回答 3

2

您需要创建和使用一个单独的用户,该用户仅具有您明确允许的权限(例如GRANT SELECT,来自表或GRANT EXECUTE存储过程)。

与其将其视为不允许某些操作,不如考虑允许哪些操作请参阅最小特权原则)。

于 2013-05-02T04:44:51.707 回答
1

是的,这是可能的,但不使用约束。约束是一种业务规则类型的验证,这里是您关于对象权限的问题,所以现在很明显,您需要为特定用户定义对象权限。如果您想保护您的表和存储过程,请按照此步骤操作。

  1. 创建一个具有特定数据库/对象权限的新用户/登录名。
  2. 使用 - 在您的安全表上授予授权 -GRANT SELECT ON <TableName> TO <Username>

  3. 使用 - 授予您的安全存储过程的授权 -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 回答