SQL Server 的模拟
SQL Server 的模拟
专栏作家:Deanna Dicken 2010年2月12日
翻译: UltraDBA 2010年5月25日
原帖地址:http://www.databasejournal.com/features/mssql/article.php/3863516/SQL-Server-Impersonation.htm
介绍
SQL Server 的模拟,或上下文切换,是一种方式,允许当前用户模拟给定用户或登录的权限,直到上
下文重置,设置回另一个用户,或会话结束。接下来,我们将讨论两种实现这项任务的机制并完成一些
实例。
SETUSER
在 SQL Server 2000 中,如果你有需要用到安全上下文切换,你只有一个选择:SETUSER。用给定的用
户名执行语句,临时设置允许提供账户执行的权限。多个调用能够被使用,安全上下文切换通过调用不
带用户名的 SETUSER 语句重置回原来的上下文环境。
许可
与联机帮助相反的是,一个账号想调用 SETUSER 必须拥有 sysadmin 服务器角色。联机帮助错误的描
述用户拥有 dbo 权限也能利用这个语句,然后这是不行的。
示例
下面的例子展示了安全上下文切换从当前登录账号 adminacct,切换到一个 SQL 登录,再到另一个
SQL 登录,然后切换回来。注意,安全上下文是通过执行不带用户名的 SETUSER 语句切换回安全上下
文到当前登录账号。
SERTUSER 'jdoe'
SELECT SUSER_SNAME()
SERUSER 'jschmoe'
SELECT SUSER_SNAME()
SETUSER
SELECT SUSER_SNAME()
结果:
-----------------------------------
jdoe
(所影响行数为 1 行)
-----------------------------------
jschmoe
(所影响行数为 1 行)
-----------------------------------
adminacct
(所影响行数为 1 行)
在上面的示例中,要注意的是 jdoe 必须具有 sysamdin 角色的权限才能执行成功 SETUSER 'jschmoe'
命令。如果 jdoe 没有 sysadmin 权限,将抛出如下错误。
Msg 15157,Level 16,State 1,Line 3
Setuser因为如下原因失败:
数据库主体 'jschmoe' 不存在,
对应的服务器主体不存在服务器的访问,
此类型数据库主体不能被模拟,
或者你没有权限。
SETUSER 有一个可选参数 WITH NORESET,用在上面的示例中可以模拟上下文不被重置到开始的
sysadmin。再一次以 adminacct 登录,执行如下脚本。
SETUSER 'jdoe' WITH NORESET
SELECT SUSER_SNAME()
SETUSER 'jschmoe'
SELECT SUSER_SNAME()
SETUSER
SELECT SUSER_SNAME()
结果:
-----------------------------------
jdoe
(所
相关文档:
$$$为每节的开始
-------------------------------------------------------------------------------------------------------------------------------------------------
$$$ SQL中系统临时表的使用和禁忌 及 Exec(SQLScript) 的使用
以前在SQL 中写SP 时,如比较复杂时,喜欢中间使用临时表来暂存相关记录,这样的 ......
索引操作
数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书中的索引是一个词语列表,其中注明了各个词的页码。而数据库中的索引是某个表中一列或者若干列值的集合,和相应的指向表中物理标 ......
sql
中 case when 语法
sql语言中有没有类似C语言中的switch case的语句??
没有,用case when 来代替就行了.
例如,下面的语句显示中文年月
select getdate() as &n ......
--访问不同电脑上的数据库
--如果经常访问或数据量大,建议用链接服务器
--创建链接服务器
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','远程服务 ......
1,显示游标的操作
(1) 定义游标
根据查询的数据情况,在PL/SQL块的声明部分定义游标,语法为:
cursor cursor_name is select_statement;
注意:
游标必须在PL/SQL块的声明部分进行定义;
......