2010年12月17日

分组汇总 with rollup和with cube和compute by 和排名函数

retmxls-- 商品销售明细表

rq--日期

spid--商品信息

sshje--每笔销售记录的金额

select spid,rq, sum(sshje) from retmxls group by rq,spid with ROLLUP order by spid

根据group by 后的第一个字段进行分组,我这里的是rq,那就是同日期的为一组,并在这一组完的最后一行插入一个空行,显示这个组的sshje 的汇总


select spid,rq, sum(sshje) from retmxls group by spid,rq with cube order by spid

根据group by 后的每一个字段进行分组,并在这一组完的最后一行插入一个空行,显示这个组的sshje 的汇总

下图的结果中有2026.6这个是2005-05-01这个日期的所有商品的汇总额,而4702.58是整个表的所有商品所

有日期的总汇总,而206.66是SPH10000002在所有天的汇总。


select spid,rq,sshje from retmxls order by rq compute sum(sshje)

对compute 后的sum字段进行汇总,返回明细和一个汇总两个结果

select spid,rq,sshje from retmxls order by rq compute sum(sshje) by (rq)

 对compute 后的sum字段进行汇总,对by后的字段进行分组,返回由日期分组后的每个明细和每个汇总的多个结果

 

 

下面再说几个比较有用的排名函数(RANK ()NTILE (integer_expression)row_number() DENSE_RANK

1RANK ()

语法

RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

参数

< partition_by_clause>

FROM 子句生成的结果集划分成 RANK 函数适用的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)

< order_by_clause>

确定将 RANK 值应用于分区中的行时所基于的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。

示列:select rank () over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls结果生成以sshje分区,按spid排序的序号,返回结果同一spid序号一样,下一序号从实际行号开 始。而不是上一序号加1

也可以select rank () over(order by spid) as r,spid,sshje from retmxls

返回结果同一spid序号一样,下一序号从实际行号开 始。而不是上一序号加1

 

2NTILE (integer_expression)

语法

NTILE (integer_expression)    OVER ( [ <partition_by_clause> ] < order_by_clause > )

参数

integer_expression

一个正整数常量表达式,用于指定每个分区必须被划分成的组数。

integer_expression 的类型可以为 int bigint

 

<partition_by_clause>

FROM 子句生成的结果集划分成 RANK 函数适用的分区。

< order_by_clause>

确定 NTILE 值分配到分区中各行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。

示列:select NTILE (4) over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls

根据sshje进行分区,按照spid进行排序,把每个分区分成4

也可以select NTILE (4) over(order by spid) as r,spid,sshje from retmxls

将整个结果分成四份

3DENSE_RANK ( )  

语法

 

DENSE_RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

参数

< partition_by_clause>

FROM 子句生成的结果集划分为数个应用 DENSE_RANK 函数的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)

< order_by_clause>

确定将 DENSE_RANK 值应用于分区中各行的顺序。整数不能表示排名函数中使用的 <order_by_clause> 中的列。

示列:select DENSE_RANK() over( order by spid) as r,spid,sshje from retmxls

返回结果同NTILE的区别是他的下一区的序号是上一 区的数值加1而不是实际的行数。

select DENSE_RANK() over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls

生成结果根据sshje分区,spid排序,生成序号,序号是连续的顺序

4row_number()

语法

 

ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

参数

<partition_by_clause>

FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。

示列:select row_number() over(order by spid) as r,spid,sshje from retmxls

生成结果,以spid排序,生成连续的序号。和标识种 子类似

select row_number() over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls

生成以sshje分区的序号,每个分区从1开始

posted @ 2010-12-17 15:26 奈何倾城 阅读(258) 评论(0) 编辑

Datedif函数

DateBase

工龄计算公式,产生的结果为“年,月”,需注意,日期格式为 “2009-5-10”“yyyy-mm-dd”

公式如下

=DATEDIF(D3,TODAY(),"Y")&" 年"&MOD(DATEDIF(D3,TODAY(),"M"),12)&"月"

datedif是一个十分方便的函数,可以计算两日期之间的天数、月数和年数
Datedif(start_date,end_date,unit)只是Excel为了沿袭Lotus123的一个 函数,属于隐藏函数
语法
DATEDIF(start_date,end_date,unit)
Start_date 为一个日期,它代表时间段内的第一个日期或起始日期
End_date 为一个日期,它代表时间段内的最后一个日期或结束日期。
Unit 为所需信息的返回类型。

Unit 返回
"Y" 时间段中的整年数。
"M" 时间段中的整月数。
"D" 时间段中的天数。
"MD" start_date 与 end_date 日期中天数的差。忽略日期中的月和年。
"YM" start_date 与 end_date 日期中月数的差。忽略日期中的日和年。
"YD" start_date 与 end_date 日期中天数的差。忽略日期中的年
注意:start_date参数必须要比end_date参数早,否则函数返回错误!

posted @ 2010-12-17 15:12 奈何倾城 阅读(488) 评论(0) 编辑

2010年9月14日

使用web.xml方式加载 Spring时,获取Spring context的两种方式:

1、servlet方式加载时:

【web .xml】

Xml代码

代码
 <servlet>  
         
<servlet-name>dispatcherServlet</servlet-name>  
         
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
         
<init-param>  
             
<param-name>contextConfigLocation</param-name>  
             
<param-value>/WEB-INF/applicationContext</param-value>  
         
</init-param>  
 
</servlet>  

【jsp/servlet】

Java代码

代码
 ServletContext context = getServletContext();    
 XmlWebApplicationContext applicationContext 
= (XmlWebApplicationContext)   
   
   
 context.getAttribute(
"org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet");   
   
   
 DataSource dataSource
=(DataSource)applicationContext.getBean("dataSource");  


2、listener方式加载时:

【web .xml】

Xml代码 

代码
 <context-param>   
  
<param-name>contextConfigLocation</param-name>   
   
<param-value>/WEB-INF/applicationContext</param-value>   
  
</context-param>   
   
 
<listener>   
   
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
 
</listener> 

Java代码

代码
 ServletContext context = getServletContext();   
   
       
   WebApplicationContext applicationContext  
= WebApplicationContextUtils   
     .getWebApplicationContext(context);   
       
  
 
 DataSource dataSource
=(DataSource)applicationContext.getBean("dataSource");


 

 

 

 

posted @ 2010-09-14 13:34 奈何倾城 阅读(232) 评论(0) 编辑

web.xml 中的listener、 filter、servlet 加载顺序及其详解(1)

摘要: 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己 也就不重复造轮子了,只是略加点了自己的修饰。 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:listener -> filte...阅读全文

posted @ 2010-09-14 13:26 奈何倾城 阅读(968) 评论(0) 编辑

2010年9月6日

利用HttpClient进行http文件上传

1. java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException 的解决办法
用cacuts做单元测试servlet时候总报这个错误,原来是bin文件缺少了要一个包commons-codec-1.x.jar

网络编程HttpClient 要一个包commons-codec-1.x.jar
HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址http://commons.apache.org/downloads/download_codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中

commons-codec-1.4-bin.zip

 

应用程序部分:

注意:要载入commons-httpclient-3.1.jar commons-codec.jar commons-logging.jar这三个包

import java.io.File;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;

public class Hclient
{
public static void main(String args[])
{
   String targetURL = null;// TODO 指定URL
   File targetFile = null;// TODO 指定上传文件
  
   targetFile = new File("1.mp3");
   targetURL = "http://localhost:8080/test/tt"; //servleturl
   PostMethod filePost = new PostMethod(targetURL);  //若没有commons-codec-1.4-bin.zip, 这里将会出错
  
   try
   {

    //通过以下方法可以模拟页面参数提交
    //filePost.setParameter("name", "中文");
    //filePost.setParameter("pass", "1234");

   Part[] parts = { new FilePart(targetFile.getName(), targetFile) };
    filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));
    HttpClient client = new HttpClient();
    client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
    int status = client.executeMethod(filePost);
    if (status == HttpStatus.SC_OK)
    {
     System.out.println("上传成功");
     // 上传成功
    }
    else
    {
     System.out.println("上传失败");
     // 上传失败
    }
   }
   catch (Exception ex)
   {
    ex.printStackTrace();
   }
   finally
   {
    filePost.releaseConnection();
   }
}
}

 

servlet部分:

注意:需求载入commons-fileupload-1.2.1.jar commons-io.jar这两个包

package servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class TestServlets extends HttpServlet
{
private String uploadPath = "D:\\temp"; // 上传文件的目录
    private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录
    File tempPathFile;
   
    public void init() throws ServletException {
        File uploadFile = new File(uploadPath);
        if (!uploadFile.exists()) {
            uploadFile.mkdirs();
        }
        File tempPathFile = new File(tempPath);
         if (!tempPathFile.exists()) {
            tempPathFile.mkdirs();
        }
     }


public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
   try
   {
    // Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // Set factory constraints
    factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
    factory.setRepository(tempPathFile);// 设置缓冲区目录
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // Set overall request size constraint
    upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
    List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
    Iterator<FileItem> i = items.iterator();
    while (i.hasNext())
    {
     FileItem fi = (FileItem) i.next();
     String fileName = fi.getName();
     if (fileName != null)
     {
      File fullFile = new File(fi.getName());
      File savedFile = new File(uploadPath, fullFile.getName());
      fi.write(savedFile);
     }
    }
    System.out.print("upload succeed");
   }
   catch (Exception e)
   {
    System.out.println(e.getMessage());
    // 可以跳转出错页面
    e.printStackTrace();
   }
}
}

 

在web.xml中添加映射,就可以实现应用程序上传文件到servlet的功能了。

下面是一个例子的war文件:

fileUpload.zip

解压之后会先得到一个war,密码FileUpload123

 

posted @ 2010-09-06 15:56 奈何倾城 阅读(1729) 评论(1) 编辑

2010年9月3日

安装Eclipse的Tomcat插件

http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV321.zip

下载解压后文件夹名是: com.sysdeo.eclipse.tomcat_3.2.1
将其放到c:\eclipse\plugins

重启Eclipse,去Windows --> preference中配置一下即可

posted @ 2010-09-03 11:33 奈何倾城 阅读(40) 评论(0) 编辑

2010年8月26日

Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)

摘要:【目的】了解数据库中角色(Role)的概念和用处。【方法】用李老板的公司发展中碰 到的问题例证角色的重要性【结论】角色在用户越多的情况下越能凸显出它的作用。

3.1 深入了解架构(Schema)

      在进入李老板的故事之前,让我们先对Sql Server2005中的架构做一个更深入的了解。

      用户(User)和架构(Schema)的关系

 

  • 一个架构有且只有一个所有者Owner。
  • 一个用户可以拥有多个架构。

 

      这跟第二节中介绍的货架权限清单有所出入,第二节中的例子是多对多的关系,而实际Sql Server是采用一对多的 关系。这反而比较像是银行账户。一个人可以有多个存折,但是一个存折只有一个用户。

 

  • 创建一个用户,系统将自动创建一个同名的架构。
  • 创建一个架构必须指定所有者,否则将默认为当前登陆用户。
  • 表属于不同的架构也不能重名。
  • 删除一个用户时,架构也会被删除?

      架构 (Schema)相关的SQL

      创建架构:

 

     CREATE SCHEMA [SchemaName] AUTHORIZATION [User]

 

      更改架构的所有者

      更改架构:

      ALTER SCHEMA schema_name TRANSFER securable_name

     

      更改所有者:

 

      EXEC dbo.sp_changedbowner @loginame = N'" + NewUsrName + "', @map = false

 

      删除架构:

 

      DROP    SCHEMA [SchemaName] 

      数据库设计与架构

      架构的目的应该在于在同一数据库中提供一种 隔离机制。按照这种思路,以最典型的产供销结构,我们可以这样设计一个数据库MyDatabase:

 


用户 架构 表全称
生产者 生产 表1 生产.表1
供应者 供应 表2 供应.表2
销售者 销售 表3 销售.表3

      

      这样生产者登陆以后只能操作表1,供应者登陆以后只能操作表2...隔离效果非 常好。但是,如果总经理想要查看一个产供销的综合报表该如何办呢?在这样的设计下,是根本做不到的。所以我们目前看到的实际情况是,基本上一个数据库只用 一个架构和一个用户登陆。

 

用户 架构 表全称
MyUser MySchema 表1 MySchema.表1


表2 MySchema.表2


表3 MySchema.表3

 

      这下总经理要看报表是没问题了,但是这样架构就形同虚设了。这也是为什么大家搞不清楚架构和用户的关系的原因。假如一个架构可以有多个拥有者,那么就可 以彻底解决这个问题。

      有人要说了,但是好像我用dbo登陆以后,是可以操作不同架构的表啊,这是为什么呢?那是因为上面的讨论是建立在没有角色的基础上的,要说清楚角色的问 题,我们还是要回到李老板的故事。

3.2 人多不好管

1.大量的重复

2.工作调动

3.3 所有权与经营权

3.4 DB Role与App Role

3.5 数据库设计与角色

posted @ 2010-08-26 14:05 奈何倾城 阅读(327) 评论(0) 编辑

Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(二)

在第一节中,我们了解了架构的意义。在第二节的开始,我们暂时 忘记架构这个东西。我们假设我们的数据库只有数据库对象。

      李老板开了一个小公司,公司有个仓库,堆放了一些货物,由于仓库小,为了节约成本,这个仓库根本没有锁。只要知道仓库在哪里,就可以去取货。这种情况对 应数据库来说,就是只要我知道数据库名和表名,我就可以对它进行操作。这对程序员来说当然是最方便了。这就是数据库的第一阶段:无权限管 理阶段。假如大家用过Win3.X,那它们基本就是无权限管理阶段。这下小偷就爽翻了。

      最近仓库里的东西老是不翼而飞。李老板才明白,就算是员工都是自觉的,但是别的人也可以拿走里面的货物,怎么办呢?老板一咬牙,花一百块钱买了一把锁! 并且只给少数几个人配钥匙。这下东西被别的公司的人拿走的情况基本杜绝了。对于数据库来说,相当于把人分成了两种,一种授权用户,一种未授权用户。这时, 数据库就有了用户的概念,但是它只有一个用户,就是有钥匙的人,它只对有钥匙的人开放。这就是数据库权限管理的第二阶段:上锁阶段或者单 用户管理阶段。


      好景不长,老板发现仓库 的东西还是经常少。明明都是有钥匙的人才能进去呀。但是,谁拿了多少,根本没办法查出来。老板猜测原因有二:一,有些人拿了不该拿的东西。二,有些人偷偷 的去配了钥匙。老板一咬牙,没收所有的钥匙。花800块一个月雇个仓库管理员,每个进仓库拿东西的人都要登记。李老板还给给仓库管理员一个清单,谁可以拿 什么东西,清单如下:

姓名

货物1

货物2

货物3

货物4

货物5

张三

Y

Y

N

N

N

李四

Y

Y

Y

N

N

王五

Y

Y

Y

Y

Y

赵六

N

Y

Y

Y

Y

      这时的管理上了一个新台阶,称为用户-权限 管理阶段。公司再也没发生丢东西的现象。老板非常得意自己英明的决定。这就非常类似windows现在的用户权限管理了。

 

      也许有人细心的发现,你说的不对,windows权限管理中有角色呀!没错,为什么要有角色呢?没有角色不是照样不丢东西吗?这个问题稍后再谈。

      话说过了一年,李老板的生意越做越大,仓库里的东西也越来越多,最近张三反应,去仓库取货老是要排队,而且经常要等很久才能取到货,李老板心想,取货的 人一共就这几个人,还要排队,岂有此理!把仓库保管员叫过来!保管员早有准备,递给李老板一份最新的清单:

 

姓名

货物1

货物2

货物3

货物......

货物1000

张三

Y

Y

N

N

N

李四

Y

Y

Y

N

N

王五

Y

Y

Y

Y

Y

赵六

N

Y

Y

Y

Y

      每次来一个人取货,保管员都要根据这张清单对一千个货物,幸亏取货的人少,如果再多几个人的话,估计就要在仓库门口打架了。李老板又开始琢磨了。现在东 西是不会丢了,但是每次取货慢成这样,等我货再多到一万种,我这生意还能做吗?该怎么才能提高仓库管理员的效率呢?这时仓库管理员早看出李老板的心思,色 咪咪看着李老板着说:“老板,再招一个管理员吧,我老婆刚好生完孩子在家里待业。。。”。李老板一听就火了:你当招人不用花钱啊!有了!我买5个货架就搞 定了!过两天我告诉你新的管理办法,你老婆还是在家多休息几天吧。

      过了几天,老板把5个货架采购回来,放进仓库,然后给管理员一份管理手册。新的管理手册如下:

手册第一页:货架权限清单

姓名

货架1

货架2

货架3

货架4

货架5

张三

Y

Y

N

N

N

李四

Y

Y

Y

N

N

王五

Y

Y

Y

Y

Y

赵六

N

Y

Y

Y

Y

 

 

 

手册第二页:1号货架货物清单

货物1

货物2

货物3

货物4

货物.......

货架190

 手册第三页:2货架货物清单 

货物191

货物192

货物193

货物194

货物.......

货架390

 第四页,第五页省略

      每次货物入库的时候,根据货架货物清单放到相应的货架上,然后贴上标签。出库的时候哦只要看货架号码就可以啦。

      看到这里,也许有人恍然大悟,这不就是第一节讲的“架构Schema”吗?没错,现在我们终于知道,架构概念的引入就是为了解决数据库对象太多不好管理 的缺点。到现在为止,我们的数据库管理就变成了用户-架构-数据库对象的模式了。

      在sql server2000中,用户和架构是不分离的,到了2005才分离。其实2000中的用户和架构概念就是给张三、李四分配固定的货架。这是一种更简单的 管理方法。

姓名

张三的货架

李四的货架

王五的货架

赵六的货架

...的货架

张三

Y

-

-

-

-

李四

-

Y

-

-

-

王五

-

-

Y

-

-

赵六

-

-

-

Y

-

       在李老板的英明领导下,他的小公司不断壮大,人数增加到几十人,张三李四等元老级人物还担任了不同项目部门的主管。但是随着公司的发展,新的麻烦又来考验 李老板的智商了,到底还会发生什么危机的情况呢?请看第三节。角色。

posted @ 2010-08-26 14:04 奈何倾城 阅读(289) 评论(1) 编辑

Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)一

我相信很多人接触这些概念的时候一头雾水。要把这些概念理清楚真不是件容易的事,哪像原始社会,只要能分清楚什么能吃什么不能吃就行了。

但是我始终坚信,每一个概念的产生必然是因为碰到了无法解决的问题。换句话说,如果没有它,必然会导致某些问题难以解决。所以我想从这个角度切入, 希望能把这几个复杂而暧昧的多角关系从最实用的角度来阐述清楚。

在问题的最初,我们假定的数据库什么都没有。

数据库对象。首先,数据库对象是比较容易懂的。所有的表,视图,存储过程,触发器都称为数据库对象。

我们可以拿一个网站来做类比。一个网站包含很多的网页,图片,脚本文件,我们姑且称它为网站对象。

显然,我们不可能把所有的网站对象都放到一个文件夹下面,同样道理,数据库对象也不可能象煮饺子一样就在数据库里这么一锅出。对于网站,我们通常会 把不同模块的文件放在不同的子文件夹下,那么谁是存放数据库对象的文件夹呢?答案就是:架构(Schema).

架构(Schema)。微软的官方说明(MSDN): "数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器",详细参考http://technet.microsoft.com/zh-cn/library/ms190387.aspx. 我们知道,在JAVA中,命名空间名其实就是文件夹名。因此我们非常明确一点:一个对象只能属于一个架构,就像一个文件只能存放于一个文件夹中一样。与文 件夹不同的是,架构是不能嵌套的,如此而已。因此,我们要访问一个数据库对象的时候,通常应该是引用它的全名"架构名. 对象名",这 点非常类似C#。

问:为什么有的时候写select * from tablename也可以执行呢?

答:这是因为default schema.当只写tablename时,Sql Server会自动加上当前登录用户的default schema。

如果此表不属于当前登录用户的default schema,将会提示无效的对象名。

加上shcema以后成功。

不过我们也可以更改当前用户的default schema,这时就可以不用加前缀了。

ALTER USER dbo WITH DEFAULT_SCHEMA =emdbuser;
当然,我们也可以改变此表的schema,相当于把这个表放到另一个文件夹,从 emdbuser放到dbo中。

Code
alter schema dbo TRANSFER emdbuser.Borrower

以上两种作法在真实项目中都不应该作为解决方案,因为它改变了原来的设 置。我们最希望的是,即使我们以dbo登陆,我们也可以伪装成emdbuser来操作数据库对象,伪装完了还能切换回来。在Sql Server中,刚好有这样的语句实现这个功能。

Code
EXECUTE AS USER = 'emdbuser';

这种机制被称为“上下文切换”,操作完以后,可以实用REVERT命令 切换回来。(.NET中也有类似的机制,它们有共同的一个名称叫做Impersonate,角色扮演。)

详细解释参照 MSDNhttp://msdn.microsoft.com/zh-cn/library/bb153640(SQL.90).aspx

问:如何根据表名获取一个表的Schema呢?

答:可以参照以下SQL语句从sys.objects视图和 sys.schemas视图中获取。

Code
select sys.objects.name,
sys.schemas.name
from sys.objects,
sys.schemas
where sys.objects.type='U'
and sys.objects.schema_id=sys.schemas.schema_id

结论:架构就是数据库对象的容器。数据库对象是饮料,架构就是杯子,谁 拿杯子喝水呢?当然是用户,那么是不是一个用户只能用一个杯子,一个杯子是不是从一而终,只能给一个人用呢?。请看第二节。

posted @ 2010-08-26 14:00 奈何倾城 阅读(150) 评论(0) 编辑

JMS基础教程

JMS基础教程下载

posted @ 2010-08-26 11:20 奈何倾城 阅读(50) 评论(0) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:奈何倾城
园龄:4年1个月
粉丝:0
关注:1

搜索

 
 

常用链接

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜