同义词创建函数

本文介绍了解决在Oracle客户端创建表触发器时遇到的ORA-04082:NEW或OLD引用不允许在表层触发器中错误的方法。通过查阅资料发现,NEW和OLD伪记录只能在行级触发器中使用。最终,通过添加FOREACH解决了问题。

还是同一个项目,在用ORACLE客户端创建某表的触发器时(与序列一起,实现自增长列),报"ORA-04082: NEW 或 OLD 引用不允许在表层触发器中",后查资料得知"new和old这两个伪记录,只能在行级触发器里用,不可以在表级触发器中使用 ",唉~之前,一直用PL/SQL,用惯了,CREATE OR REPLACE TRIGGER [triggername] BEFORE
INSERT ON ... FOR EACH 加上FOR EACH 后,问题解决.

PS:还是PL/SQL好呀!

<think> 我们首先需要理解用户意图:用户想知道如何在数据库中创建同义词(synonym)。同义词是数据库对象的一个别名,常用于简化对象访问或提供抽象层。不同数据库系统(如Oracle, SQL Server, PostgreSQL)可能有不同的实现方式。 由于用户没有指定具体的数据库系统,我们需要考虑主流数据库的实现方法。根据常见的需求,我们将重点放在Oracle和SQL Server上,因为它们是商业数据库中使用广泛的,而PostgreSQL等开源数据库也支持类似功能,但语法可能略有不同。 通过搜索,我们会发现: 1. 在Oracle中,创建同义词使用CREATE SYNONYM语句。 2. 在SQL Server中,同义词的概念从2005版本开始引入,使用CREATE SYNONYM语句。 3. 在PostgreSQL中,可以使用CREATE SYNONYM(但注意,实际上PostgreSQL并没有原生的CREATE SYNONYM,而是通过CREATE VIEW或函数等方式模拟,或者使用扩展。然而,较新版本的PostgreSQL支持CREATE SYNONYM?实际上,经过核实,PostgreSQL并不直接支持同义词,但可以通过其他方法实现类似功能。因此,我们主要介绍Oracle和SQL Server。 因此,我们计划提供两种主要数据库的创建方法,并提醒用户注意数据库系统差异。同时,我们也会简要提及其他数据库的替代方案。 按照要求,我们需要将内容组织为多个方法(步骤),每个方法间换行。由于是不同数据库系统,我们按数据库来分步骤。 注意:每个步骤不要使用“首先”、“然后”等词,而是直接描述。 另外,我们还需要在最后生成相关问题部分。 下面开始组织答案: 首先,需要明确创建同义词的基本语法和注意事项: - 创建同义词需要相应的权限(在Oracle中需要CREATE SYNONYM权限,在SQL Server中需要CREATE SYNONYM权限以及在基表上的权限)。 - 同义词可以是公共的(所有用户可用)或私有的(仅当前用户可用)。 然后,分别介绍两种数据库的创建方法: 方法一:Oracle数据库 创建同义词的通用语法: CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]synonym_name FOR [schema.]object_name [@dblink]; 示例:为scott用户下的emp表创建一个私有同义词。 CREATE SYNONYM emp_syn FOR scott.emp; 示例:创建公共同义词(需要CREATE PUBLIC SYNONYM权限): CREATE PUBLIC SYNONYM pub_emp_syn FOR scott.emp; 方法二:SQL Server数据库 创建同义词的语法: CREATE SYNONYM [schema_name.]synonym_name FOR [server_name.[database_name].[schema_name]].object_name 示例:为AdventureWorks数据库中的Person.Address表创建同义词。 CREATE SYNONYM dbo.AddressSyn FOR AdventureWorks.Person.Address; 注意:在SQL Server中,同义词是数据库级别的对象,不能跨数据库服务器(除非使用链接服务器和完整名称)。 方法三:其他数据库(如PostgreSQL)的替代方案 PostgreSQL不直接支持同义词,但可以通过以下方式模拟: - 使用视图(VIEW): CREATE VIEW synonym_name AS SELECT * FROM original_table; - 使用函数(FUNCTION)来实现对特定对象的访问。 - 使用模式(SCHEMA)和搜索路径来重命名表所在的模式。 另外,MySQL也没有直接的同义词功能,通常使用视图来模拟。 注意事项: - 创建同义词时,目标对象必须存在(除非使用OR REPLACE选项)。 - 同义词可以引用表、视图、存储过程、函数、序列等对象。 - 删除同义词使用DROP SYNONYM语句(在Oracle中,公共同义词需要DROP PUBLIC SYNONYM)。 最后,回答问题后,按照要求生成相关问题。 注意:在回答中不要出现第一人称,并且引用内容不要集中放在末尾,而是整合在回答中。 我们将按照上述思路编写答案。 </think> ### 创建同义词的方法 以下是主流数据库系统中创建同义词的操作指南: #### **Oracle 数据库** 语法: ```sql CREATE [PUBLIC] SYNONYM synonym_name FOR schema.object_name [@dblink]; ``` 示例: ```sql -- 私有同义词(仅当前用户可用) CREATE SYNONYM emp_syn FOR hr.employees; -- 公共同义词(所有用户可用) CREATE PUBLIC SYNONYM pub_emp_syn FOR hr.employees@remote_db; ``` **要求**:需 `CREATE SYNONYM` 权限,公共同义词需 `CREATE PUBLIC SYNONYM` 权限。 #### **SQL Server 数据库** 语法: ```sql CREATE SYNONYM [schema_name.]synonym_name FOR [server_name].[database_name].[schema_name].[object_name]; ``` 示例: ```sql -- 为本地表创建同义词 CREATE SYNONYM dbo.ProductSyn FOR AdventureWorks.Production.Product; -- 为远程表创建同义词 CREATE SYNONYM RemoteEmployee FOR LinkedServer.CompanyDB.HR.Employee; ``` **要求**:需对目标对象有访问权限,同义词仅限当前数据库使用。 #### **PostgreSQL 数据库** PostgreSQL 原生不支持 `CREATE SYNONYM`,但可通过以下替代方案: **视图模拟**: ```sql CREATE VIEW synonym_name AS SELECT * FROM original_schema.original_table; ``` **模式搜索路径**: ```sql -- 修改默认搜索路径 SET search_path TO new_schema, public; -- 直接通过表名访问 new_schema 的表 ``` ### 关键注意事项 1. **权限控制**: - Oracle 公共同义词需 DBA 权限。 - SQL Server 同义词需 `ALTER SCHEMA` 权限。 2. **依赖关系**: 删除原对象后,同义词会失效(需重建)。 3. **跨数据库访问**: Oracle 需数据库链接(`@dblink`),SQL Server 需配置链接服务器。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值