了解一下NULLs怎样影响IN和EXISTS数据库教程(通用9篇)由网友“暖风迟日”投稿提供,下面小编为大家整理后的了解一下NULLs怎样影响IN和EXISTS数据库教程,希望大家能够受用!
篇1:了解一下NULLs怎样影响IN和EXISTS数据库教程
如果你的数据库设计在任何一栏中都允许NULL值的话,你需要了解一下,在你的查询语句中,不同的子句是怎样对待这一问题的,
了解一下NULLs怎样影响IN和EXISTS数据库教程
。从表面上看,可能显示出这样的情形,即SQL子句IN与EXISTS可以互换。然而,在处理NULL值时,它们的表现截然不同,而且得到的结果也很可能不同。问题源于这样一个事实,即在一个Oracle数据库中,一个NULL值意味着未知,因此,对一个NULL值的任何比较或操作也都是无效的,而任何返回NULL的测试也都被忽视了。例如,以下这些查询语句都不会返回任何行:
select 'true' from dual where 1 = null;
select 'true' from dual where 1 != null;
值1既不能说是等于NULL,也不能说是不等于NULL。只有是NULL的时候才会返回一个真正的NULL值并返回一行。
select 'true' from dual where 1 is null;
select 'true' from dual where null is null;
当你使用IN时,相当于你告诉SQL接受一个值,并将它与某个清单中使用=的每一个值或一组值进行比较。只要存在了任何NULL值,就不会返回任何行,纵使两个值都是NULL也不行。
select 'true' from dual where null in (null);
select 'true' from dual where (null,null) in ((null,null));
select 'true' from dual where (1,null) in ((1,null));
一个IN从功能上等同于=ANY子句:
select 'true' from dual where null = ANY (null);
select 'true' from dual where (null,null) = ANY ((null,null));
select 'true' from dual where (1,null) = ANY ((1,null));
当你使用一种与EXISTS等同的格式时,SQL会计算行数,却忽视子查询中的值,就算你返回NULL也一样。
select 'true' from dual where exists (select null from dual);
select 'true' from dual where exists (select 0 from dual where null is null);
从逻辑上看,IN与EXISTS是一样的,
IN子句在外部查询中比较子查询返回的值,并过滤掉行;EXISTS子句在子查询内部比较那些值并过滤掉行。在出现NULL值的情况下,作为结果而出现的那些行是相同的。
selectename from emp where empno in (select mgr from emp);
selectename from emp e where exists (select 0 from emp where mgr = e.empno);
不过,当逻辑被转变成使用NOT IN和NOT EXISTS时,问题就出现了,这两个语句会返回不同的行(第一个查询会返回0行;第二个返回意想的数据-它们是不同的查询):
selectename from emp where empno not in (select mgr from emp);
selectename from emp e where not exists (select 0 from emp where mgr =e.empno);
NOT IN子句实际上与用=比较每一个值相同,如果任何一个测试为FALSE 或NULL的话,它就会失败。例如:
select 'true' from dual where 1 not in (null,2);
select 'true' from dual where 1 != null and 1 != 2;
select 'true' from dual where (1,2) not in ((2,3),(2,null));
select 'true' from dual where (1,null) not in ((1,2),(2,3));
这些查询不会返回任何行。而第二个更值得怀疑,1!=NULL是NULL,因此对整个WHERE条件来说都是错误的。它们会这样运行:
select 'true' from dual where 1 not in (2,3);
select 'true' from dual where 1 != 2 and 1 != 3;
只要你在结果中阻止系统返回NULL,在这之前你还是可以使用NOT IN查询(同样,这些都能运行,不过我假定empno不是NULL,在我们这个案例中,这是一个很好的假设):
selectename from emp where empno not in (select mgr from emp where mgr is not null);
selectename from emp where empno not in (select nvl(mgr,0) from emp);
由于了解了IN,EXISTS,NOT IN,以及NOT EXISTS之间的差别,当一个子查询的数据中出现NULL时,你就可以避免一个非常普遍的问题了。
篇2:了解 Microsoft Access 安全性数据库教程
access|安全|安全性
简介在早期版本的 Microsoft® Access(Microsoft Access 以前)中,有关安全性的知识有时被认为是无法为任何人所掌握和应用的,您需要按顺序执行很多步骤,一旦遗漏某个步骤或者颠倒了顺序就会带来灾难性的后果。随着 Microsoft Access for Microsoft Windows® 95 的 Security Wizard 出现,以及 Microsoft Access 2000 的 Security Wizard 的不断改进,在 Access 中实现安全性已变得非常简单。但是,即使有了这些帮助,您也必须清楚自己的安全选项,并掌握在数据库中保护数据和对象的操作。否则,轻者会带来数据安全隐患,重者会将您锁在自己的数据库之外。
有很多方法可以保护您的 Access 数据库以及其中包含的数据。在本文中,我们将讨论用于保护组成数据库的各个对象(包含数据)、包含诸如窗体和报表等元素的对象以及代码(可能是数据库中最有价值的部分)的方法。本文中讨论的安全技巧只适用于 Microsoft Access 数据库 (.mdb) 文件。
需要了解的有关保护敏感数据的知识
您应该知道,有很多工具和第三方实用程序可以用于探测任何类型的数据库的密码,以及来自任何工作组信息文件的用户名和密码(本文后面将详细介绍工作组信息文件)。如果需要保护敏感数据免受非法访问,最好的安全措施就是使用计算机操作系统提供的文件级安全性和文件共享安全性。文件级安全性涉及在数据文件上设置权限。文件共享安全性涉及限制对数据文件存储位置的访问。文件共享安全性的一个示例是在存储数据文件的文件夹(位于本地计算机或网络服务器上)上设置用户权限。为此,可以将数据拆分到多个文件中,在这些文件上设置用户权限,再将这些文件放置到受保护的文件共享空间中。然后可以从具有安全设置的 Access 数据库链接到这些文件。
Access 安全性概述
以下各节介绍了几种保护 Access 数据库的方法。
加密或解密数据库
最简单(也是安全性最低)的保护方法是对数据库进行加密。加密数据库就是将数据库文件压缩,从而使某些实用程序(如字处理器)不能解读这些文件。加密一个不具有安全设置的数据库并不能保证数据库的安全,因为任何人都可以打开数据库并完全访问数据库中的所有对象。有关对数据库进行安全设置的详细内容,请参阅本文后面的使用 Security Wizard 设置 Access 数据库的安全性。
加密可以避免在以电子方式传输数据库或者将其存储在软盘、磁带或光盘上时,其他用户偶然访问数据库中的信息。然而 Jet(Access 使用的数据库引擎)使用的加密方法非常薄弱,因此绝不能用于保护敏感数据。“加密/解密数据库”命令位于“工具”菜单的“安全”子菜单中。解密数据库是对加密过程的逆运算。
使用自定义界面
另一种相对简单的保护方案是使用自定义界面代替 Access 标准界面。与加密一样,它也不能保护数据库中的对象和敏感数据的安全。通过选择“工具”菜单中的“启动”选项,您可以指定自定义的启动窗体、菜单,甚至自定义的标题和图标。还可以选择取消 Database 窗口,从而对缺乏相应技术的应用程序用户隐藏这些对象。“启动”对话框的各项功能也可以通过编程实现。有关如何从“启动”对话框设置启动选项的详细信息,请参阅 Access 帮助中的“关于启动选项”。有关如何通过编程设置启动选项的详细信息,请参阅 Access 帮助 Microsoft Visual Basic® 编辑器的“设置‘启动’选项和编码中的选项”。
设置数据库密码
您可以在数据库上设置密码,从而要求用户在访问数据和数据库对象时输入密码。
注意:使用密码保护数据库或其中的对象的安全性也称为共享级安全性。
您不能使用此选项为用户或组分配权限,因此任何掌握密码的人都可以无限制地访问所有 Access 数据和数据库对象。“设置数据库密码”命令位于“工具”菜单的“安全”子菜单中。
用户级安全性
除共享级安全性外,您还可以使用用户级安全性,它提供了最严格的访问限制,使您能够最大限度地控制数据库及其中包含的对象。这是我们所推荐的数据库保护措施的一部分(当和操作系统提供的文件级和共享级安全性结合使用时),因此我们将在本文后面对用户级安全性做详细介绍。
同样,我们也将讨论用于保护数据库中包含的 Visual Basic for Applications (VBA) 代码的各种方法。
警告:用户级安全性(在单独使用时)主要用于保护数据库中的代码和对象,以免用户不小心进行了修改或更改。如果不希望用户非法访问窗体、报表或模块中的代码,则必须将 .mdb 文件转换为 MDE 文件(本文后面将详细介绍)。要避免用户修改数据库中的查询、宏或数据访问页,唯一的方法就是将数据库文件放在一个受保护的文件共享区域中。此外,在 Access 中不可能既允许用户修改表中的数据,同时又禁止其修改表的设计或删除表。要提供这样一种功能,需要使用一个基于服务器的数据库产品,例如 Microsoft SQL Server™。设置模块密码
使用密码可以保护所有标准模块和类模块(例如窗体和报表中包含的代码)以免用户不小心修改或查看 VBA 代码。设置密码后,您只需在每次会话时输入一次密码,以便在 Visual Basic 编辑器中查看或修改代码。除查看和编辑外,在剪切、复制、粘贴、导出或删除任何模块时也都需要密码。但应该清楚的是,使用这种方法保护代码不能防止您或其他用户运行代码,也不能防止其他用户使用第三方实用程序(如 16 进制编辑器)来查看代码。要完全保护代码,必须将 .mdb 文件转换为 MDE 文件。
要为项目中的模块设置密码: 为该项目从 Visual Basic 编辑器的“工具”菜单中选择“属性”命令。 在“项目属性”对话框中,单击“保护”选项卡。 选中“查看时锁定工程”复选框并键入密码。 在“确认密码”框中,重新键入密码,然后单击“确定”。 使用 MDE 文件
通过将数据库文件转换为 MDE 文件,可以完全保护 Access 中的代码免受非法访问。将 .mdb 文件转换为 MDE 文件时,Access 将编译所有模块,删除所有可编辑的源代码,然后压缩目标数据库。原始的 .mdb 文件不会受到影响。新数据库中的 VBA 代码仍然能运行,但不能查看或编辑。数据库将继续正常工作,您仍然可以升级数据和运行报表。尤其是,将 Access 数据库保存为 MDE 文件可以防止以下操作: 在设计视图中查看、修改或创建窗体、报表或模块。 添加、删除或更改对对象库或数据库的引用。 使用 Access 或 VBA 对象模型的属性或方法更改代码 - MDE 文件不包含可编辑代码。 导入或导出窗体、报表或模块。而表、查询、数据访问页和宏可以导入非 MDE 数据库,或从中导出。
要将 .mdb 文件转换为 MDE 文件: 关闭数据库。 单击“工具”菜单中的“数据库实用工具”。 单击“生成 MDE 文件”。 在“保存数据库为 MDE”对话框中,找到 .mdb 文件,然后单击“生成 MDE”。 注意:在 Access 中创建的数据库使用默认的 Access 2000 文件格式。Access 2000 文件格式的数据库只能在 Access 2000 中转换为 MDE 格式。要在 Access 2002 中将以默认的 Access 2000 格式创建的 .mdb 文件转换为 MDE 文件,必须先将文件转换为 Access 2002 文件格式。为此,可以首先以独占方式打开数据库(要以独占方式打开数据库,请参阅本文后面的手动设置数据库密码一节)。接下来,指向“工具”菜单中的“数据库实用工具”,指向“转换数据库”,然后单击“转为 Access 2002 文件格式”。数据库即可转换为 MDE 文件。
有关将 .mdb 文件转换为 MDE 文件的更多要求,请参阅 Access 帮助中的“保护 Access 数据库中的 Visual Basic for Applications 代码”。
下面我们来看看用户级安全性。
关于 Access 用户级安全性
Access 使用 Microsoft Jet 数据库引擎来存储和检索数据库中的对象。Jet 数据库引擎使用基于工作组的安全模型(也称为用户级安全性)来判断谁可以打开数据库,并保护数据库所包含对象的安全。无论是否明确设置了数据库的安全性,用户级安全性对所有 Access 数据库始终处于打开状态。您可以通过操纵用户和组帐户的权限和成员身份来更改 Access 中的默认安全级别。下面将对此进行介绍。
无论何时启动 Access,Jet 数据库引擎都要查找工作组信息文件(默认名称为 system.mdw,也可以使用扩展名 .mdw 任意命名)。工作组信息文件包含组和用户信息(包括密码),这些信息决定了谁可以打开数据库,以及他们对数据库中的对象的权限。对单个对象的权限存储在数据库中。这样,例如,就可以赋予一个组的用户(而不是其他用户)使用特定表的权限,而赋予另一个组查看报表的权限,但不能修改报表的设计。
工作组信息文件包括内置组(Admins 和 Users)以及一个通用用户帐户 (Admin),该帐户具有管理数据库及其包含的对象的权限(无限制)。您也可以使用菜单命令(“工具”菜单中的“安全”子菜单)或者通过 VBA 代码添加新的组和用户。
注意:安装 Access 时,安装程序会自动创建工作组信息文件,并使用您指定的名称和单位信息来命名。因为这一信息通常很容易被判断出来,因而未经授权的用户很可能会创建另一个版本的工作组信息文件,从而在由该工作组信息文件定义的工作组中,为自己设定一个不可撤消的管理员帐户(Admins 组的成员)权限。为防止发生这种情况,应创建一个新的工作组信息文件,并指定唯一的工作组 ID (WID)。这样,只有知道 WID 的用户才能创建该工作组信息文件的副本。本文后面将讨论使用 User-level Security Wizard 创建新的工作组信息文件。
Admins 组不能被删除,其成员具有不可撤消的管理权限。您可以通过菜单或代码删除 Admins 组的权限,但 Admins 组的任何成员都可以重新添加权限。此外,Admins 组中必须始终至少有一个管理数据库的成员。对于没有进行安全设置的数据库,Admins 组始终包含默认的 Admin 用户帐户,它也是所有用户默认登录的帐户。
所有用户必须属于默认的 Users 组,不管他们是否还属于其他组。您可以在 VBA 中创建用户帐户,而并不将新的用户帐户添加到 Admins 组中。然而,如果不同时将该用户帐户添加到 Admins 组中,该用户将无法成功启动 Access,因为 Access 内部使用的用于管理数据库的很多表都映射到 Users 组的权限。
使用以下步骤进行 Access 数据库的安全设置: 将新用户帐户添加到 Admins 组中。该用户对数据库中的对象具有管理权限。 从 Admins 组中删除默认的 Admin 用户帐户。 从 Admin 用户和 Users 组中删除权限。 为所创建的任何自定义组分配权限。
在默认 Admin 用户帐户上设置密码会激活登录对话框,从而每次启动 Access 时都会提示用户输入用户名和密码。如果您没有在 Admin 帐户上设置密码,用户将自动作为 Admin 用户登录,无需密码,也不会出现登录对话框。
对数据库中对象的权限可以是显式的(直接分配给用户帐户)或隐式的(从用户所属的组继承),也可以是两者的结合。Access 在权限问题上使用“最少限制”规则,即用户的权限包括其显式和隐式权限的总和。例如,如果用户 A 的帐户具有限制权限,而用户 A 属于一个具有限制权限的组,同时也属于另一个具有管理(所有)权限的组,那么用户 A 将具有管理权限。有鉴于此,通常最好不要为用户帐户分配显式权限。而应创建具有不同权限的组,然后将用户分配给具有适当权限的组,这会减少数据库管理方面的麻烦。
在以下各节中,我们将展示如何通过用户界面和编程手段来保护数据库及其包含的对象。首先,我们来看看几种设置数据库密码的不同方法。
手动设置数据库密码
您可以为数据库设置密码,从而要求用户在访问数据库时输入密码。然而,一旦用户登录后,便可以不受限制地访问数据库中的数据和对象。
注意:在设置数据库密码之前,建议备份数据库并将其存储在一个安全的位置。
在设置数据库密码之前,需要以独占方式打开数据库。要以独占方式打开数据库: 如果数据库处于打开状态,关闭数据库。 单击“文件”菜单中的“打开”重新打开数据库。 在“打开”对话框中,找到数据库,单击“打开”按钮旁边的箭头,然后单击“以独占方式打开”。
要手动设置数据库密码: 在“工具”菜单中,指向“安全”,然后单击“设置数据库密码”。 在“密码”框中,键入密码。 注意:密码区分大小写。在“验证”框中,重新键入密码以确认,然后单击“确定”。
现在就设置了数据库密码。下次您或其他用户打开数据库时,会出现一个对话框要求输入密码。下面我们来看看如何通过编程设置数据库密码。
通过编程设置数据库密码
按以下语法使用关键字 ALTER DATABASE,您可以编程设置、修改或删除数据库密码。
ALTER DATABASE PASSWORD NewPassword OldPassword
在这个语句中,密码由方括号 ([]) 分隔的 String 值表示,但下述情况例外。
第一次设置数据库密码时,使用 NULL 关键字作为 ALTER DATABASE 语句中的 OldPassword 参数。要删除数据库密码,请使用 NULL 关键字作为 ALTER DATABASE 语句的 NewPassword 参数。在这些情况下,关键字 NULL 不应出现在方框中。
在使用以下过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。
请看以下第一次设置密码时的代码:
Private Function CreateDBPassword(ByVal Password As String, _ ByVal Path As String) As Boolean Dim objConn as ADODB.Connection Dim strAlterPassword as String On Error GoTo CreateDBPassword_Err ' 创建 SQL 串以初始化一个数据库密码。 strAlterPassword = “ALTER DATABASE PASSWORD [Password] NULL;” ' 打开不具有安全设置的数据库。 Set bjConn = New ADODB.Connection With objConn .Mode = adModeShareExclusive .Open “Provider=Microsoft.Jet.OLEDB.4.0;Data ” & _“Source=Path;”' 执行 SQL 语句对数据库进行安全设置。 .Execute (strAlterPassword) End With ' 清除对象。 objConn.Close Set bjConn = Nothing ' 如果成功,返回 true。 CreateDBPassword = TrueCreateDBPassword_Err: Msgbox Err.Number & “:” & Err.Description CreateDBPassword = False End Function
此过程接受用户的密码以及 .mdb 文件的路径。首先,我们声明一个变量,代表对不具有安全设置的数据库的连接,同时声明一个 String 变量以包含我们用于更改密码的 SQL 语句。下一步,我们将 strAlterPassword 设置给使用 ALTER DATABASE PASSWORD 关键字的 Jet SQL 语句。请注意,因为我们不是要替换密码,因而第二个参数被设置为 NULL。下一步,我们打开一个到该数据库的连接。要设置密码,必须以独占方式打开数据库,因此要设置 Mode 属性。然后执行 SQL 语句。您通常可以从一个数据库运行此过程,以便在一个单独的不具有安全设置的数据库中设置密码。如果一切正常,函数返回 True,
如果要更改具有安全设置的数据库的密码,首先需要使用旧密码登录数据库,然后再更改密码。以下过程显示了这一技术。
在使用以下过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。
请看以下过程:
Private Function ChangeDBPassword(ByVal OldPassword As String, _ ByVal NewPassword As String, ByVal Path As String) As Boolean Dim objConn as ADODB.Connection Dim strAlterPassword as String On Error GoTo ChangeDBPassword_Err ' 创建 SQL 串以更改数据库密码。 strAlterPassword = “ALTER DATABASE PASSWORD [NewPassword] [OldPassword];” ' 打开具有安全设置的数据库。 Set bjConn = New ADODB.Connection With objConn .Mode = adModeShareExclusive .Provider = “Microsoft.Jet.OLEDB.4.0” .Properties(“Jet OLEDB:Database Password”) = “OldPassword” .Open “Data Source=Path;” ' 执行 SQL 语句以更改密码。 .Execute (strAlterPassword) End With ' 清除对象。 objConn.Close Set bjConn = Nothing ChangeDBPassword = TrueChangeDBPassword_Err: Msgbox Err.Number & “:” & Err.Description ChangeDBPassword = False End Function
此过程与前面的子例程类似,只是在登录具有安全设置的数据库时,需要使用更改之前的旧密码。为此,针对要更改的数据库,我们设置了 Connection 对象的 Database Password 属性。这是 Connection 对象的扩展属性之一,所以我们使用了如上所示的特殊语法。要从具有安全设置的数据库中删除密码,也可以使用此过程,只需将 ALTER DATABASE 语句的第一个参数替换为 NULL 关键字即可。
下面我们来看看如何实现比在数据库中设置密码更强大的保护手段。
使用 Security Wizard 设置 Access 数据库的安全性
可以使用 Security Wizard 设置数据库的安全性。为此,请执行以下步骤: 打开要设置安全性的数据库。 在“工具”菜单中,指向“安全”,然后单击“设置安全机制向导”。将显示“设置安全机制向导”对话框。 因为我们要创建一个新的工作组信息文件,因此请确保选中此选项,然后单击“下一步”。 在“设置安全机制向导”对话框的第二个屏幕中(见图 1),为工作组信息文件键入一个新名称,或者接受默认名称。键入一个工作组 ID (WID)。WID 唯一标识了此工作组文件的 Admins 组。下一步,在相应的文本框中键入您的姓名和单位。虽然这些输入是可选的,但最好还是填入,因为只有知道这些信息的人才能重新创建工作组信息文件。
图 1:“设置安全机制向导”对话框的第二个屏幕
您也可以选择是否使用此工作组信息文件作为所有数据库的默认文件,或者只是用于这个特定的数据库。单击“创建快捷方式,打开设置了安全机制的数据库”选项,然后单击“下一步”。 在下一个屏幕中(见图 2),可以选择希望向导设置其安全机制的对象。默认情况下,向导将为所有现有对象和所有新创建的对象设置安全机制。单击“下一步”。
图 2:“设置安全机制向导”对话框的第三个屏幕
在下一个屏幕中(见图 3),您可以选择可选的具有特定权限的安全组。我们强烈建议您使用组来管理用户的访问权限,而不是赋予每个用户特定的权限。选择任何其他组帐户,然后单击“下一步”。
图 3:“设置安全机制向导”对话框的第四个屏幕
在此屏幕中(见图 4),您可以为 Users 组设置特定的权限。因为所有用户都自动成为 Users 组的成员,在此选择的任何权限都会应用于所有用户,所以最好限制该组的权限,或者保留默认设置 - 没有任何权限。单击“下一步”。
图 4:“设置安全机制向导”对话框的第五个屏幕
在下一个屏幕中(见图 5),您可以向工作组信息文件中添加用户。还可以为每个用户选择密码和个人 ID (PID)。Access 使用 PID 和帐户名为工作组标识唯一的用户。添加用户并单击“下一步”。 注意:个人标识符 (PID) 不是密码。它被加密并与名称一起创建了一个唯一的系统标识符 (SID),用于标识用户。
图 5:“设置安全机制向导”对话框的第六个屏幕
在此屏幕中(见图 6),您可以向工作组信息文件中的组添加用户。进行您的选择后单击“下一步”。
图 6:“设置安全机制向导”对话框的第七个屏幕
在最后一个屏幕中,为不具有安全设置的数据库的备份选择一个名称。保护好此原始数据库的备份是很有必要的,以防万一丢失或损坏了具有安全设置的数据库。单击“完成”。原始数据库将用 .bak 扩展名保存。 警告:当创建工作组信息文件后,Security Wizard 将创建一个报表,其中包含重新创建工作组信息文件所需的所有信息。您必须保存好此信息,以便在原始文件丢失或损坏时重新创建文件。单击“完成”后,Security Wizard 将加密数据库,然后要求您使用新的工作组信息文件重新打开进行了安全设置的数据库。
下面我们来看看几种编程使用用户和组的方法。
通过编程添加和删除用户和组
为数据库设置了安全性后,您可能需要使用用户和组。以下各节展示了其中的一些技巧。
在使用以下各节介绍的过程之前,可能需要设置对 Microsoft ADO Ext 2.5 for DDL and Security 库的引用(如果尚未设置): 在 Visual Basic 编辑器中,指向“工具”菜单中的“引用”。将显示“引用”对话框。 选中 Microsoft ADO Ext 2.5 for DDL and Security 复选框。 添加和删除用户
以下过程将创建一个新的用户帐户,然后将其追加到用于当前数据库的工作组信息文件中的默认 Users 组。
注意:要在 Access 中使用下面的示例,您需要作为 Admins 组的成员登录并打开一个数据库。在下面的过程中,您要确保工作组信息文件不包含在 strUser 中指定了其名称的用户。例如,您可以先调用 DeleteUser 子例程来确保这一点。
请看以下代码:
Private Function AddUser(ByVal strUser As String, _ ByVal strPID As String, _ Optional ByVal strPwd As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo AddUser_Err ' 实例化 Catalog 对象。 Set catDB = New ADOX.Catalog With catDB ' 使用到当前数据库的连接打开 ' Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 创建新的用户帐户。 .Users.Append strUser, strPwd, strPID ' 向默认 Users 组追加新的用户帐户。 .Groups(“Users”).Users.Append strUser End With ' 关闭 Catalog 对象。 Set catDB = Nothing AddUser = TrueAddUser_Err: Msgbox Err.Number & “:” & Err.Description AddUser = False End Function
该过程首先为 Catalog 对象声明一个变量,然后实例化该对象。
注意:Catalog 对象是 Access 数据库文件中所有对象的容器。
然后,该过程打开到当前数据库的连接,并使用来自调用过程的参数,将新用户追加到 Catalog 对象的 Users 集合中。然后新用户被追加到默认的 Users 组。Users 集合包含了在工作组信息文件中定义的数据库的所有用户。
要删除现有用户,可以使用以下过程:
Private Function DeleteUser(ByVal strUser As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo DeleteUser ' 实例化 Catalog 对象。 Set catDB = New ADOX.Catalog With catDB ' 在当前数据库中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 删除 strUser。 .Users.Delete strUser End With ' 关闭 Catalog 对象。 Set catDB = Nothing DeleteUser = TrueDeleteUser_Err: Msgbox Err.Number & “:” & Err.Description DeleteUser = FalseEnd Function
此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strUser String 参数中指定的用户。
添加和删除组
添加组的过程与添加用户的过程类似。
Private Function AddGroup(ByVal strGroup As String, _ ByVal strPID As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo AddGroup_Err Set catDB = New ADOX.Catalog With catDB ' 在当前数据库中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 创建新的组。 .Groups.Append strGroup, strPID End With ' 关闭 Catalog 对象。 Set catDB = Nothing AddGroup = TrueAddGroup_Err: Msgbox Err.Number & “:” & Err.Description AddGroup = FalseEnd Function
此过程首先实例化 Catalog 对象,然后打开一个到当前数据库的连接。接下来,通过使用来自调用过程的参数,将新组追加到 Catalog 对象的 Groups 集合。
要删除现有组,可以使用以下过程:
Private Function DeleteGroup(ByVal strGroup As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo DeleteGroup_Err Set catDB = New ADOX.Catalog With catDB ' 在当前数据库中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 删除 strGroup。 .Groups.Delete strGroup End With ' 关闭 Catalog 对象。 Set catDB = Nothing DeleteGroup = TrueDeleteGroup_Err: Msgbox Err.Number & “:” & Err.Description DeleteGroup = FalseEnd Function
此过程与前面的过程类似,只是使用了 Catalog 对象的 Delete 方法删除了在 strGroup String 参数中指定的组。
下面我们来看看如何通过编程设置对数据库对象的权限。
通过编程设置权限
要对数据库中的各种对象设置权限,可以使用 Group 或 User 对象的 SetPermissions 方法。在下面的过程中,我们首先撤消组的所有权限,然后再赋予组特定的权限。这样可以确保该组只具有我们指定的权限:
Private Function SetGroupPermissions(ByVal strGroup As String, _ ByVal strTable As String, ByVal strObjectType As String, _ ByVal strAction As String, _ ByVal strRevokeEnum As String) As Boolean Dim catDB As ADOX.Catalog On Error GoTo SetGroupPermissions_Err Set catDB = New ADOX.Catalog With catDB ' 在当前数据库中打开 Catalog 对象。 .ActiveConnection = CurrentProject.Connection ' 撤消组的所有权限。 .Groups(strGroup).SetPermissions tblTable, _strObjectType, strAction, strRevokeEnum ' 赋予组特定的权限。 .Groups(strGroup).SetPermissions tblTable, _strObjectType, strAction, _ adRightRead Or adRightInsert Or adRightUpdate End With ' 关闭 Catalog 对象。 Set catDB = Nothing SetGroupPermissions = TrueSetGroupPermissions_Err: Msgbox Err.Number & “:” & Err.Description SetGroupPermissions = False End Function
在当前数据库中打开一个 Catalog 对象后,我们使用了 Groups 集合的 SetPermissions 方法,撤消了该组对 Employees 表的所有权限。第一个参数是表的名称,第二个参数显示了对象的类型,这里是表。第三个参数指定了在设置权限时要执行的操作的类型,第四个参数是一个权限常数,指定了该组没有任何权限。我们已经撤消了该组对 Employees 表的所有权限,现在可以赋予其所希望的权限。
下一个语句的前三个参数与前一个语句中的相同。第四个参数是通过使用 Or 运算符,组合不同的权限常数所创建的一个值。这里,我们赋予了读取、插入和更新该表的权限。
要对指定类型(例如上述示例中的表)的所有新对象设置权限,请将用于赋予权限的语句中的第一个参数更改为 NULL 关键字。例如:
...catDB.Groups(strGroup).SetPermissions NULL, adPermObjTable...
小结
在本文中,我们讨论了实现 Access 数据库不同保护级别的各种方法,介绍了共享级和用户级安全性。同时还介绍了如何使用 Access Security Wizard 以及如何通过编程来实现安全设置。
篇3:怎样去宣传数据仓库?数据库教程
数据
主 题:怎样去宣传数据仓库?作 者:hem
所属论坛:数据仓库
问题点数:300
回复次数:1
人气指数:6
发表时间:-9-13 16:38:32
数据仓库是 面向主题的、集成的、随时间变化的非易失的数据集合,用于支持管理层的决
策分析,
数据仓库对历史的数据做分析,以得出所分析主题的发展趋势,来支持决策层的决策分析。用于联机分析处理。
数据库 普通关系型数据库 大多用于联机事务处理,处理当前的事务、交易。
集成的例子:
就拿一家百货公司来说, 公司有好多的分公司,每个分公司有自己的日常交易纪录数据。
有真实的详细的交易历史纪录、也有月度、年度归总数据。总公司需要了解公司的运营状
况,以决定以后如何拓展业务,了解客户购物趋势,推广新产品等系列决策。试想想,如果
每个子公司将所有的历史数据都送到总公司,请问,总公司需要多少磁盘、多少资源来存储
这些数据? 总公司要这些数据干什么?总公司不需要这些详细的数据,如果子公司根据一
定的周期归总之后在送到总公司,这样一来,数据量小了,有利于分析了,
但是,这么多子
公司里面,每个公司的数据结构定义可能不相同。需要统一数据定义。
送到总公司来的数据是比较全面的。这样一来,公司可以对用户购物趋势、购物能力等主题
做一个比较全面的分析,以发掘客户、扩大公司规模。
面向主题:
通讯公司可能只是纪录用户的应收款、预付款、通话纪录、费率。如果建立一个客户主题区
域,用来纪录用户所购买的服务、用户所在地域。这个主题区域可以帮助通讯公司预测客户
增长率、客户的地域分布、客户购买服务的倾向以增加新的服务,在那些区域出售什么通讯
产品等等的决策。
随时间变化:
上面两个例子都提到这个。百货公司的记账系统、通讯公司的记账系统都是随时间变化的最
好的例子,记账系统定期归总数据,然后将归总数据不断加到数据仓库里面来,这样数据仓
库也就是随时间变化的。
非易失性的:
一般的,追加到数据仓库里面的数据是不允许更改的,它不同于联机事务处理系统,允许修改数据库纪录。这样数据仓库的数据一般不会丢失。
数据仓库有几个要点:
集成 (抽取、转换、装载) ETL
元数据 (描述数据的数据) MetaData
主题 星型结构
数据仓库中 数据的查询是最重要的。 视图、索引是提高查询的选择。
代码库是统一、集成的前提。
篇4:了解一下面试官是怎样看穿你的
一、日常的事情流程也要游移么?
在一次收集编程员的雇用中,劈面的坐的男生从毛遂自荐到从业履历的先容都说得挺好。看起来应当没有问题,这时候口试官忽然问到:“你编程是在A环境下进行,仍是B环境下?”,他游移了一下,答复说:“在A环境下”。紧接着两个细节问题,他都是游移一下才作答。口试官立马在心里的对他有了清楚的果断:这个事情他其实不认识。
专家点评:
如许的问题,其实本意并不是是技能观察,只是从细节考量求职者对事情的认识水平。不论什么岗亭,日常事情都有它自有的流程,而且在日常事情中,每一个人城市养成本身的事情风俗。面临如许的问题,认识的人就会像泛泛事情时一样,顺口就能给出谜底,而不是考虑游移。
二、答复问题一个模板?
有这么一场让人啼笑皆非的口试。一个事情两年的密斯来招聘公关,口试官问:“你的错误谬误是什么?”她很聪慧,在以前已编好了一套说辞,先说本身性情有些暴躁,再说本身又颠末怎样的改变和方法法子来调理,终极把这个错误谬误一点点降服掉了。后来口试官问:“你在事情中碰到困难,都是怎样降服的?”她差未几依照先前的故事,又说了一遍。这让口试官有些无语,固然看起来她都答复了,但其实她没有显现本身更多的本领或特色,只是把一些“故事”在重播,不得不让人对她发生疑难,她是在故意躲避什么呢?
专家点评:
有的人在口试前,为了经由过程测试,会为本身编好一些故事,当口试官问及一些迟钝的问题时,为了避免想表露本身的问题,他的这些故事会一遍遍反复,大概是某段“履历”大概某个自以为很完美的“片断”。如许的人每每存在问题,且心里有些不自大。
三、事情事迹还要看简历回忆?
口试行将起头,从简历上看,这个密斯的资格和事情履历等各方面都点水不漏,“应当是个不错的人”。走进欢迎室,一个仪容风雅的女孩子已坐在内里等待。“请先做我先容吧”,女孩很快用简便的话语作答。“那末对你方才辞掉的那份事情,能做略微细致点说一下你的事迹环境么?”她手中握着一份简历,正想关上看,被口试官婉转的制止了,“本身的事情履历都不认识,还要看简历?”
专家点评:
就像文章开首所说,口试是一场战役。求职者身上或多或少的会存在一些问题,如果非准绳性的问题,不会有太大影响,如果是求职者本身都感触问题很大,好比:职业空缺期、试用期未到的离任等,那末他们必定会费尽心机的粉饰。在简历上会细心的频频点窜确认,但履历究竟?结果是履历,让他不看“讲稿”心里一般会一下心虚,担忧本身说错,自述上必定会暴露漏洞。
面试官如何判断一个人,是通过很多细节来判断的,所以大家以后面试的时候注意自己的言行~
篇5:怎样修改查看Oracle字符集及怎样修改字符集数据库教程
oracle
[Q]怎么样查看数据库字符集
[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集,
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符,
如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
[Q]怎么样修改字符集
[A]8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。
Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs16gbk;
篇6:服务器和客户机是怎样连接的数据库教程
2.3.1 服务器如何连接客户机
(1)出现如图2.34所示的【欢迎使用】界面,
(2)出现如图2.35所示的【监听程序配置,监听程序】界面。
(3)出现如图2.36所示的【监听程序配置,选择监听程序】界面。
(4)出现如图2.37所示的【监听程序配置,选择协议】界面。
(5)出现如图2.38所示的【监听程序配置,TCP/IP协议】界面。
(6)出现如图2.39所示的【监听程序配置,更多的监听程序】界面。
2.3.2 客户机怎样连接服务器
管理客户机的工作原理如图2.40所示,
1.【命名方法】的配置
(1)出现如图2.41所示的【欢迎使用】界面。
(2)出现如图2.42所示的【命名方法配置,请选择命名方法】界面。
Oracle 9i支持如表2.4所示的5种命名方法。
表2.4 Oracle 9i的5种命名方法
名称主要特点本地命名适合具有少量不经常更改服务的简单分布式网络目录命名通过目录服务器进行解析,适合大型网络Oracle名称(Oracle Names)通过Oracle名字服务器进行解析,适合大型网络主机命名通过【计算机名称】进行解析,适合局域网外部命名通过非Oracle命名服务进行解析,很少用(3)出现如图2.43所示的【命名方法配置,主机名】界面。。
(4)出现如图2.44所示的【命名方法配置完成】界面。
2.【本地网络服务名】的配置
(1)出现如图2.45所示的【欢迎使用】界面。
(2)出现如图2.46所示的【网络服务名配置】界面。
篇7:索引对查询条件顺序的影响数据库教程
索引|条件
原帖地址:
community.csdn.net/expert/FAQ/FAQ_Manage.asp?id=0&Topicid=3390663
环境:Sql Server +sp4
问题:
select datediff(day,'0910','20040920') --这句可以执行
--而下面这句不能执行(有时也可以执行)
--sub_para为varchar(8),错误信息是:从字符串转换为 datetime 时发生语法错误,
select * from T_SUB
where item_local_code='03004'
and datediff(day,sub_para,getdate)=29
and (sub_del_flag1)
--而且不能执行的时候,这个语句不会返回任何记录集
select * from t_sub
where item_local_code='03004'
and isDate(sub_para)=0
-------------------------------------------------------------------------
--原因,表中创建的索引影响了条件的执行顺序
--导致先执行了 datediff(day,sub_para,getdate())
--下面的测试说明了这个问题
--测试表及数据
create table tb(
item_local_code char(5),
sub_del_flag int,
sub_para varchar(10),
constraint PK_t primary key(sub_para,item_local_code)
)
insert tb select '03004',1,'-1-1'
union all select '03005',1,'2003a1-1'
go
--查询语句
select * from (
select * from tb
where item_local_code='03004'
and sub_del_flag0
and isdate(sub_para)=1
) A where datediff(day,sub_para,getdate())>29
go
--删除测试
drop table tb
/*--测试结果
item_local_code sub_del_flag sub_para
--------------- ------------ ----------
03004 1 2003-1-1
服务器: 消息 241,级别 16,状态 1,行 3
从字符串转换为 datetime 时发生语法错误,
--*/
篇8:怎样在vc、delphi中使用mysql数据库教程
怎样在vc、delphi、vb等程序中使用mysql呢(mysql odbc驱动程序的使用)?我们经常会遇到这样问题,怎样在非web程序或asp程序中使用mysql数据库呢?对于这个问题有两个解决方案:
1、使用mysql提供的api函数库,
很多有名的mysql客户端工具就是这样实现的,大名鼎鼎的winmysql工具就是这样的。这在大部分的开发工具中都可以实现。
比如vc,bcb,delphi,vb等,只要能调用第三方的api就能实现。但对程序员的要求很高,而且要熟悉一套mysql的api函数集,这不是对每个人都 很轻松的事。而且这种方法不能用于asp等程序,因为它不支持com对象。
2、第二种是使用myodbc驱动程序。
你可以到www.mysql.com下载myodbc驱动程序,然后照着下面的做就可以了 第一种选择是下载完全安装包,这种包很大,但对于我们来说有用的只有myodbc.dll这个文件,却要下载这么大的文件,不太合适。当然,如果你 很菜的话,我建议你选择这种方式,这样容易些,但不符合cfans的作风,是吧。
第二种是直接下载myodbc.dll文件,只有几百k,但不太容易使用,本人经过很久摸索才找到使用它的方法。
首先你将包解开,将myodbc.dll 文件放到windowssystem 或 winntsystem32目录下,这取决于你的系统是win9x还是winnt(win2k),你应该 知道吧。然后打开一纯文本编辑器,如editplus,notpad之类,(取决于你的喜好)将下面一段话保存为一文件,扩展名为.reg,知道了吧,这是注册表文件,不要搞错呀(不包括下面的一长串等号) 如果你用的是win2k请将第一行换成 Windows Registry Editor Version 5.00
==========================================================从下行开始
Windows Registry Editor Version 4.00
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INImyodbc driver]
“UsageCount”=dword:00000002
“Driver”=“C:\WINNT\System32\myodbc.dll”
“Setup”=“C:\WINNT\System32\myodbc.dll”
“SQLLevel”=“1”
“FileUsage”=“0”
“DriverODBCVer”=“02.50”
“ConnectFunctions”=“YYY”
“APILevel”=“1”
“CpTimeout”=“120”
[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIODBC Drivers]
“myodbc driver”=“installed”
=======================================结束于上一行
(bill.gates)就这样吧.保存后,双击刚才的文件,应该叫 xxx.reg 吧,然后选择确定,ok,搞定了,
然后你打开odbc设置程序,建一新数据源,选择myodbc驱动程序,剩下的就看你自己了。
篇9:怎样解决MySQL 5.0.16的乱码问题数据库教程
问:怎样解决MySQL 5.0.16的乱码问题?
答:MySQL 5.0.16的乱码问题可以用下面的方法解决:
< P>
1.设置phpMyAdmin
Language:Chinese simplified (zh-utf-8)
MySQL 字符集:UTF-8 Unicode (utf8)
MySQL 连接校对 gbk_chinese_ci
2.创建数据库时
整理设置成 gbk_chinese_ci
3.用SQL建立表中
ENGINE=MyISAM DEFAULT CHARSET=gbk;
ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=40 ;
4.检查表结构中
varchar(100) 的整理属性为gbk_chinese_ci
其它类型的整理属性为空,
怎样解决MySQL 5.0.16的乱码问题数据库教程
,
5.代码中加上
$db->query(“SET CHARACTER SET GBK”); Linux下需要,Windows下则不需要。
此种操作相当于Connection Character Sets and Collations
★ 调优日志切换(Tuning Log Switches)数据库教程
★ 存储过程实现分页
【了解一下NULLs怎样影响IN和EXISTS数据库教程(通用9篇)】相关文章:
检查情况错误说明材料2023-05-27
SQL数据操作基础(中级)102023-07-08
SQLSERVER语句返回表结构2022-10-31
SEO分页指南:浅谈内容分页的优点和缺点2022-12-10
perl连接access数据库自动测试脚本语言2022-05-06
单项结果验证的范文2023-07-04
签证学习计划2022-11-28
如何恢复MYSQL实体文件MYI,MYD到数据库中数据库教程2022-05-04
跟踪标记全攻略数据库教程2022-09-26
对于跨不同服务器的sql脚本执行语言的摘要数据库教程2023-08-05