避免在SQL Server中的表和SP上使用alter和drop命令

时间:2013-05-02 04:38:58

标签: sql sql-server-2008 tsql

我在SQL Server中有tableSP。我想在表和SP上添加Permissions,没有人可以更改表的结构和SP的逻辑。有没有办法指定这种类型的权限。任何触发器都可以避免dropalter命令,或者执行此操作的任何其他方法。 在此先感谢。

3 个答案:

答案 0 :(得分:2)

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

不要将其视为不允许某些操作,而应考虑 允许的操作(请参阅Principle of Least Privilege)。

答案 1 :(得分:1)

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

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

  3. 在您的安全表格上授予权限
  4. 使用 - GRANT EXECUTE ON <SP Name> TO <Username>

  5. 授予您的安全存储过程

    如需进一步了解权限,请在Google上进行一些搜索。

答案 2 :(得分: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